内核代码阅读(1) - Intel CPU和段页式内存管理

简介: Intel CPU和段页式内存管理

Real Mode 8086

16位寄存器

20位地址

使用CS DS SS ED段寄存器

16位寄存器 << 4(基地址) + 16位地址

此乃实模式 Real Mode

Protect Mode 80386

保护模式实现思路

段式内存

GDTP (global descriptor table register)
 LDTR (local descriptor table
 每个段寄存器在CPU上都有一个扩展,
 当一个段寄存器被改变(MOV, POP)后,CPU会根据LDTP,GDTR+段寄存器的偏移,取出新的段描述符,放到这个寄存器的影子中。
 因为GDTR,LDTR的操作是特权指令,只能在内核态中执行,用户看不到段描述符表在哪里,所以部分实现了保护。
 最终的段值为 LDTR(GDTR) _+ 相应的段寄存器值的高13位

系统态和用户态(如何区分是系统态还是用户态呢?)

80386划分4个特权级别0是内核态,3是用户态
 16位的段寄存器后3位,用来描述权限
 typedef struct {
     unsigned short seg_idx:13;
 unsigned short ti:1;
 unsigned short tpl:2 /*Request Privilege Level 要求的优先级别*/
 } 段寄存器;

页式内存

与段式之间的关系

建立在段式基础之上。当前执行的权限就是存在相关的代码段描述项中
逻辑地址 (段式)-> 线性地址  (页式) -> 物理地址
所有的地址都要经过页式的转换,包括GDTR, LDTR等

线性地址

typedef struct {
     unsigned int dir:10;
 unsigned int page:10;
 unsigned int offset:12;
 } ;

为什么要2级映射,而不是像段式那样一步倒位?

如果像段式一步倒位,前面20位可以提供1M的页面数的寻址。
 那么,就必须开一个大小为1M的连续数组,用以定位页框下标。这个的设计,不需要页目录了大小是(4K),直接由1M大小的页表定位页面,然后,后面的12位的offset定位页内地址。
 而采用2层,就可以,在需要目录项,页面表目录的时候动态的申请,而不是一次行的申请1M的连续的页表目录大小。类似于STL的deque数据结构。巧妙的设计。

页面4k,为什么?

上面说了,在需要目录项,页面表目录的时候动态的申请。
 申请目录项:大小是1k,所占用的内存空间正好是4k,所以一个进程的页目录一个页面。
 申请页表:一个页表大小也是10位,大小1k,内存空间是4k。
 所以,申请目录项(一个进程一个),和页表项都是一个页面。
 alpha CPU 64位cpu的页面8K。

目录项,页表项

目录项和页表项都是高10位起作用,低22用不到。这22用来控制权限,虚存等。

PSE

页目录项中的ps为0: 页面大小4k,采用2层;
         ps为1: 页面大小4M, 采用1层。

CR0 寄存器最高PG位,是页式映射机制的踪开关。1是开启页式映射。

PAE 在Pentium Pro中作了地址扩充,增加了CR4寄存器,其中有一个PAE位。

相关文章
|
1月前
|
算法 Linux
深入探索Linux内核的内存管理机制
本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。
|
1月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
132 7
|
1月前
|
开发框架 .NET PHP
网站应用项目如何选择阿里云服务器实例规格+内存+CPU+带宽+操作系统等配置
对于使用阿里云服务器的搭建网站的用户来说,面对众多可选的实例规格和配置选项,我们应该如何做出最佳选择,以最大化业务效益并控制成本,成为大家比较关注的问题,如果实例、内存、CPU、带宽等配置选择不合适,可能会影响到自己业务在云服务器上的计算性能及后期运营状况,本文将详细解析企业在搭建网站应用项目时选购阿里云服务器应考虑的一些因素,以供参考。
|
2月前
|
算法 Linux 开发者
深入探究Linux内核中的内存管理机制
本文旨在对Linux操作系统的内存管理机制进行深入分析,探讨其如何通过高效的内存分配和回收策略来优化系统性能。文章将详细介绍Linux内核中内存管理的关键技术点,包括物理内存与虚拟内存的映射、页面置换算法、以及内存碎片的处理方法等。通过对这些技术点的解析,本文旨在为读者提供一个清晰的Linux内存管理框架,帮助理解其在现代计算环境中的重要性和应用。
|
2月前
|
弹性计算 Kubernetes Perl
k8s 设置pod 的cpu 和内存
在 Kubernetes (k8s) 中,设置 Pod 的 CPU 和内存资源限制和请求是非常重要的,因为这有助于确保集群资源的合理分配和有效利用。你可以通过定义 Pod 的 `resources` 字段来设置这些限制。 以下是一个示例 YAML 文件,展示了如何为一个 Pod 设置 CPU 和内存资源请求(requests)和限制(limits): ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image:
312 1
|
2月前
|
缓存 Linux
揭秘Linux内核:探索CPU拓扑结构
【10月更文挑战第26天】
57 1
|
2月前
|
缓存 运维 Linux
深入探索Linux内核:CPU拓扑结构探测
【10月更文挑战第18天】在现代计算机系统中,CPU的拓扑结构对性能优化和资源管理至关重要。了解CPU的核心、线程、NUMA节点等信息,可以帮助开发者和系统管理员更好地调优应用程序和系统配置。本文将深入探讨如何在Linux内核中探测CPU拓扑结构,介绍相关工具和方法。
38 0
|
2月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
886 2
|
2月前
|
存储 算法 安全
深入理解Linux内核的内存管理机制
本文旨在深入探讨Linux操作系统内核的内存管理机制,包括其设计理念、实现方式以及优化策略。通过详细分析Linux内核如何处理物理内存和虚拟内存,揭示了其在高效利用系统资源方面的卓越性能。文章还讨论了内存管理中的关键概念如分页、交换空间和内存映射等,并解释了这些机制如何协同工作以提供稳定可靠的内存服务。此外,本文也探讨了最新的Linux版本中引入的一些内存管理改进,以及它们对系统性能的影响。
|
2月前
|
缓存 算法 Linux
Linux内核中的内存管理机制深度剖析####
【10月更文挑战第28天】 本文深入探讨了Linux操作系统的心脏——内核,聚焦其内存管理机制的奥秘。不同于传统摘要的概述方式,本文将以一次虚拟的内存分配请求为引子,逐步揭开Linux如何高效、安全地管理着从微小嵌入式设备到庞大数据中心数以千计程序的内存需求。通过这段旅程,读者将直观感受到Linux内存管理的精妙设计与强大能力,以及它是如何在复杂多变的环境中保持系统稳定与性能优化的。 ####
45 0