每一个进程都有自己的页表,虚拟地址由页表映射为物理地址。
Q1:操作系统是如何确保多个进程映射到的物理地址不会冲突的?(很多人说是每个进程有自己的页表,但是最终在映射为物理地址时还是有可能冲突嘛,肯定是有一个标志位来表示物理地址已经被分配了,这个标志位在哪里?)
Q2:如果确实有一个标志位来表示物理地址已经被分配,那么当两个进程需要共享某个物理地址时是如何处理的?
Q3:内核代码是直接使用物理地址还是通过虚拟地址转换?内核代码对应的内存是否一直在内存中,不会置换到硬盘?
每一个进程都有自己的页表,虚拟地址由页表映射为物理地址。
Q1:操作系统是如何确保多个进程映射到的物理地址不会冲突的?(很多人说是每个进程有自己的页表,但是最终在映射为物理地址时还是有可能冲突嘛,肯定是有一个标志位来表示物理地址已经被分配了,这个标志位在哪里?)
Q2:如果确实有一个标志位来表示物理地址已经被分配,那么当两个进程需要共享某个物理地址时是如何处理的?
Q3:内核代码是直接使用物理地址还是通过虚拟地址转换?内核代码对应的内存是否一直在内存中,不会置换到硬盘?
1.操作系统肯定会维护物理内存的分配信息,但不会把分配信息存储在被分配物理内存的头部或者尾部,因为页式分配大小固定起始地址也固定,这种分配是非常容易的,比heap简单多了。操作系统完全可以把已分配的物理内存页的信息保存在自己的内存中,或者文件里面。每个进程有自己的页表,但页表由操作系统维护,操作系统根据自己维护的分配信息确保各进程页表之间没有冲突。
2.物理内存页是否被分配不是用标志位来表示
3.内核码是指什么?操作系统的代码?即使是操作系统的代码也会有很大一部分以进程方式运行,当然维护进程的代码应该常驻内存,cpu只认虚拟内存地址,不会直接访问物理内存,所以即使是内核代码也是使用虚拟地址。