x86保护模式笔记

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

以下为自己的总结的x86保护模式知识

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

x86虚拟地址空间64TB,通过分段/分页映射到物理内存。而linux 实际上只是有限的使用了分段机制(比如使用了段的特权级保护),并没有利用分段机制实现虚拟化,所以linux下每个进程的虚拟空间,或者说编程空间只有4GB,而不是64TB。  假设现在我们要利用x86的分段机制实现虚拟化,将虚拟空间变成64TB,那么与分页机制实现的虚拟化相比,有什么不同的地方呢?讨论如下:

在分页机制下,每个页大小为4KB,对于x86来说,一个页表项一旦建立,4KB的物理内存就已经被 “ 使用 ”了,即使实际上你只使用了一个字节。。因此,系统内能同时存在的页表项的个数x4KB,不能大于实际物理内存,其余的页表项必须标识为不存在。那么在分段机制上,段的大小是不固定的,但是一旦在段描述符中确定大小后(假设为N个字节),与分页机制一样,即使你只用了一个字节,对x86来说,N个字节已经被 “ 使用 ”了。。因此,系统内能同时存在的段的个数是不固定的,但他们的大小之和不能大于系统物理内存。

x86有32位地址线,对于linux来说 由于没有利用分段机制实现虚拟化,虚拟地址的选择子都是操作系统填的,程序员只需要关注偏移地址,不管选择子是多少,段描述符中基地址都为0,也就是虚拟地址统一映射到偏移地址,这样一来,16位选择子不参与地址映射了,16+32位地址等于变成了32位地址,64TB虚拟空间被压缩到了4GB线性空间(也就是说linux下虚拟地址的偏移部分等于线性地址),再由分页对这4GB空间进行虚拟化。。 假设我们要让16位地址参与映射,实现64TB虚拟空间,就要注意线性地址不能 “ 冲突
” (在linux中,实际上线性地址是“ 冲突 ” 的,比如选择子为1,偏移为0xffff,和选择子为2,偏移为0xffff,都映射到一个线性地址0xffff),具体来说就是 线性地址由选择子和偏移地址共同唯一确定,但毕竟只有32位地址线,映射完4GB线性地址后,多出来的64TB-4GB的虚拟地址如何表示呢,答案是无法表示,那么会有问题吗,不会!因为这部分地址所在段的存在位是0。分页机制总的虚拟空间只有4GB,正好够32位数来表示,所以整个虚拟空间都能用线性地址表示出来,而在分段机制中,大于4GB的虚拟地址无法表示,但反正也不存在,所以对虚拟化实现没有影响,要用时,释放掉之前使用的一些线性地址,把大于4GB的那些虚拟地址映射过去就行了,总之,64TB虚拟空间中,能表示为线性地址的就4GB,其余的就无法表示且存在位为0。

到此为止。

时间: 2024-11-09 02:37:10

x86保护模式笔记的相关文章

x86保护模式

处理器架构实际上是不断扩展的,新处理器必须延续旧的设计思路,并保持兼容性和一致性:同时还会有所扩充和增强. 尽管8086是16位的处理器,但它也是32位架构内的一部分.原因在于,32为处理器架构是从8086那里发展来的,是基于8086的,具有延续性和兼容性. 寄存器的扩展 32位处理器在16位处理器的从基础上,扩展了这8个通用寄存器(AX,BX,CX,DX,SI,DI,BP,SP)的长度,使之达到32位. 32位通用寄存器的高16位是不可独立使用的,但低16位保持同16位处理器兼容性.因此,在任

程序的加载和执行(六)——《x86汇编语言:从实模式到保护模式》读书笔记26

程序的加载和执行(六)--<x86汇编语言:从实模式到保护模式>读书笔记26 通过本文能学到什么? NASM的条件汇编 用NASM编译的时候,通过命令行选项定义宏 Makefile的条件语句 在make命令行中覆盖Makefile中的变量值 第13章习题解答 复习如何构造栈段描述符 我们接着上篇博文说. 在我修改后的文件中,用到了条件汇编. 比如: %ifdef DEBUG put_core_salt: ;打印内核的符号 ... ... put_usr_salt: ;打印用户的符号 ... .

程序的载入和运行(五)——《x86汇编语言:从实模式到保护模式》读书笔记25

程序的载入和运行(五)--<x86汇编语言:从实模式到保护模式>读书笔记25 前面几篇博文最终把代码分析完了.这篇就来说说代码的编译.运行和调试. 1.代码的编译及写入镜像文件 之前我们都是在命令行输入命令进行编译和写入.源文件少的时候还不认为麻烦,当源文件多了,就会认为特别麻烦.有没有简单的方法呢? 当然有,就是用make工具. 1.1.什么是make工具 make是一个命令工具,它解释Makefile中的指令.在Makefile文件里描写叙述了整个project全部文件的编译顺序.编译规则

存储器的保护(一)——《x86汇编语言:从实模式到保护模式》读书笔记18

本文是原书第12章的学习笔记. 说句题外话,这篇博文是补写的,因为让我误删了,可恶的是CSDN的回收站里找不到! 好吧,那就再写一遍,我有坚强的意志.司马迁曰:“文王拘而演<周易>:仲尼厄而作<春秋>:屈原放逐,乃赋<离骚>:左丘失明,厥有<国语>:孙子膑脚,<兵法>修列:不韦迁蜀,世传<吕览>……”好了,不煽情了,进入正题. 第12章的代码如下. 1 ;代码清单12-1 2 ;文件名:c12_mbr.asm 3 ;文件说明:硬盘主引

存储器的保护(三)——《x86汇编语言:从实模式到保护模式》读书笔记20

存储器的保护(三) 改动本章代码清单,使之能够检測1MB以上的内存空间(从地址0x0010_0000開始,不考虑快速缓存的影响).要求:对内存的读写按双字的长度进行.并在检測的同一时候显示已检測的内存数量.建议对每一个双字单元用两个花码0x55AA55AA和0xAA55AA55进行检測. 上面的文字选自原书第12章的习题1. 这篇博文就讨论一下这道题.由于是初学,我不正确自己做太高的要求.仅仅要实现功能就可以. 代码清单 ;文件说明:第12章习题-1 ;创建日期:2016-3-7 ;------

《X86汇编语言 从事模式到保护模式》问题

书中的42页,监测点4.2第一题,代码如下: mov ax, 0xb800 mov ds, ax mov [0x00], 'a' mov [0x02], 's' mov [0x04], 'm' jmp $ 编译会报错 提示没有指定操作数长度,修改后为 mov ax, 0xb800 mov ds, ax mov byte [0x00], 'a' mov byte [0x02], 's' mov byte [0x04], 'm' jmp $ 然后用书中提供的工具fixvhdwr.exe写入到虚拟机的

Orange&#39;s笔记(2)保护模式(暂存)

1:GDT的第一项总为空,称为空段描述符,其结构如下: G:=0的时候段长度单位为字节 ,=1的时候单位为4096字节,所以段长度可以达到2的20(段接线2+段界限1)次方*4096=4GB DPL:描述符特权级,定义了被引用段的特权级,其值为0-3 S和TYPE:确定该段类型,S=1代码段和数据段描述符.s=0系统段描述符. 2:就WINDOWS而言,LDT是依个孤立的数据结构 3:GTDR是一个特殊的寄存器,它用来保存GDT的基地址,该寄存器的大小为48位,低16位存储GDT的大小,高32位

《X86汇编语言 从实模式到保护模式》bochs 配置教程(详细)

本文是写给<X86汇编语言 从实模式到保护模式>读者的一份Bochs配置指南. 我们要做的有: 1.下载并安装bochs 2.配置bochs 3.通过bochs调试虚拟硬盘 bochs的官方网址:http://bochs.sourceforge.net/ bochs的下载地址:http://sourceforge.net/projects/bochs/files/bochs/ 本书附带文件下载地址:https://files-cdn.cnblogs.com/files/leec/booktoo

ASM:《X86汇编语言-从实模式到保护模式》第12章:存储器的保护

12章其实是11章的拓展,代码基本不变,就是在保护模式下展开讨论. ★PART1:存储器的保护机制 1. 修改段寄存器的保护 当执行把段选择子传到段寄存器的选择器部分的时候,处理器固件在完成传送之前,要检查和确认选择子是正确的,并且该选择子选择的描述符也是正确的.假如索引号是正确的,也就是说明索引号8+7要小于等于边界.如果超过边界,那么处理器就会终止处理,产生异常中断13,同时段寄存器的原值保持不变. 同时处理器还要对描述符的类别进行检查,如果描述符的类别进行确认,举个例子来说,如果描述符的类