1. 3G-4G用户空间统一映射到0-1G内核空间,由于用户程序没有权限访问内核空间,那么linux系统如果安装在512M内存上,那些应用程序还能跑得起来吗?
我是学习了好长一段时间,才“爆炸”到这个问题上的,而且这个问题对于内核的理解有很大帮助,所以拿出来分享和讨论一下:
用户态无权使用这段编号,是受内核限制,比如do_page_falut()处理用户空间的缺页异常时,如果发现虚拟地址在这个范围,就会让用户进程段错误,而硬件并没有限制只有内核指令才可以访问0-1G的实际内存。
所以用户态访问0-1G实际内存需要满足2个条件:
① 内核愿意;
② 使用0-3G区间的虚拟地址进行映射。
“用户态→内核态”伴随着2个主要切换(通过int指令完成):
① 段寄存器rpl切换
用户进程不可以直接使用“特权指令”随意修改,但可以使用内核的接口规规矩矩的修改。
② 指令跳转、堆栈切换
中断函数的地址是“固定”的,并且在内核空间(公共空间),所以从“用户程序内存镜像”跳转到“内核程序内存镜像”是没问题的,内核管理着每个用户进程的信息,从内核态返回用户态也是没问题的。
另外,这一点很容易被当作判断进程切换的标准。然而,虽然EIP、ESP的指向,也属于进程的一种环境,而且看起来进程的切换,也就是变化EIP、ESP去做另一件事,但是即使执行同一个进程,EIP、ESP也在不断变化,所以它们并不能用于判断进程的切换,哪怕执行到“别的可执行文件”加载到内存的指令。进程环境其实记录在task_struct结构,所以当前使用的task_struct结构切换,才说明进程切换了,并且与dpl切换相互独立。