免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2991 | 回复: 3
打印 上一主题 下一主题

[内存管理] Linux-0.11内核_段页内存管理问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-20 13:47 |只看该作者 |倒序浏览
我的疑惑是:intel 80x86 CPU在选择分页机制后,分段是如何实现的?段基址是如何获得的??
下面是我的理解:
        intel 80x86 CPU在没有采用分页机制时,是单纯的分段机制,这时的线性地址就是物理地址。此时若为新进程分配内存空间,是可以根据物理空间的使用情况分配的,此时的段基址就是实际的物理地址。
        但采用分页机制之后,是分段机制与分页机制共存,地址转换为:逻辑地址 --> 线性地址 --> 物理地址。此时分配内存不是连续的,也就是说所谓的段不是实际的物理段,只是逻辑上(线性地址空间上)的段。此时的分段机制在线性地址空间上为新进程分配段空间之后,然后又经分页机制映射到零碎的物理地址空间(即不连续的页面)。不管分段机制在线性地址空间上如何映射段空间,采取分页机制之后,都是零碎的物理空间,那么分段机制还有什么作用??
        在linux-0.11中,是内核作者(linus)直接设定好了几个段基址。若没有事先设定段基址,分配内存时由系统根据线性地址空间使用情况设置段基址,我想这也没有任何意义,而且难以实现(因为还要记录线性地址空间使用情况)。

上面说了那么多,总的就是说,在采取分页机制之后,分段机制是不是多余的??我感觉它没任何意义,且不好实现(因为还要记录线性地址空间使用情况)。



若想一起学习linux-0.11内核源码的,可以联系我,呵呵,,,e9999e@163.com

论坛徽章:
0
2 [报告]
发表于 2012-11-21 09:12 |只看该作者
现在明白了!!!!

Intel 80x86段页内存寻址机制、Linux-0.11内存管理机制
                                                                                                                       

一、Intel 80x86段页内存管理机制

1.段选择符
段选择符(段寄存器的低16位)指示着段的描述符,在段描述符中包含有定义段所用的全部信息。段选择符具体包括:
(1)索引字段:是由13位组成。利用索引字段可以从拥有8192个段描述符的段描述
符表中选出任何一个段描述符来。处理机用8(8是段描述符的字段数)乘以索引值再加上描述符的基地址(来自全局描述符寄存器,或者局部描述符寄存器)就是索引字段值。
(2)段描述符指示段字段Ti:这个字段用来说明使用的是全局描述表GDT,还是局部
描述用符表LDT。若这一位被清成0,说明选择的是全局描述符GDT,若这一位被置成1,说明当前选中了局部描述符表。
(3)请求特权级字段RPL:这个字段由两位(位1和位0)组成,所以可以表示0-3共4
个特权级。若这个字段所含的表示特权级的值比程序的特权级值小(即该字段所表示的特权级比程序的高),它就会在使用这个选择符去访问这个程序时覆盖掉这个程序的特权级。

2.80x86的段页内存寻址机制
在保护方式下,80386不仅采用扩充的存储器分段管理机制,而且提供可选的存储器分页
管理机制。这些存储管理机制由80386存储管理部件MMU实现。

(1)目标
80386有32根地址线,在保护方式下,它们都能发挥作用,所以可寻址的物理地址空间高达4G字节。在以80386及其以上处理器为CPU的PC兼容机系统中,把地址在1M以下的内存称为常规内存,把地址在1M 以上的内存称为扩展内存。
80386 还要对实现虚拟存储器提供支持。虽然与8086可寻址的1M字节物理地址空间相比,80386可寻址的物理地址空间可谓很大,但实际的微机系统不可能安装如此达的物理内存。所以,为了运行大型程序和真正实现多任务,必须采用虚拟存储器。虚拟存储器是一种软硬件结合的技术,用于提供比在计算机系统中实际可以使用的物理主存储器大得多的存储空间。这样,程序员在编写程序时不用考虑计算机中物理存储器的实际容量。  
80386还要对存放在存储器中的代码及数据的共享和保护提供支持。任务甲和任务乙并存,任务甲和任务乙必须隔离,以免相互影响。但它们又可能要共享部分代码和数据。所以,80386既要支持任务隔离,又要支持可共享代码和数据的共享,还要支持特权保护。

(2)地址空间和地址转换
保护方式下的虚拟存储器由大小可变的存储块构成,这样的存储块称为段。80386采用称为描述符表(即段表,包括GDT和IDT)来描述段的位置、大小和使用情况。虚拟存储器的地址由指示描述符的选择子和段内偏移两部分构成,这样的地址集合称为虚拟地址空间。80386支持的虚拟地址空间可达64T字节(虚拟地址空间由GDT 映射的全局地址空间和由LDT映射的局部地址空间组成。选择符的索引部分由13 个比特位表示,加上区分GDT和LDT的1 个比特位,因此Intel 80X86 CPU 共可以索引16384 个选择符。若每个段的长度都取最大值4G,则最大虚拟地址空间范围是16384 * 4G = 64T)。程序员编写程序时使用的存储地址空间是虚拟地址空间,所以,他们可认为有足够大的存储空间可供使用。
显然,只有在物理存储器中的程序才能运行,只有在物理存储器中的数据才能访问。因
此,虚拟地址空间必须映射到物理地址空间,二维的虚拟地址必须转化成一维的物理地址。由于物理地址空间远小于虚拟地址空间,所以只有虚拟地址空间中的部分可以映射到物理地址空间。由于物理存储器的大小要远小于物理地址空间,所以只有上述部分中的部分才能真正映射到物理存储器。
线性地址空间由一维的线性地址构成,线性地址空间和物理地址空间对等。线性地址32位长,线性地址空间容量为4GB。
每一个任务有一个虚拟地址(逻辑地址)空间。80386分两步实现虚拟地址(逻辑地址)空间到物理地址空间到物理地址空间的映射,也就是分两步实现虚拟地址(逻辑地址)到物理地址的转换,但第二步是可选的(即分页机制可选)。
通过描述符表(即段表,包括GDT和IDT)和描述符,分段管理机制实现虚拟地址空间到线性地址空间的映射,实现把二维的虚拟地址转换为一维的线性地址。这一步总是存在的。
分页管理机制把线性地址空间和物理地址空间分别划分为大小相同的块,这样的块称为页。通过在线性地址空间的页与物理地址空间的页建立之间建立的映射表(即页表,每个进程都可以拥有自己的页表),分页管理机制实现线性地址空间到物理地址空间的映射,实现线性地址到物理地址的转换。分页管理机制是可选的,在不采用分页管理机制时,线性地址空间就等同于物理地址空间,线性地址就等于物理地址。
分段管理机制所使用的可变大小的块,时分段管理机制比较适宜处理复杂系统的逻辑分段。存储块的大小可以根据适当的逻辑含义进行定义,而不用考虑固定大小的页所强加的人为限制。每个段可作为独立的单位处理,以简化段的保护及共享。分页机制使用的固定大小的块最适合于管理物理存储器,无论是管理内存还是外存都同样有效。分页管理机制能够有效地支持实现虚拟存储器。
段及分页这两种机制是两种不同的转换机制,是整个地址转换函数的不同的转换级。虽然两种机制都利用存储在主存储器中的转换表,但这些表具有独立的结构。事实上,段表存储在线性地址空间,而页表存储在物理地址空间。因此,段转换表可由分页机制重新进行定位而不需段机制的参与。段转换机制把虚拟地址转换为线性地址,并在线性地址中访问段转换机制的表格,而不会觉察分页机制已把线性地址转换为物理地址。类似地,分页机制对于程序产生的地址所使用的虚拟地址空间一无所知。分页机制只是直接地把线性地址转换为物理地址,并且在物理地址中访问转换表格,并不知道虚拟地址空间的存在,甚至不知道段转换机制的存在。

(3)虚拟存储器概念
        80386支持的虚拟地址空间可达64TB。虚拟地址空间由GDT 映射的全局地址空间和由LDT映射的局部地址空间组成。选择符的索引部分由13 个比特位表示,加上区分GDT和LDT的1 个比特位,因此Intel 80X86 CPU 共可以索引16384 个选择符。若每个段的长度都取最大值4GB,则最大虚拟地址空间范围是16384 * 4GB = 64TB。
虚拟存储器是一种设计技术,用于提供比在计算机系统中实际可以使用的物理主存储器大得多的存储空间。使用者会产生一种错觉,好象在程序中可以使用非常大的物理存储空间。使用虚拟存储器的好处是:一个程序可以很容易地在物理存储器容量大不一样的、配置范围很广的计算机上运行;编程人员使用虚拟存储器可以写出比任何实际配置的物理存储器都大得多的程序。虚拟存储器由存储管理机制及一个大容量的快速硬盘存储器支持。在程序运行的任何时刻,只把虚拟地址空间的一小部分映射到主存储器,其余部分则存储在磁盘上。因为只有存储在主存储器中的部分虚拟存储器可由处理器使用,这种虚拟存储技术将依赖程序内部访问存储器的局部化特性,在程序执行中只需整个虚拟存储器中的少量存储内容在主存储器中驻留。而当访问存储器的范围发生变化时,有必要把虚拟存储器的某些部分从磁盘调入主存储器,虚拟存储器的另外的部分,也能从主存储器传送回磁盘上。

3.对页表的进一步说明
在32位逻辑地址空间的分页系统中,每个页表项占用4个字节,共32位,由于每页大小为4KB,并且位于4KB边界上,故其低12位总是0,因此页表项的低12位可做他用。页表项的高20位 + 页内偏移地址(12位) = 32位,可寻址4GB地址空间。每个进程都可以拥有自己的页表,页表占用的内存空间最大为(2^20)*4B = 4MB = 1K个页面(当然实际进程的页表只是这其中的一部分,并不总是4MB,页表项数要看进程需要的内存空间的大小而定,页表只包括进程所拥有的那些页)。


二、80x86段页机制下的Linux-0.11的内存管理机制

        实际上,分段和分页在某种程度上有点沉余,因为它们都可以划分进程的物理地址空间:分段可以给每个进程分配不同的线性地址空间,而分页可以把同一线性地址空间映射到不同的物理空间。采用分页机制后,就没必要再将进程分配到不同的线性地址空间。但Linux-0.11内核通过共享页目录和线性地址分段,利用了80x86的分段机制,即采用段页机制。Linux-0.99及以后的版本中不再共享页目录,不再对线性地址分段,使每个进程都拥有4GB线性空间,逻辑地址=线性地址,巧妙的“绕过了”Intel 80x86提供的分段机制,即采用分页机制。
        Linux-0.11内核采用段页机制对内存进行管理,具体如下:
Linux-0.11内存物理地址0处开始放着一页页目录表和四页页表。这一个页目录表是所有64个进程共享的。其后的四页页表正好映射16M物理内存,是进程0的页表。以后创建进程时页表需要从主内存区申请,而页目录项直接从页目录表中取。这样进程和页目录表页存在一一对应关系,任务号为nr的进程,对应页目录的第nr*16 ~ (nr+1)*16一共16个目录项。这样1个页目录表占据1个物理页面,即4KB,每个页目录项为4字节,因此共又1K个页目录项;每个页目录项对应一页的页表,即1K个页表项,每个页表项可以映射4K的物理内存,因此共有1K*1K*4K=4G的线性空间。这4G的线性空间由64个进程共享,通过对线性地址进行分段,每个进程都有64MB的线性空间,这样每个进程都会有16个连续的页目录项。

论坛徽章:
0
3 [报告]
发表于 2012-11-26 13:29 |只看该作者
看了你写的分析文章,应该还是说明对i386硬件机制理解的 比较透彻的,我现在也在分析linux kernel的一些东东,在linux1.0基础上开始的,初期在bochs上做了一些模拟调试,遇到了很多问题,苦于没有人一些分析讨论解决问题,在论坛上提出的问题好像没有牛人鸟我,呵呵,希望能够互相学习交流,我的联系方式时wohuljl@126.com,qq是272981549

论坛徽章:
0
4 [报告]
发表于 2012-11-26 16:37 |只看该作者
也正准备入手Linux1.0......
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP