CPU实模式和保护模式、全局描述符表GDT、Linux内核中GDT和IDT的结构定义
一 计算机实模式和保护模式
实模式
在实模式下,内存被限制为仅有1M字节(220 字节)。有效的地址从00000到FFFFF (十六进制)。
这些地址需要用20位的数来表示。一个20位的数不适合任何一个8086的16位寄存器。
Intel通过利用两个16位数值来决定一个地址的方法来解决这个问题。开始的16位值称为段地址(selector)。
段地址的值必须存储在段寄存器中。第二个16位值称为偏移地址(offset)。
16位保护模式
在实模式下,一个段地址的值是物理内存里的一节的首地址。在保护模式下,一个段地址的值是一个指向描述符表的指针
。两种模式下,程序都是被分成段。在实模式下,这些段在物理内存的固定位置而且段地址的值表示段开始处所在节的首
地址。在保护模式下,这些段不是在物理内存的固定的地址。事实上,它们不一定需要在内存中。
保护模式使用了一种叫做虚拟内存的技术。虚拟内存的基本思想是仅仅保存程序现在正在使用的代码和数据到内存中。其
它数据和代码暂时储存在硬盘中直到它们再次需要时。
在保护模式下,每一段都分配了一条描述符表里的条目。这个条目拥有系统想知道的关于这段的所有信息。这些信息包括
:现在是否在内存中;如果在内存中,在哪;访问权限(例如: 只读)。段的条目的指针是储存在段寄存器里的段地址值
。
32位保护模式
80386引入了32位保护模式。
386 32位保护模式和286 16位保护模式之间最主要的区别是:
1 偏移地址扩展成了32位。这就允许偏移地址范围升至4G。因此,段的大小也升至4G。
2 段可以分成较小的4K大小的单元,称为内存页。虚拟内存系统工作在页的方式下,代替了段方式。这就意味着一段
在任何一个时刻只有部分可能在内存中。在28616位保护模式下,要么整个段在内存中,要么整个不在。
在Windows 3.x系统中,标准模式为286 16位保护模式而增强模式为32位保护模式。Windows 9X,Windows
NT/2000/XP,OS/2和Linux都运行在分页管理的32位保护模式下。
二 全局描述符表GDT
GDT,Global Descriptor Table。
IA32允许将一个段的基地址设置为32bit所能表示的任何值,limit(段大小)则可以设置成以2^12为倍数的任何值。
在保护模式下,对一个段的描述包括以下三个方面:[Base Address,Limit,Access],他们加在一起被放在一个64bit
长的数据结构中,被成为段描述符。
在这种情况下,如果我们直接通过一个64bit段描述符来引用一个段的时候,就必须使用一个64bit长的段寄存器装入
这个段描述符。
把这些长度为64bit的段描述符放入一个数组中,而将段寄存器中的值作为下标索引来间接引用(事实上就是将段寄
存器中的高13bit的内容作为索引)。这个全局数据就是GDT。
三 Linux中GDT和IDT的结构定义
GDT,IDT都是全局的。LDT是局部的(在GDT中有它的描述符);
GDT用来存储描述符(门或非门);系统中几个CPU,就有几个GDT
struct gdt_page {
struct desc_struct gdt[GDT_ENTRIES];
} __attribute__((aligned(PAGE_SIZE)));
DECLARE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page);
IDT整个系统只有一个;
系统启动时候需要初始化GDT和IDT;
描述符结构定义,在<arch/x86/include/asm/desc_defs.h>
struct desc_struct {
union {
struct {
unsigned int a;
unsigned int b;
};
struct {
u16 limit0;
u16 base0;
unsigned base1: 8, type: 4, s: 1, dpl: 2, p: 1;
unsigned limit: 4, avl: 1, l: 1, d: 1, g: 1, base2: 8;
};
};
} __attribute__((packed));
上面第一个匿名结构体用来作为成员访问取值的出口,下面第二个结构体对真实的成员设置值的入口。
字段:
limit:段长度
base:段的首字节的线性地址,有base0,base1,base2三部分构成
type:段的类型和存取权限
s:系统标志。1-系统段;0-普通段
dpl:描述符特权级
p:segment-Present。linux下总是1
avl:linux不用
d:区分代码段还是数据段
g:段大小粒度。以4K倍数计算
在32位机器上,这就是所有描述符的数据结构;
typedef struct desc_struct gate_desc;
typedef struct desc_struct ldt_desc;
typedef struct desc_struct tss_desc;
由于三类描述符都是一个结构类型,从而一律使用下面宏初始化在GDT中表项
#define GDT_ENTRY_INIT(flags, base, limit) { { { \
.a = ((limit) & 0xffff) | (((base) & 0xffff) << 16), \
.b = (((base) & 0xff0000) >> 16) | (((flags) & 0xf0ff) << 8) | \
((limit) & 0xf0000) | ((base) & 0xff000000), \
} } }
但是在64位机器上,Linux则进行了细致划分;
无论是32位还是64位机器上,都使用typedef重新定义,以提供给系统其他使用此描述符的部分一致的类型名;
区分描述符的枚举量
enum {
GATE_INTERRUPT = 0xE,
GATE_TRAP = 0xF,
GATE_CALL = 0xC,
GATE_TASK = 0x5,
};
enum {
DESC_TSS = 0x9,
DESC_LDT = 0x2,
DESCTYPE_S = 0x10, /* !system */
};
系统GDT,IDT指针描述结构
struct desc_ptr {
unsigned short size;
unsigned long address;
} __attribute__((packed)) ;
这个结构记录了系统的GDT或者IDT的大小以及在系统中的线性基址;
Reference:
<arch/x86/include/asm/desc_defs.h>
四 如何通过段描述符访问内存
当我们要访问某个段中的一个地址时候:
1 从GDTR中拿到GDT在内存中的基地址,得到段描述符表;
2 从段选择子中的前13位得到我们要访问的段的描述符在段描述符表中的索引;
3 从段描述符表中得到要访问的段的描述符,得到其基地址;
4 基地址加上偏移地址就是我们要访问的内存地址(这里是虚拟地址,接下来是分页机制的功能将虚地址转换为物理
地址,)
看内核相关源码涉及到 AT&T汇编,和Intel汇编语法不同;先学部分AT&T汇编语法;
操作数排列是从源(左)到目的(右),如"movl %eax(源), %ebx(目的)";
符号常数直接引用 如:
value: .long 0x12a3f2de
movl value , %ebx
会见到如下的指令:push,pushl,pushfl;
操作数的长度用加在指令后的符号表示b(byte, 8-bit), w(word, 16-bits), l(long, 32-bits);
如
"movb %al, %bl",
"movw %ax, %bx",
"movl %eax, %ebx",
目前还不知道pushfl是啥;
如果没有指定操作数长度的话,编译器将按照目标操作数的长度来设置。
参阅
https://blog.csdn.net/cwcmcw/article/details/21640363
http://blog.chinaunix.net/uid-29113598-id-5210949.html
CPU实模式和保护模式、全局描述符表GDT、Linux内核中GDT和IDT的结构定义相关推荐
- 3.操作系统——CPU的实模式、保护模式和长模式
有实模式.保护模式.长模式 实模式16(实地址模式) 真实分为两个方面: 运行真实指令.不区分指令动作,只是直接执行指令的真实功能 发往内存的地址是真实.不加限制的. 总结来说就是,这个模式下直接往物 ...
- 深入理解计算机系统-之-内存寻址(二)--存储保护机制(CPU实模式与保护模式)
cpu的保护模式由来 分段机制 8086的诞生,标志着Intel 正式进入了x86时代,这是个多么具有纪念意义的日子:1978-6-8.同时,8086的诞生也是处理器内存寻址技术的第一次飞跃. 对于一 ...
- CPU的三种工作模式:实模式、保护模式、长模式
文章目录 **实模式** **保护模式** **长模式** **总结** 实模式 访问内存 实模式也就是说寄存器中存放的地址都是真实地址,比如下面这段程序: data SEGMENT ;定义一个数据段 ...
- 操作系统学习:实模式进入保护模式
本文参考书籍 1.操作系统真相还原 2.Linux内核完全剖析:基于0.12内核 3.x86汇编语言 从实模式到保护模式 ps:基于x86硬件的pc系统 保护模式相关介绍 从实模式进入保护模式其实经历 ...
- 实模式与保护模式详解一:寄存器
基本寄存器 在了解实模式与保护模式区别之前,先介绍一下几个基本的寄存器 通用寄存器 寄存器组中有8个32位寄存器,属于CPU内的寄存器,也称通用寄存器,按照用途可以分为数据寄存器组和指示器变址寄存器 ...
- 实模式和保护模式区别及寻址方式
64KB-4GB-64TB? 我记得大学的汇编课程.组成原理课里老师讲过实模式和保护模式的区别,在很多书本上也有谈及,无奈本人理解和感悟能力实在太差,在很长一段时间里都没真正的明白它们的内含,更别说为 ...
- 操作系统引导--从实模式到保护模式
从开始到保护--系统开机引导 ------没有一个文档能写的通俗易懂,我希望写出来. 开机引导和实模式: 两个星期加上假期吐血整理,所述为计算机的开机引导,其中包括一系列计算机内存设置等等,由于没有老 ...
- Linux下的实模式和保护模式
实模式:(即实地址访问模式)它是Intel公司80286及以后的x86(80386,80486和80586等)兼容处理器(CPU)的一种操作模式.实模式被特殊定义为20位地址内存可访问空间上,这就意味 ...
- x86从实模式到保护模式 pdf_【自制操作系统04】从实模式到保护模式
通过前三章的努力,我们成功将控制权转交给了 loader.asm 这个程序.具体说就是 bios 通过加载并跳转到 0x7c00(IMB大叔们定的) 把控制权转交给了我们操作系统的第一个汇编程序 mb ...
最新文章
- 字符常量和仅包含一个字符的字符串之间的区别
- Comparative assessment of long-read error-correction software applied to RNA-sequencing data
- (二)线程同步_3---在类中使用相互独立的属性同步
- select、poll、epoll之间的区别
- 国家开放大学2021春1009离散数学(本)题目
- 5gh掌上云计算认证不通过_阿里云ACP认证考试攻略、考试心得、费用及常见问题...
- anyRTC 解决方案——双师在线课堂、1VN、大型公开课
- leetcode949. Largest Time for Given Digits
- NLP --- 文本分类(基于LDA的隐语意分析详解)
- 数据结构与算法之队列
- 多页Excel转换成PDF时如何保存为单独文件
- 学深圳,垃圾随桶运走最好
- cad导出pdf_CAD手机看图软件中导出的CAD图纸为什么没有颜色?
- 小米路由器青春版刷潘多拉、华硕固件
- 诺基亚 PC Internet 访问 N70为例
- python下雨动画特效_pygame实现烟雨蒙蒙下彩虹雨
- 谷歌浏览器崩溃之错误代码:RESULT_CODE_MISSING_DATA
- 海尔智家半年报营收净利双增,卡萨帝、三翼鸟贡献几何?
- javascript 百度地图定位标点,定位详情
- linux虚拟机 Ubuntu 安装方法
热门文章
- ubuntu10.04下安装windows7
- JS类的封装及实现代码
- javascript修改CSS
- Spring Boot 集成 Activiti
- 2转单通道 python_机器学习用Python—Python集成工具包Anaconda安装步骤
- Pandas通过某列不是NaN来进行筛选
- jstree如何禁止平级拖拽?_小程序为鲜花店经营带来哪些价值?如何搭建一款鲜花小程序?...
- boostrap 鼠标滚轮滑动图片_Bootstrap幻灯片轮播图支持触屏左右手势滑动的实现方法...
- mysql DATE_FORMAT 年月日时分秒格式化
- c++ 将输入存储到数组,然后反转数组,最后输出