内存管理概述;
主要代码分析;
内存管理概述:linux 0.11内核,最大支持16M物理内存。如果以最大内存16M讲解内核将其分块管理分别为:
--内核区[0~end] (从物理0地址开始,存放内核代码)
--缓冲区[end~4M] (面向文件系统,为文件缓冲机制提供缓冲区,从640K~1M为显存和BIOSrom信息存放点)
--虚拟盘[4M~4.5M] (虚拟盘ramdisk是一个可选项,空间大小可以自定,但是占用主内存区)
--主内存区[4.5M~16M] (进程使用的内存区域,操作系统负责对这部分内存分配和回收管理)
内存初始化函数:
memory_end = (1 << 20) + (EXT_MEM_K << 10); // 内存大小=1Mb 字节+扩展内存(k)*1024 字节。
memory_end &= 0xfffff000; // 忽略不到4Kb(1 页)的内存数。
if (memory_end > 16 * 1024 * 1024) // 如果内存超过16Mb,则按16Mb 计。
memory_end = 16 * 1024 * 1024;
if (memory_end > 12 * 1024 * 1024) // 如果内存>12Mb,则设置缓冲区末端=4Mb
buffer_memory_end = 4 * 1024 * 1024;
else if (memory_end > 6 * 1024 * 1024) // 否则如果内存>6Mb,则设置缓冲区末端=2Mb
buffer_memory_end = 2 * 1024 * 1024;
else
buffer_memory_end = 1 * 1024 * 1024; // 否则则设置缓冲区末端=1Mb
main_memory_start = buffer_memory_end; // 主内存起始位置=缓冲区末端;
#ifdef RAMDISK // 如果定义了虚拟盘,则主内存将减少。
main_memory_start += rd_init (main_memory_start, RAMDISK * 1024); //虚拟盘大小是1K的整数倍,虚拟盘消耗主内存区空间
#endif
内存分页机制概述:
分页机制的好处
–-程序员不用老担心是否有程序所需要的实际的物理内存
–-若开启了分页机制,对任何一个物理地址的访问都要通过页目录表和页表的映射机制来间接访问,使得地址提供者不知道他所提供的线性地址最后被映射到了哪个具体的物理地址单元。这样的措施使得用户程序不能随意地操作物理内存,提高了系统的安全性
–-页具有权限和保护
分页机制的核心就是线形地址和物理地址如何转换
–-cr3 :保存页目录表的首物理地址
-–页目录表:每一条记录(4字节)保存一个页表的首物理地址,占用4k空间(一页表示4K大小空间)存放该表,共可以有1024条记录,也就是可以指示1M个页表
–-页表:每一条记录(4字节)保存一个物理页的首地址,占用4k空间(一页)存放该表,共可以有1024条记录,可以指示1024个物理页,每一个物理页为4k大小,因此一个页表可以寻址4M地址空间
线性地址转物理地址如下图:
一个页目录表可以表示1024个页表,就可以寻址4G地址空间。每个页表都占用4K空间来保存1024个页,因此全部的页表需要4M的空间来保存。大多数机器没有4G的物理内存,因此不需要产生全部的页表,如linux 0.11最大支持16M物理内存,因此一个进程只需要4个页表,占用16K空间,加上页目录表占用4K,总共20K空间来存放分页机制需要的映射表。
这几张表放在内存的哪里呢,linux 0.11的引导启动程序head.s对其进行了初始化,如图:
从图中可以看出,页目录表从物理内存首地址0开始,大小为4K字节,存放着页表的地址。紧随其后的是4张页表,每张页表4K,存放着页的地址。由此页目录表+页表=20K。
页目录表和页表中的每个结构都是相同,即每个目录表中的表项(4字节)来寻址一个页表,4字节对应的结构如图:
线性地址转物理地址如下图:
一个页目录表可以表示1024个页表,就可以寻址4G地址空间。每个页表都占用4K空间来保存1024个页,因此全部的页表需要4M的空间来保存。大多数机器没有4G的物理内存,因此不需要产生全部的页表,如linux 0.11最大支持16M物理内存,因此一个进程只需要4个页表,占用16K空间,加上页目录表占用4K,总共20K空间来存放分页机制需要的映射表。
这几张表放在内存的哪里呢,linux 0.11的引导启动程序head.s对其进行了初始化,如图:
从图中可以看出,页目录表从物理内存首地址0开始,大小为4K字节,存放着页表的地址。紧随其后的是4张页表,每张页表4K,存放着页的地址。由此页目录表+页表=20K。
页目录表和页表中的每个结构都是相同,即每个目录表中的表项(4字节)来寻址一个页表,4字节对应的结构如图:
P--存在标志,表明表相对应的地址是否有效,也就是是否已经对应了真实的物理内存,1表示有效,0表示无效,无效时,其他位可以用来被程序任意使用
R/W--1,表示读写,可执行;0表示只读或可执行(对超级用户特权级0,1,2不起作用)
U/S--用户/超级用户标志,1表示任何级别的程序均可访问该页,0表示只有超级用户特权级0,1,2可访问
A--已访问标志,1表示所映射页面被处理器访问过,可以作为页淘汰算法的依据
D--修改标志(dirty)。对页面进行些操作时,会修改该位。
AVL--保留给程序使用
内核对页表的使用情况如图:
其中pg_dir为页目录表,第一项0x1007占用四个字节描述了pg0第一张页表(暂且不考虑大小端),表示P=1,R/W=1,U/S=1,地址为0x1000,相应的pg0的首地址为0x1000。
内核对页表的使用情况如图:
其中pg_dir为页目录表,第一项0x1007占用四个字节描述了pg0第一张页表(暂且不考虑大小端),表示P=1,R/W=1,U/S=1,地址为0x1000,相应的pg0的首地址为0x1000。