Linux的内存管理
Linux的内存管理
刘女士zh 发表于7个月前
Linux的内存管理
  • 发表于 7个月前
  • 阅读 2
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

         Linux的进程虚拟空间为4G,内核空间为1G,用户空间为3G。在Linux的内存管理中,所有进程共享内核空间,各自拥有自己的用户空间。如图1所示

               

图1

         虽然系统空间占据了1G,但是在物理的内存中却总是从0开始,所以,系统空间到物理地址上的映射是简单的线性映射,0xC0000000是两者之间的偏移量。   即:物理地址=虚拟地址+偏移量。

        下面讲讲用户空间到物理地址空间上的映射。

一、分段管理

        在分段管理中,Intel在8086 CPU系列中设置了4个段寄存器:CS、DS、SS和ES,分别用于可执行代码即指令、数据、堆栈和其他。每个段寄存器是16位,对应于地址总线的高16位。每条访内指令中的内部指令是16位,但是在送上地址总线之前CPU全部会自动的与某个寄存器中的内容相加。形成一个20位的实际地址。这样就实现了内部地址到实际地址的转换或说“映射”。------------实模式

实地址模式:8086/8088系列处理在早期的时候采用的是这种管理模式。没有地址空间的保护机制。

因为实模式的地址映射没有安全机制,所以Intel又实现了保护模式的地址映射。

保护模式保留了实模式下的4个段寄存器,并且还增加了两个段寄存器FS和GS。在保护模式下,基地址已经升级位一个包含基地址,地址长度和其他一些信息的数据结构的指针。为了防止不具备特权的用户程序通过玩弄某些诡计而改变内核和用户空间。在80386CPU中增设了两个寄存器:一个是全局性的段描述符表寄存器(GDTR)和局部性段描述符表寄存器(LDTR),分别可以用来指向存储在内存中的一个段描述符结构数组,或称段描述符表。每个段描述符为8字节。

在此基础上,段寄存器的高13位用作访问段描述符表中具体描述结构的下标。如图2所示:

13位下标 TI RPL

TI:0表示使用的是GDTR,1表示使用的是LDTR

 RPL:表示特权级别,00表示最高级别,11表示最低级别 

13位表下标:表示从8192个段描述符表项中选择一个描述符。

GDTR或LDTR中的描述符表指针和段寄存器中给出的下标结合在一起,才决定了具体的段描述符表项在内存中的什么地方,也可以理解成,将段寄存器内容的低3位屏蔽掉以后与GDTR或LDTR中的基地址相加得到描述符表项的起始地址。每个段描述表项的大小是8字节。每个描述符表项含有段的基地址和段的大小和其它一些信息。8字节段描述符表项的定义如下图所示:

二、页式存储管理结构

    linux的内存管理结构是分段和分页两个结合来实现的。因为保护模式下的分段管理的系统结构决定了分页管理的结构,所以,分页管理的线性地址是通过分段管理映射而来的。

   每页的大小为4K,一旦启用了页式存管,所有的线性地址都要经过页式映射,连GDTR和LDTR给出的段描述表项起始地址也不例外的。在页式存管中对线性地址的重新定义如下:

页面目录 页面表    页内偏移offset

    在页式存管中,又增加了一个新的寄存器CR3,用来存放页目录表项的基地址。从线性地址到物理地址的映射过层如下图1.5:

标签: Linux 内存管理
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 1
码字总数 1032
×
刘女士zh
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: