We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
当我们在程序中读取一个变量时, 会有两个概念性的事情发生.
从程序员角度看, 常见的地址有编程语言中的指针地址, 汇编中的偏移量. 在操作系统中, 会有逻辑地址, 线性地址, 物理地址的不同概念. 在硬件中对应的是内存的存储单元.
指针是对地址的抽象, 具体表示什么, 和运行环境有关.
各类地址概念
应用程序变大后, 导致物理内存不够用, 不能直接将程序全部加载到内存中, 所以将想出来将应用程序用到的部分先加载的办法. 程序部分加载导致需要记录哪些部分已经加载, 哪些部分不用或暂时不用先保存到外部存储上, 这部分功能就演变成现在的地址转换和内存管理.
地址转换分为分页和分段.
从概念上看: 程序 -> 段 -> 页 -> 内存. 操作系统靠分页和分段完成程序地址到物理地址的转换.
硬件提供支持
转换逻辑如下
--->|不可编程的寄存器|----- cache | | ^ | V | 逻辑地址 --> |分段单元| --> 线性地址 --> |分页单元| --> 物理地址 --> 读写对应内存 | ^ |--------| TLB | ------|
逻辑的地址 由 16位段选择器 + 32位段内偏移
常用段寄存器:
寄存器复用套路: 先保存在内存中, 在使用新值, 在回复原值
优化: 存在不可编程的寄存器, 保存在段描述符, 在段寄存器没有发生变化时, 可以直接访问该不可编程的寄存器, 直接获得段信息
以32位地址为例 (64位系统, 会有多级页表, 原理一致)
转换过程
在地址转换上, 硬件提供基础功能(如分段单元, 分页单元) 把这些运算做到硬件上, 可以做到比软件计算更快. 操作系统需要维护下列数据结构:
linux (2.2 之后)把所有段的基地址(首字节地址)设置为0, 逻辑地址数值上和线性地址一样.
The text was updated successfully, but these errors were encountered:
No branches or pull requests
当我们在程序中读取一个变量时, 会有两个概念性的事情发生.
地址
从程序员角度看, 常见的地址有编程语言中的指针地址, 汇编中的偏移量.
在操作系统中, 会有逻辑地址, 线性地址, 物理地址的不同概念.
在硬件中对应的是内存的存储单元.
指针是对地址的抽象, 具体表示什么, 和运行环境有关.
各类地址概念
为什么需要地址转换
应用程序变大后, 导致物理内存不够用, 不能直接将程序全部加载到内存中, 所以将想出来将应用程序用到的部分先加载的办法.
程序部分加载导致需要记录哪些部分已经加载, 哪些部分不用或暂时不用先保存到外部存储上, 这部分功能就演变成现在的地址转换和内存管理.
分页和分段
地址转换分为分页和分段.
从概念上看: 程序 -> 段 -> 页 -> 内存. 操作系统靠分页和分段完成程序地址到物理地址的转换.
实现原理
硬件提供支持
转换逻辑如下
分段单元: 从逻辑地址到线性地址
逻辑的地址 由 16位段选择器 + 32位段内偏移
常用段寄存器:
寄存器复用套路: 先保存在内存中, 在使用新值, 在回复原值
优化: 存在不可编程的寄存器, 保存在段描述符, 在段寄存器没有发生变化时, 可以直接访问该不可编程的寄存器, 直接获得段信息
分页单元: 线性地址到物理地址
以32位地址为例 (64位系统, 会有多级页表, 原理一致)
转换过程
TLB
高速缓存
linux 系统
在地址转换上, 硬件提供基础功能(如分段单元, 分页单元) 把这些运算做到硬件上, 可以做到比软件计算更快.
操作系统需要维护下列数据结构:
linux (2.2 之后)把所有段的基地址(首字节地址)设置为0, 逻辑地址数值上和线性地址一样.
转换图
权限检测
The text was updated successfully, but these errors were encountered: