当前位置: 技术问答>linux和unix
进程在内核态执行时的cr3寄存器是什么
来源: 互联网 发布时间:2017-03-22
本文导语: 本帖最后由 lonewolfxw 于 2012-11-14 22:05:50 编辑 虚拟内存空间分为用户部分和内核部分,用户进程只能使用页表访问用户部分的虚拟地址,且使用mm_struct的pgd置cr3寄存器的值,供分页部件查找实现共线性地址到物理地址...
虚拟内存空间分为用户部分和内核部分,用户进程只能使用页表访问用户部分的虚拟地址,且使用mm_struct的pgd置cr3寄存器的值,供分页部件查找实现共线性地址到物理地址的转换。若用户进程通过系统调用切换到内核态,是否会使cr3切换到内核页表swapper_dir_pg,疑问的来源主要就是:init进程是第一个用户进程,且其页表就是swapper_dir_pg,但是在创建新进程时使用copy_mm复制mm_struct时并没有复制虚拟地址空间的内核部分的页表,那么在内核态时cpu的分页部件怎么通过线性地址转换为内核地址。
论坛等级太低,限制最多只能给100分的,希望大家帮忙
论坛等级太低,限制最多只能给100分的,希望大家帮忙
|
fork的时候copy_mm()是通过memcpy(mm, oldmm, sizeof(*mm))将父进程的mm_struct整个copy过去的,所以父子进程的内核页表的内容也是一样的
但是,当某个进程通过vmalloc()分配了一段新的非连续内存时,内核页表的变化并不是立通知内核中所有的其他进程,而只是更新了主内核页表init_mm.pgd(也就是swapper_pg_dir),当其他某个进程访问到这段新的非连续内存时,会产生page fault, 中page fault处理中检查init_mm.pgd中是否存在相应的内容,如果存在,则将主内核页表里相应的项copy到内程页表,如果不存在,内核crash.
但是,当某个进程通过vmalloc()分配了一段新的非连续内存时,内核页表的变化并不是立通知内核中所有的其他进程,而只是更新了主内核页表init_mm.pgd(也就是swapper_pg_dir),当其他某个进程访问到这段新的非连续内存时,会产生page fault, 中page fault处理中检查init_mm.pgd中是否存在相应的内容,如果存在,则将主内核页表里相应的项copy到内程页表,如果不存在,内核crash.
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。