深入理解linux内核之(一)内存寻址

                                                      深入理解linux内核之内存寻址

基于80x86微内核处理器,我们将地址分为三类:

  • 逻辑地址,也就是我们在汇编语言中使用的,由段和偏移量组成。例如指定操作数地址,这些都是逻辑地址,逻辑地址也就是我们写程序的时候用到的地址。

 

  • 线性地址, 也就是虚拟地址,32位机器,虚拟地址最高可以访问4G

 

  • 物理地址


MMU内存管理单元电路,将逻辑地址通过分段单元(Segmentation UNIT)转换成线性地址,将线性地址通过分页单元(Page UNIT)转换为物理地址

Linux除了特定的8086构架以外,Linux一般不适用分段的方式,用这种寻址相对简单,而且在各个平台之间具有可移植性,目前除了我们熟悉的i386外,大部分处理器都支持分页机制。

了解分页机制,需要理解两个概念:

  • 页:固定长度的一段间隔,对于32位机器来说,一般是4k.。页内部连续的线性地址映射连续的物理地址。页是可以包含数据的一系列的线性地址组,也可以叫集合。

 

  • 页框(page framework):分页单元(page UNIT)把RAM看做是若干有固定长度的页框,RAM由若干页框构成(理论上的划分)。那么,页框其实就是物理内存中块的概念,RAM可以被分成很多块。页框内部就是内存块。页框和页结合起来看,那么页就是水,页框就是杯子,水可以放到任何一个杯子里面。也即是说,某个页和某个页框之间不是绑定的。固定的是页框,可以移动的是页。

 

  • 页表:也表示将虚拟地址映射到物理地址的数据结构。



Linux使用多级分页的机制。

对于32位机器来说,2级分页就足够了。对于6使用4级分页。
下面针对32位机器的2级分页进行讲解Linux的多级分页机制

32位地址通常划分为3部分:

  • 0~11:OFFSET
  • 12~21:TABLE
  • 22~31:DIRECTORY

具体划分情况可以看下图:

 

从上面这个图我们就可以看的很明白了。
当前正在使用的Page Directory的物理地址是被保存在在一个叫cr3的寄存器中。我们假设cr3中的值是m。那么对于一个特定的32位地址(线性地址)来说,m加上DIRECTORY的值就是Page Table的地址,此地址指向一个Page frame的地址,这个Page frame地址加上OFFSET偏移量,就可以对该Page内的数据进行访问。可以见,由于OFFSET是12位的,那么一个Page内部的偏移量可以从达到4k。这也就是为什么32位机器,一般一个Page是4k的原因了。DIRECTORY有10位,TABLE有10位,OFFSET有12位,1024 x 1024 x 4096 = 4G 。由此,32位线性地址就可以访问4G的内容了。

理论上,4G都是可以访问的,但是对于一个进程来说,需要对这4G空间重新划分,用户空间可以访问0~3G的3G的空间,内核空间只能访问3~4G的1G空间。

在linux启动过程中,linux内核镜像文件是在0x00100000开始被装载的,之前的1M空间被用来运行BIOS一起相关初始化工作。

 

 

 


版权申明:
转载文章请注明原文出处http://blog.csdn.net/feiyinzilgd/archive/2010/09/13/5880239.aspx

并请联系谭海燕本人或者前往谭海燕个人主页留言

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值