Linux内核学习--内存寻址

Linux内核学习–内存寻址

内存地址

使用 x86 处理器时,需要区分三种地址:

  • 逻辑地址(程序看到的地址):逻辑地址由一个段和偏移量组成。
  • 线性地址(虚拟地址):位于逻辑地址和物理地址之间
  • 物理地址:真实的地址,用于内存芯片级内存单元寻址
逻辑地址-->[分段单元]-->线性地址-->[分页单元]-->物理地址

分段可以给每一个进程分配不同的线性空间地址,而分页可以把同一线性空间映射到不同的物理空间

段寄存器

为了快速地找到段选择符,处理器提供了一些段寄存器

  • cs:代码段寄存器,指向包含程序指令的段。(另外包含有两位的字段,用以指明CPU特权级)
  • ss:栈寄存器,指向包含当前程序栈的段
  • ds:数据段寄存器,指向包含静态数据或者全局数据段
  • es,fs,gs:作为一般用途,指向任意数据段
硬件中的分页

分页单元把线性地址转换为物理地址。这个过程中有一个重要任务就是把请求的访问类型与线性地址的访问权限进行比较,如果内存访问无效则产生缺页异常。线性地址和物理地址都被分成固定大小的页,通过页表(存储页的对应关系)实现地址映射。

Linux采用多级分页,即页目录表(可能多层)、页表,每个页目录包含了若干下一级页目录地址…每个页表包含若干物理内存。

页表的一些字段:

  • Present标志:表示所指的页是否在主存中。如果执行地址转换时所需的页表项对应的Present标志为0,则产生缺页异常。
  • Accessed标志:用于确认该页表是否被使用
  • Dirty标志:用于确认数据是否被修改
  • Read/Write:用于确定该页的权限,即可读还是可写
  • User/Supervisor:用于确定用户态是否可以访问
高速缓存的写操作

通过高速缓存可以大大节约CPU时间,更快地找到对应的物理地址。

对于写操作,高速缓冲的两种策略:

  • write-through:控制器既写RAM也写高速缓存行,为了提高写的效率关闭告诉缓存。
  • write-back:只更新高速缓存行,不改变RAM内容。当RAM必须被更新(例如在高速缓存上对应的数据要被移出时,或当一个FLUSH硬件信号产生),则写回到RAM

write-back更加具有计算机一个非常重要的思想,我喜欢称为 懒处理,即不是必须则暂时不做。该思想在诸多地方均有体现,包括copy-on-write机制等。很多缓存都会这样设置

TLB

用于加快线性地址转换到物理地址。当进行查询页表之前,首先去TLB中查询,TLB可以视为一个寄存器,因此存储内容较少但是查找速度极快,故将常用的页表项存入TLB将大大加快地址转换。 利用了局部性原理,即如果一个页被访问,则它之后可能很快又会被访问。

因此平均每次地址转换的时间为:n*访问TLB的时间+(1-n)*(访问TLB的时间+访问页表的时间),n为TLB的命中率

通常TLB的刷新的时机:改变内核页表项、执行进程切换、创建新进程、释放进程、处理缺页异常时等

猜你喜欢

转载自blog.csdn.net/dingdingdodo/article/details/106962415
今日推荐