|
Linux0.11 下的内存管理
【文件名】:07225@52RD_Linux011-Mem-YuanYi.rar
【格 式】:rar
【大 小】:188K
【简 介】:
1 如何在保护模式下实现对物理内存的管理
保护模式在硬件上为实现虚拟存储创造了条件,但是内存的管理还是要由软件来做。操作系统作为
资源的管理者,当然要对内存的管理就要由他来做了。
在386 保护模式下,对任何一个物理地址的访问都要通过页目录表和页表的映射机制来间接访问,
而程序提供的任何地址信息都会被当成线性地址进行映射,这就使得地址提供者不知道他所提供的线性
地址最后被映射到了哪个具体的物理地址单元。这样的措施使得用户程序不能随意地操作物理内存,提
高了系统的安全性,但是也给操作系统管理物理内存造成了障碍。而操作系统必须要了解物理内存的使
用情况才谈得上管理。
要能够在保护模式下感知物理内存,也就是说要能够避开保护模式下线性地址的影响,直接对物理
内存进行操作。如何避开呢?正如前面所说:在保护模式下对任何一个物理地址的访问都要通过对线性
地址的映射来实现。
不可能绕过这个映射机制,那只有让他对内核失效。如果让内核使用的线性地址和物理地址重合,比如:
当内核使用0x0000 1000 这个线性地址时访问到的就是物理内存中的0x00001000 单元。问题不就解决
了吗!linux0.11 中采用的正是这种方法。
在进入保护模式之前,要初始化页目录表和页表,以供在切换到保护模式之后使用,要实现内核线
性地址和物理地址的重合,必须要在这个时候在页目录表和页表上做文章。
在看代码之前首先说明几点:
由于linus 当时编写程序时使用的机器只有16M 的内存,所以程序中也只处理了16M 物理内存的
情况,而且只考虑了4G 线性空间的情况。一个页表可以寻址4M 的物理空间,所以只需要4 个页表,
一个页目录表可以寻址4G 的线性空间,所以只需要1 个页目录表。
程序将页目录表放在物理地址_pg_dir=0x0000 处,4 个页表分别放在pg0=0x1000, pg1=0x2000,
pg2=0x3000, pg3=0x4000 处
下面是最核心的几行代码:在linux/boot/head.s 中
首先对5 页内存清零
198 setup_paging:
199 movl $1024*5,%ecx /* 5 pages - pg_dir+4 page tables */
#设置填充次数ecx=1024*5
200 xorl %eax,%eax #设置填充到内存单元中的数eax=0
201 xorl %edi,%edi /* pg_dir is at 0x000 */
#设置填充的起始地址0,也是页目录表的起始位置
202 cld;rep;stosl
下面填写页目录表的页目录项
对于4 个页目录项,将属性设置为用户可读写,存在于物理内存,所以页目录项的低12 位是0000 0000
0111B
以第一个页目录项为例,$ pg0+7=0x0000 1007
表示第一个页表的物理地址是0x0000 1007&0xffff f000=0x0000 1000;
权限是0x0000 1007&0x0000 0fff=0x0000 0007
203 movl $pg0+7,_pg_dir /* set present bit/user r/w */
204 movl $pg1+7,_pg_dir+4 /* --------- " " --------- */
205 movl $pg2+7,_pg_dir+8 /* --------- " " --------- */
206 movl $pg3+7,_pg_dir+12 /* --------- " " --------- */
接着便是对页表的设置:
4 个页表×1024 个页表项×每个页表项寻址4K 物理空间:4*1024*4*1024=16M
【目 录】:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|