深入理解Linux 内核 chp 2 内存寻址

原创 2016年06月02日 11:26:40

1. 内存寻址

  1. 逻辑地址: 通过一个段(segment) 和 一个偏移量(offset)来表示
  2. 线性地址: 也称虚拟地址, 是一个32bit的无符号整数, 可以用来表征4G的地址空间
  3. 物理地址: 用于内存芯片级的内存单元的寻址, 由32bit ~ 36bit 无符号整数来表示
  4. 逻辑地址转换示意图:
    这里写图片描述

2. 硬件中的分段

intel 8086系列主要有两种工作模式:实模式 和 保护模式

2.1 段选择器和段寄存器

  1. 一个逻辑地址由一个段标志符(16bit)和一个指定段内的相对地址偏移量(32bit)组成。
    这里写图片描述
  2. 段选择符中 index 表示选择的段在 gdt (全局描述符表)或者 ldt (局部描述符表)中的位置, TI 表示 gdt/ldt 表, RPL 表示权限
  3. 段寄存器的唯一目的: 存放段选择器, 可以用来方便的查找段选择符

2.2 段描述符

  1. 段由一个8字节的段描述符来表示, 描述了段的特征。 而段描述符又存放在gdt 或者 ldt表中。
    这里写图片描述

2.3 快速访问描述符

  1. 为了加速从逻辑地址到线性地址的转换, 可以借助通过一个非编程寄存器直接存储段描述符(8字节)来解决这个问题
    这里写图片描述

2.4 分段单元

逻辑地址到线性地址转换示意图:
这里写图片描述

3. Linux中的分段

  1. Linux 只有在8086结构下才使用分段,其他时候都是仅使用分页
  2. Linux 下逻辑地址和线性地址是一致的, 所有的段都是从0x00000000开始, 偏移量字段和相应的线性地址的值保持一致
    这里写图片描述

3.1 Linux GDT

  1. 单处理器系统中只有一个GDT, 而多处理器系统中每个CPU对应一个GDT, 所有GDT 表都存放在cpu_gdt_table 数组中

3.2 Linux LDT

一般只有在需要模拟windows程序时候, 才会用到ldt

4. 硬件中的分页

  1. 分页单元将线性地址转换为物理地址, 需要注意权限问题

4.1 常规分页

  1. 使用二级映射模式, 减少了每个进程页表所需的RAM数量, 支持4KB分页大小
    这里写图片描述

4.2 扩展分页

  1. 允许页框大小为4MB
    这里写图片描述

4.3 硬件保护方案

  1. 与页和页表有关的特权级别, 在页目录项中表征为 User/Supervisor 标志
    这里写图片描述

4.4 常规分页举例

4.5 物理地址扩展PAE 分页机制

  1. 由于大型服务器需要大于4GB的RAM来同时运行多个进程, intel 通过扩展32bit地址总线到 36bit实现 64GB 的寻址能力, 因而, 相应的需要引入一个新的分页机制, 将32bit线性地址转化为 36 bit 物理地址。
  2. 具体方式, 通过引入新级别的页目录表, 原先的 3 段, 现在变成 4 段。
    这里写图片描述
    本质上来讲, 就是从原先页目录表和页表中拿了2bit独立成一个pdpt表。
    显然, 他没有扩展进程的线性地址空间, 但是他却允许内核使用64G (此时有 36bit 物理地址总线)的RAM, 增加了系统中进程的数量

4.6 64位系统中的分页

ps: 32bit 的两级分页模型并不适合64bit系统, 需要引入3 ~ 4 级分页模型

4.7 硬件高速缓存

  1. 为了缩小CPU 和 RAM 之间的速度的不匹配, 引入了硬件高速缓存内存的概念
  2. 他基于局部性原理: 最近最常使用的相邻地址在最近的将来又被用到的可能性极大
  3. 以行为单位, 缓存
  4. 通写和回写策略etc

4.8 转换后援缓冲器TLB

  1. 用来加速线性地址转换

5. Linux 中的分页

(ps: 这部分写的比较简略, 具体细节还是看书吧,有一堆api 看了不想写, 还有一些东西太复杂, 没仔细看。。。。)
1. 采用4级分页模型, 每部分的大小和具体的计算机的体系结构有关
这里写图片描述

5.1 线性地址字段

  1. PAGE_SHIFT, PMD_SHIFT,PUD_SHIFT, PGDIR_SHIFT, etc

5.2 进程页表

http://blog.csdn.net/zhyh1435589631/article/details/50989569这篇博客里面的这张图感觉应该好理解些

5.3 TLB的处理

关键是提高命中率和同步

版权声明:本文为博主原创文章,未经博主允许不得转载。

读深入理解Linux内核 (第二章 内存寻址)

我曾经提到过,理解一个嵌入式平台的关键是它的系统映射表(System Memory Map)。计算机的核心是CPU,然而CPU所做的也主要是计算,至于要计算的内容(数据),算法(代码),和结果都是存放...
  • jiangjqian
  • jiangjqian
  • 2016年09月21日 18:50
  • 430

深入理解Linux内核架构

2.1 进程优先级 粗略分,实时进程和非实时进程。 实时进程:(1)硬实时进程,必须在可保证的时间范围内得到处理。 (2)软实时,仍然需要尽快处理,晚一点...
  • ljf_forlinux
  • ljf_forlinux
  • 2016年12月30日 21:44
  • 1381

深入理解计算机系统-之-内存寻址(四)--linux中分段机制的实现方式

linux中的分段机制前面说了那么多关于分段机制的实现,其实,Linux以非常有限的方式使用分段。因为,Linux基本不使用分段的机制(注:并不是不使用,使用分段方式还是必须的,会简化程序的编写和运行...
  • gatieme
  • gatieme
  • 2016年02月11日 15:22
  • 2081

V4l2 video for linux 2 linux 视频处理子系统

V4L是 Video for Linux的缩写,它是Linux 内核中关于视频设备的子系统,它为linux 下的视频驱动提供了统一的接口,使得应用程序可以使用统一的API 函数操作不同的视频设备,极大...
  • kevinx_xu
  • kevinx_xu
  • 2012年12月20日 10:34
  • 903

深入理解Linux内核(一)

Linux与其他商用Unix内核竞争的优势: 1、单块结构的内核:它是一个庞大、复杂的自我完善(do-it-yourself)程序,由几个逻辑上独立的成分构成,在这一点上,它是相当传统的,大多数商用U...
  • wang_fangzhou
  • wang_fangzhou
  • 2014年01月21日 16:13
  • 743

深入Linux设备驱动程序内核机制- 扫描版-有书签目录40M

深入Linux设备驱动程序内核机制- 扫描版-有书签目录40M  http://download.csdn.net/detail/zhanglu231123/4581643  深入Linux...
  • FE421504975
  • FE421504975
  • 2012年12月31日 14:07
  • 1205

深入理解计算机系统-之-内存寻址(一)--存储管理机制(虚拟地址,线性地址,物理地址)

参照 《深入理解计算机系统》 《深入理解linux内核》 《80x86汇编语言程序设计》 《操作系统的设计与实现》 为了对存储器中的程序及数据实现保护和共享硬件支持,为了对实现...
  • gatieme
  • gatieme
  • 2016年02月09日 16:08
  • 2706

来着豆瓣经典点评《深入理解linux内核>>

曾几何时,我们为调试成功第一段汇编小程序而欢欣鼓舞,为写完C语言小程序通宵达旦,为自己的数据结构解决了一个实际问题而踌躇满志。再后来我们学习了计算机组成原理或者高级点的计算机系统结构,学习过操作系统的...
  • sinat_16790541
  • sinat_16790541
  • 2014年12月28日 15:50
  • 1333

深入理解linux内核架构(内存管理)

1:在内核使用高端内存页之前,必须使用下文讨论的kmap和kunmap函数将其映射到内存虚拟地址空间中。 2:UMA计算机(一致内存访问,uniform memory access)将可用内存以连续方...
  • xueli1991
  • xueli1991
  • 2017年02月20日 15:43
  • 1219

深入理解l内核v4l2框架之video for linux 2(二)

3、video_device struct video_device{ #if defined(CONFIG_MEDIA_CONTROLLER) struct media_entity enti...
  • liukun321
  • liukun321
  • 2013年11月21日 20:43
  • 1414
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入理解Linux 内核 chp 2 内存寻址
举报原因:
原因补充:

(最多只允许输入30个字)