程序13-2 linux/mm/page.s


  1 /*

  2  *  linux/mm/page.s

  3  *

  4  *  (C) 1991  Linus Torvalds

  5  */

  6

  7 /*

  8  * page.s contains the low-level page-exception code.

  9  * the real work is done in mm.c

 10  */

    /*

     * page.s程序包含底层页异常处理代码。实际工作在memory.c中完成。

     */

 11

 12 .globl _page_fault           # 声明为全局变量。将在traps.c中用于设置页异常描述符。

 13

 14 _page_fault:

 15         xchgl %eax,(%esp)    # 取出错码到eax

 16         pushl %ecx

 17         pushl %edx

 18         push %ds

 19         push %es

 20         push %fs

 21         movl $0x10,%edx      # 置内核数据段选择符。

 22         mov %dx,%ds

 23         mov %dx,%es

 24         mov %dx,%fs

 25         movl %cr2,%edx       # 取引起页面异常的线性地址。

 26         pushl %edx           # 将该线性地址和出错码压入栈中,作为将调用函数的参数。

 27         pushl %eax

 28         testl $1,%eax        # 测试页存在标志P(位0),如果不是缺页引起的异常则跳转。

 29         jne 1f

 30         call _do_no_page     # 调用缺页处理函数(mm/memory.c,365行)。

 31         jmp 2f

 32 1:      call _do_wp_page     # 调用写保护处理函数(mm/memory.c,247行)。

 33 2:      addl $8,%esp         # 丢弃压入栈的两个参数,弹出栈中寄存器并退出中断。

 34         pop %fs

 35         pop %es

 36         pop %ds

 37         popl %edx

 38         popl %ecx

 39         popl %eax

 40         iret