zoukankan      html  css  js  c++  java
  • linux源码阅读笔记 move_to_user_mode()解析

    在linux 0.11版本源代码中,在文件linux/include/asm/system.h中有一个宏定义  move_to_user_mode()

      1 #define move_to_user_mode() 
      2 __asm__ ("movl %%esp,%%eax
    	" 
      3         "pushl $0x17
    	" 
      4         "pushl %%eax
    	" 
      5         "pushfl
    	" 
      6         "pushl $0x0f
    	" 
      7         "pushl $1f
    	" 
      8         "iret
    " 
      9         "1:	movl $0x17,%%eax
    	" 
     10         "movw %%ax,%%ds
    	" 
     11         "movw %%ax,%%es
    	" 
     12         "movw %%ax,%%fs
    	" 
     13         "movw %%ax,%%gs" 
     14         :::"ax")
    

      这个宏定义用于在内核初始化结束时“切换到”初始进程(任务0)。

      首先解释指令iret.

      iret 指令(interrupt return)中断返回,终端服务程序的最后一条指令。iret指令将推入堆栈的段地址和偏移地址弹出,使程序返回到原来中断发生的地方。它将产生以下三点效应:

    1.恢复IP(instruction pointer):(IP)←((SP)+1:(SP)),(SP)←(SP)+2

    2.恢复CS(code segment):(CS)←((SP)+1:(SP)),(SP)←(SP)+2

    3.恢复中断前的PSW(program status word),即恢复中断前的标志寄存器的状态。
    (FR)←((SP)+1:(SP)),(SP)←(SP)+2
    以上操作按顺序进行。
      当使用IRET指令返回到相同保护级别的任务时,IRET会从堆栈弹出代码段选择子及指令指针分别到CS与IP寄存器,并弹出标志寄存器内容到EFLAGS寄存器。
      当使用IRET指令返回到一个不同的保护级别时,IRET不仅会从堆栈弹出以上内容,还会弹出堆栈段选择子及堆栈指针分别到SS与SP寄存器。
      
      因此,这段程序的大概意思是先将任务0所需要的各个寄存器的值压栈,压栈后执行IRET指令,利用该中断返回指令将各个寄存器设置为我们所理想的值。
      但是,程序中压入了几个常数,0x17,0x0f,1f是什么意思呢。
      分两类,0x17,0x0f是段选择子。段选择子用于保护模式下的寻址。0-1位表示请求的特权级,0表示系统级,3表示用户级。2位用于选择全局描述符表还是局部描述符表。
      3-15位是描述符表项索引。
      1f表示将下面标号1的程序段的偏移地址入栈。
     
      
     
       
  • 相关阅读:
    【转】常用插件的使用—grunt入门指南(上)
    基于Cordova的android项目入门
    【转】隐藏元素的子元素隐藏无效
    【转】IE7以下绝对定位被某元素遮挡
    关于“No projects are found to import”的解决方法
    【转】IE6中a标签触发图片和ajax请求被abort
    JS小笔记
    mysql删除重复数据
    国内优秀的团队技术博客
    mysql中的union和order by、limit
  • 原文地址:https://www.cnblogs.com/elnino/p/4342477.html
Copyright © 2011-2022 走看看