- 论坛徽章:
- 0
|
最近在看《深入理解LINUX内核》第三版,看到一个地方不是很理解,望高手指点!
代码如下:
ret_form_exception:
cli; missing if kernel preemption is not support
ret_from_intr:
movl $-8192, %ebp
andl %esp, %ebp
movl 0x30(%esp), %eax
movb 0x2c(%esp), %al
testl %0x00020003, %eax
jnz resum_userspace
jmp resume_kernel
从中断和异常返回时,分别走到ret_from_intr,ret_from_exception,这两者的区别是,在支持内核抢占的情况下,ret_from_exception会先执行cli关中断。
我的疑问是从异常返回时为什么要先关中断,为什么要在这个点关中断?
在网上搜了一下,比较靠谱的说法是:“后面可能发生进程切换,不允许中断嵌套,所以关中断”,但还是不理解。
异常的处理例程是在开中断的情况下执行的,所以在ret_from_exception之前,都有可能被中断抢占。
而ret_from_exception之后,resume_kernel和resume_userspace两个分支都是首先执行cli关中断的。
难道ret_from_exception之后的那条cli语句,只是为了保护上面代码中第4行到第8行的部分? |
|