Linux 0.11进程共享同一个页目录表

疑惑我很久了,今天终于有点点领悟了,前面关于我提问的 linux0.11中所有进程共享一个页目录表,而所有进程平分4G空间,每个64MB,每个应用程序编译时入口地址相同,而载入运行时,由于所有进程的产生的虚拟地址都一样,一张页目录表无法将相同的虚拟地址映射到不同的物理地址。即无法将进程空间分配到每个64M地址中。
为了解决这个问题,可以有两种方法:

(1)就是每个应用程序在编译链接时,分别预先指定入口地址为1x64m ,2X64m,3x64M…,比如程序a产生的虚拟地址为0-64M ,程序b产生的虚拟地址为64-128M ,以此类推。
这样64个程序载入运行时,就可以用同一个页目录表来映射所有进程产生的不相同的虚拟地址到不同的物理地址。

(2) 所有程序使用同样的虚拟地址,但是每个进程有自己独立的页目录表,这样。内核就可以将同样的虚拟地址映射到不同的物理地址,因为使用不同的页目录表。

说明,方式1,即采用共享页目录的方式,因为要预先为每个程序设定入口地址,且每个程序不能有超过一个示例,否则两个进程产生相同的虚拟地址,从而访问到相同的物理地址,所以这种方式是不现实的。

但是Linux 0.11就是采用了第一种方式,即所有进程共享一个页目录表,并且每个程序的入口地址都一样。它是怎么做到的呢?
linux0.11 通过每个进程的ID来设置对应的LDT段基址,每个进程可以根据LDT中段基址的不同,加上段偏移(每个进程的段偏移地址相同),让相同的虚拟地址的段地址变换为 nr*0x4000000 (nr为进程号)。这样即使所有程序连接地址都一样,也能通过进程号来设定段基址,从而产生不同的虚拟地址,不同的虚拟地址通过同一个页目录表映射是不会出问题的。(前提是每个task需要 设置对应的LDT)。

这是我的理解,不知道有没有问题。

猜你喜欢

转载自blog.csdn.net/wenshifang/article/details/52462011