当前位置: 技术问答>linux和unix
请教一下,进程调度时在导入新进程的cr3之后,CPU是怎么区分当前正处于内核而不去使用新的页目录呢?
来源: 互联网 发布时间:2015-11-18
本文导语: 看到内核详解上说不管什么进程一旦进入内核就进入了系统空间都有相同的页面映射,内核就不用cr3吗?实在搞不明白,希望大虾详细讲解一下 | 内核当然会用cr3,在每个进程的页目录项中,...
看到内核详解上说不管什么进程一旦进入内核就进入了系统空间都有相同的页面映射,内核就不用cr3吗?实在搞不明白,希望大虾详细讲解一下
|
内核当然会用cr3,在每个进程的页目录项中,都把最后3-4G的页目录项映射到了同一物理内存空间,也就是说每个进程的页目录项中的3-4G的映像关系完全相同!!!!
所以从任何一个进程在运行时进入内核空间,无非就两种情况:
1.从系统调用进入内核态,此时内核用的就是当前进程的CR3,就是所谓的进程上下文中,内核在运行时用的是3-4G的线性空间,在MMU处理时,找到CR3,查找到此时的页目录项与页表,因为每个进程的3-4G空间所映射的物理地址完全一样,所以MMU一定能找到内核相应函数所对应的物理地址,并且任何一个进程在切换到内核空间时,只要它用的是同一个函数,其物理地址就完全一样
2.在中断发生的情况下,比如进程A在运行时,突然发生一个中断,此时由于没有进程调度,所以进入到进程A的内核态下时其CR3并没有变化,其页目录项与页目录表也没有变化,那么中断处理函数用的就完全是进程A的页表,由于内核线性地址在3-4G空间,只要内核不刻意访问用户空间,它所用到的地址就与用户空间相互隔离。假定此中断处理程序属于进程A所用的一个设备驱动,此时中断一处理完毕,退出中断,回到用户空间,并继续运行,假定此时产生时钟中断,并且重新调度到进程B,此时CR3发生了变化,所有页表采用了进程B的页表,假定上次的那个中断又到来,切换到内核态,由于其3-4G的映射完全没有变,所以内核代码进行了平稳过度,但是此时0-3G的所有页表映射与进程A不同,所以中断处理程序不能假定此时的0-3G的线性地址就是进程A的,此时它已是进程B的,这就是所谓的中断上下文,通过current宏所访问到的就不再是进程A的PCB结构了,也就不能用current宏来访问其内容,因为已经没有任何意义,除非你是想知道在任一时刻所发生的中断所处的进程上下文,这就是设备驱动程序中为何要禁止在中断处理程序中直接与使用这个设备的进程进行数据交互的原因了!!!
所以从任何一个进程在运行时进入内核空间,无非就两种情况:
1.从系统调用进入内核态,此时内核用的就是当前进程的CR3,就是所谓的进程上下文中,内核在运行时用的是3-4G的线性空间,在MMU处理时,找到CR3,查找到此时的页目录项与页表,因为每个进程的3-4G空间所映射的物理地址完全一样,所以MMU一定能找到内核相应函数所对应的物理地址,并且任何一个进程在切换到内核空间时,只要它用的是同一个函数,其物理地址就完全一样
2.在中断发生的情况下,比如进程A在运行时,突然发生一个中断,此时由于没有进程调度,所以进入到进程A的内核态下时其CR3并没有变化,其页目录项与页目录表也没有变化,那么中断处理函数用的就完全是进程A的页表,由于内核线性地址在3-4G空间,只要内核不刻意访问用户空间,它所用到的地址就与用户空间相互隔离。假定此中断处理程序属于进程A所用的一个设备驱动,此时中断一处理完毕,退出中断,回到用户空间,并继续运行,假定此时产生时钟中断,并且重新调度到进程B,此时CR3发生了变化,所有页表采用了进程B的页表,假定上次的那个中断又到来,切换到内核态,由于其3-4G的映射完全没有变,所以内核代码进行了平稳过度,但是此时0-3G的所有页表映射与进程A不同,所以中断处理程序不能假定此时的0-3G的线性地址就是进程A的,此时它已是进程B的,这就是所谓的中断上下文,通过current宏所访问到的就不再是进程A的PCB结构了,也就不能用current宏来访问其内容,因为已经没有任何意义,除非你是想知道在任一时刻所发生的中断所处的进程上下文,这就是设备驱动程序中为何要禁止在中断处理程序中直接与使用这个设备的进程进行数据交互的原因了!!!