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