调整内核内存部分文档结构和内容.

Signed-off-by: chen.yang <chen.yang@yuzhen-iot.com>
This commit is contained in:
chen.yang 2022-04-26 11:32:04 +08:00
parent 050d59c766
commit 3caa338f53
7 changed files with 21 additions and 18 deletions

View File

@ -6,32 +6,35 @@
早期的 Intel 8086 处理器使用了类似机制,由段地址寄存器提供基地址(又称为段地址),程序基于基地址的内存访问偏移量,此时由基地址+偏移量共同实现内存的寻址,而程序地址与实际内存地址被分割开来,程序使用的地址称为逻辑地址,实际内存地址称为物理地址。
基地址+偏移其实形成了线性地址,可以看出,早期的线性地址就等于物理地址。引入段寄存器的另一个好处是能够将内粗数据段、代码段等隔离开来。
Intel 引入段寄存器的另一个好处是能够将内粗数据段、代码段等隔离开来Intel 采用冯诺依曼结构,其代码和数据共用同一个存储器,如果代码和数据不进行分割,则错误的数据操作很容易引起程序指令的错误
随着操作系统技术的完善、以及内核安全、进程间安全需求的增加Intel 又引入的分页机制。为了保持前向兼容,分页机制又与之前的分段机制组合,形成了现代计算机的内存管理机制
基地址+偏移其实形成了线性地址,可以看出,早期的线性地址就等于物理地址
CPU硬件对段地址的访问是没有任何限制的因此如果系统中只使用了分段机制则应用程序可以任意修改段寄存器的值它能够访问到整个物理内存空间。此时操作系统内核无法与应用程序有效隔离其他进程也与当前进程没有隔离。一旦当前程序存在内存溢出或对其他内存空间进行恶意访问则没有任何有效手段对操作系统内核和其他进程进行有效保护。
当硬件引入分页机制后则可以很好的解决以上等问题。Intel 4k 页分页机制如下:
![分页机制](./imgs/8.11_内核内存管理/001.png)
其由页目录、页表和页构成,页可以在真实物理内存中,也可以被换出到外部存储器中。如果程序需要访问改页,则被标记为“脏”,从而引起操作系统内核将改页唤入到物理内存中。
Intel x86/64 体系结构下,对应的 CPU 寄存器、段选择子、GDT、LDT、IDT、PDT 和 PT 中包含了许多长度、类型、权限等数据项这些项目由内核设置。当需要访问特定资源时操作系统和内核密切配合决定了访问能否继续下去。如果访问权限不正确或其他检查出错则该访问将被拒绝。这样就保证了内核的安全也保证了进程间内存的相互独立。这部分的具体内容可参考《x86 x64体系探索及编程》邓志或 《Intel 64 and IA32 Architectures Software Developers Manual 3》中的 Paging 部分及 Protection 部分。也就是说,内存的安全访问,由分段机制和分页机制组成。另外,系统的运行级别、指令的特权级别,也是硬件实现系统安全和保护的重要组成机制。
![Code-Segment Descriptor](./imgs/8.11_内核内存管理/002.png)
能够看出,当引入分页机制后,线性地址不再等于物理地址,线性地址必须经过页表的翻译后才能得到真实的物理地址。
至此,计算机内存产生了物理地址、逻辑地址、段地址、偏移地址、虚拟地址、线性地址等概念:
随着内存管理需求的增加Intel 又引入的分页机制。同时,为了保持前向兼容,分页机制又与之前的分段机制组合,形成了现代计算机的内存管理机制。能够看出,当引入分页机制后,线性地址不再等于物理地址,线性地址必须经过页表的翻译后才能得到真实的物理地址。至此,计算机内存产生了物理地址、逻辑地址、段地址、偏移地址、虚拟地址、线性地址等概念:
1. 物理地址是内存中最真实的地址CPU 在外部地址总线上寻址物理内存的地址信号。
2. 逻辑地址:指访内指令给出的地址 (操作数) ,也叫相对地址,也就是机器语言指令中,用来指定一个操作数或是一条指令的地址。
3. 虚拟地址:是由程序产生的由段选择符和段内偏移地址组成的地址。
4. 线性地址:是逻辑地址到物理地址变换之间的中间层。(在分段部件中基地址加上段中的偏移地址就是逻辑地址)
![逻辑地址转换](./imgs/8.11_内核内存管理/003.drawio.png)
![逻辑地址转换](./imgs/8.11_内核内存管理/001.drawio.png)
## 分页机制
Intel 分页机制的实现采用了页目录、页表和页的机制同时将线性地址拆分成不同的区域用于实现页目录、页表、页的寻址。Intel 4k 页分页机制如下:
![分页机制](./imgs/8.11_内核内存管理/002.png)
页可以在真实物理内存中,也可以被换出到外部存储器中。如果程序需要访问该页,则被标记为“脏”,从而引起操作系统内核将改页唤入到物理内存中。
Intel x86/64 体系结构下,对应的 CPU 寄存器、段选择子、GDT、LDT、IDT、PDT 和 PT 中包含了许多长度、类型、权限等数据项这些项目由内核设置。当需要访问特定资源时操作系统和内核密切配合决定了访问能否继续下去。如果访问权限不正确或其他检查出错则该访问将被拒绝。这样就保证了内核的安全也保证了进程间内存的相互独立。这部分的具体内容可参考《x86 x64体系探索及编程》邓志或 《Intel 64 and IA32 Architectures Software Developers Manual 3》中的 Paging 部分及 Protection 部分。也就是说,内存的安全访问,由分段机制和分页机制组成。另外,系统的运行级别、指令的特权级别,也是硬件实现系统安全和保护的重要组成机制。
![Code-Segment Descriptor](./imgs/8.11_内核内存管理/003.png)
## 系统内存安全
## Linux 内存空间的划分

View File

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB