Linux段式管理与页式管理

内存管理有2种机制:1、段式管理;2、页式管理

在80386CPU中增加了2个寄存器:1、全局性的段描述表寄存器GDTR

                                                        2、局部性的段描述表寄存器LDTR

段寄存器的高13位用于在全局或局部描述表项中选择一个描述符;

第2为选择全局或者局部段描述寄存器;

低2位决定特权级别,一般LINUX中0表示系统状态,1表示用户状态。

每个描述表项8个字节,将段寄存器的高13位加上指定的段描述表寄存器的基地址就得到了描述表项的起始地址;

每个描述表项含有段的基地址和段的大小;而段的基地址高8位和低24位没有连在一起,这也是因为Intel刚开始的意图本来是想用24位的地址空间,后来发现不够用,所以改为了32位地址。但此时80286CPU已经发布出去了,无奈只能修修补补,以兼容80286。

       所以,段寄存器 + GDTR/LDTR = 描述表项,描述表项指定了段的基地址和段的大小;

       如果将段的基地址设为0,段的大小设置为最大,此时物理地址就与逻辑地址一致,Intel称其为平面地址。

段描述表寄存器只能在系统状态使用,用户程序不能改变GDTR和LDTR的内容

逻辑地址-->映射-->线性地址-->物理地址

连续的逻辑地址经过映射后的线性地址还是连续的

32位的线性地址:dir:10字节;page:10Byte; offset:10Byte

段式管理:逻辑地址到物理地址一步到位;

页式管理:先找到目录项,再找到页面描述符。这样做是出于空间效率的考虑,线性地址空间可以表示4G的地址空间,但一个进程很难会用到4G的空间,但数组中即使是空着的表项也占用空间,所以分成2层可以视需要来设置页表,如果目录中某项为空,就不必设置页表,从而省下存储空间。

 

       在linux内核中使用了gcc对C的扩充,所以linux内核只能用gcc编译,Linux内核与gcc平行的发展,所以每个Linux内核版本都有对应的gcc版本。

 在i386CPU中,地址为32位时,2层映射比较合理,但考虑到64位的CPU,为了通用性,页式管理设计了3层映射。对于32位地址采用2层设计,大于32位的地址采用3层设计。

对于32位的4G虚拟内存空间,最高的1G内存用于内核本身,称为“系统空间”,而较低的3G字节,用作各个进程的“用户空间”,这样理论上每个进程可以使用3G的用户空间。

虽然系统空间位于虚拟内存空间的最高部分,但对应的物理地址却是从0地址开始的。

        就我的理解,历史上先出现了段式管理,很多老式芯片都支持段式管理,后来出现了页式管理,Linux为了兼容或者通用,采用了先段式管理后页式管理的方法,现在的大多数芯片一般采用的都是页式管理,段式管理其实形同虚设。

 

 

        

 

posted @ 2018-09-30 16:12  一条水煮鱼  阅读(425)  评论(0编辑  收藏  举报