linux0.12之内存管理(1)-整体框架思路

来源:互联网 发布:什么是双色球密码算法 编辑:程序博客网 时间:2024/06/06 06:34

内存管理一直是本人比较佩服linus的地方。为此先看linux0.11版本,又看了0.12版本,基本思路一样,差异性会单独列出来。
本篇博客只是梳理一下大体思路,具体函数分析,放在后面的博客。

一、 从实模式到保护模式谈起
1、简单讲实模式,是16位寻址的访问方式,保护模式是32位的访问方式。在linux0.12的启动代码中bootsect和setup是工作在实模式下,之后的所有代码都运行在保护模式之下。
不管哪种模式,访问内存都是一种映射的思想,所以实模式和保护模式就是映射算法的差别(我的看法)。
实模式下如何让pc指针进行访问内存,
段<<4+偏移地址
段寄存器比如ds,对应的偏移量为si,寻址标识为ds:si,
段是一个16位的寄存器,所以左移4位,所以在实模式下最大寻址为1M内存大小,为了寻址更大内存,很明显这种映射算法就不能满足了。
2、为了解决这个问题,x86硬件也提出了解决方案。
提出了32位的线性地址的概念,这样就可最大寻址4G的内存空间,看看如何实现的。
先看看此时段寄存器此时的结构
这里写图片描述
低三位暂不考虑,就是一些标志位,高13位为索引为。
X86拥有一个GDT表,这个表就是用来生成线性地址的,这个表每个cpu只有一个,其中由很多表项组成,每个表项为2个32bit组成。表项结构如下:
这里写图片描述
刚刚的段寄存器的高13位就是用来寻址在GDT表中,哪一个表项。
GDT表项中的段基址组成32位的线性地址。
还有一个问题就是段寄存器给出的只是GDT表项的偏移地址,而GDT的基地址是由一个专门寄存器(GDTR)控制的。
所以基本框图如下
这里写图片描述
大体了解实模式和保护模式的寻址方式,x86还给出了寄存器CR0用于标志什么时候进入实模式什么时候进入保护模式。
线性地址到真实的内存还有一定距离,也就是物理地址。
X86也提出一套机制,就是将物理内存分页,将线性地址映射到物理内存上。采用两级分页,
具体实现框图为
这里写图片描述
上面两种映射方式就是常常将的分段映射和分页映射。

这里写图片描述
具体如何实现,下一篇分析源码

1 0
原创粉丝点击