前言:

每天一点点,愚公移山的概念,本文的学习是为了更好地理解操作系统底层的工作原理~

概念说明:

CPU:

信息处理、寄存器、控制器控制单元、通过总线(FSB、前端总线、前端总线)传输数据的信息处理、寄存器、

内存设备:

两个连续的内存单元、N号单元和N号单元可以被认为是两个内存单元,也可以被认为是具有N地址的“字符单元”。

物理地址:

在此空间中,每个内存设备的唯一地址,此唯一地址是物理地址。

段寄存器:

为管理内存中的段而设置的寄存器

通用寄存器:

共8个,AX、BX、CX、DX、SI、DI、SP和BP:

物理模式和保护模式寻址:

16位元CPU(x86-16)、20个位址汇流排、16位元暂存器、实际模式

16位CPU(x86-16),物理模式,旧版MS-DOS操作环境

20条总线,最多2 20=1,048,576=1mb地址,寻址功能:1 MB;

16位寄存器,最大值:2 16=65,536=64kb,内存不足以显示物理地址,因此物理地址=段默认地址偏移地址

4个段寄存器:cs(代码段寄存器)、ds(数据段寄存器)、ss(堆栈段寄存器)、es(

存储要访问的指令的段地址的CS寄存器存储要访问的数据的段地址的DS寄存器SS寄存器、堆栈顶部的默认地址定义、SP寄存器、堆栈顶部的偏移地址定义

访问内存时需要给:CS,DS,ES,SS写入段地址,段寄存器中存放16位的段地址,段地址是参与寻址的,段地址左移4位,加上偏移地址,就是20位的物理地址;

32位CPU(x86-32),32根地址总线,32位寄存器,保护模式(Protected Mode)

32位CPU(x86-32),保护模式,就是通常所说的32位操作系统。

由于30根总线,最多:2^32=1,073,741,824=4GB个地址;

段寄存器(6个):CS(Code Segment,代码段寄存器)、DS(Data Segment,数据段寄存器)、SS(Stack Segment,堆栈段寄存器)、ES(Extra Segment,附加段寄存器)、FS(辅助段寄存器),GS(辅助段寄存器);

段寄存器FS和GS,没有处理器定义的目的,而是由操作系统运行它们来赋予目的;

段寄存器扩展了两个FS和GS,称为:段选择器,向其中写入的是:段选择子,段选择器的位数也为16位;

32位寄存器,最大:2^32=4,294,967,296=4GB,可以表示物理地址,为了兼容,表示形式还是:物理地址=段选择器(段基地址)+偏移地址;

32位机里完整的保留了16位寻址模式,即:寻址能力为1M,分段机制,每段不超过64KB,这就是通常所说的"实模式",在地址储存模型中属于“实地址储存模型”。

段寄存器中存放16位:段选择器(Segment Selector),这个值不直接的参与寻址,是指向段描述表(Segment Descriptor Table)的索引,段描述表中存放着:段描述符(Segment Descriptor)。

段描述符包含段的描述:段基地址(段在内存中的位置),段的大小,段的类型(是数据段还是代码段),权限等。

GDT(Global/Segment Descriptor Table):全局段号记录表,用来存储内存的分段信息,通过段选择子进行访问。

说简单点,GDT就是一个数组,每一个元素就是一个描述符,多个组合一起就构成了全局描述符表,而每一个描述符共64位。

实模式时的段寄存器,存储的值不再是段基地址了,而是GDT的索引,通过该索引可以找到对应的描述符,从描述符中获取到段基地址,然后再通过偏移地址就可以得到物理地址了。

操作系统,是否开启分页机制:

1、关闭,寄存器CR0的最高位,即位31为0,表示不采用分页机制:32位线性地址就等于32位物理地址;

2、开启,寄存器CR0的最高位,即位31为1,表示采用分页机制:32位线性地址内容分三部分:页目录索引<位31~22(10位)>,页表索引<位21~12(10位>、字节索引<位11~0(12位)>。

相关推荐