随想录(386cpu保护模式)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
写过操作系统的同学都知道,编写os除了基础的操作系统理论之外,最大的工作就是需要阅读cpu手册。注意,这里提到的是cpu手册,不是soc手册。比如说,s3c2416是三星的芯片,大家拿到的一般是这款芯片的soc手册,但是如果需要查找arm的相关信息,还是应该去arm的官网看arm7、arm9的相关手册。学习linux也是一样,最早期的os都是在386完成的,所以对于pc底层开发的人员来说,386怎么学习都不过。
1、386工作模式
386有两种工作模式,一种是实模式,访问地址空间只有1M;另外一种是保护模式,访问空间有4G。
2、访问地址的方法有什么不同
实模式下,地址就是段寄存器 << 4 + 偏移地址
保护模式下,地址就是GDT+ 段寄存器基地址 + Page分页 + MMU表
一般GDT表中的前四个描述符write后不能修改
3、GDT、LDT、IDT是什么
GDT是一张表,每个选项8个字节,一般用lgdt载入,输入为一个基地址,它存储了GDT表的基地址和长度,共48位
LDT就是GDT里面的一个选项,一般用lldt载入,输入为一个段寄存器索引
IDT也是一张表,每个表也是8个字节,一般用lidt载入,输入为一个基地址,它存储了IDT表的基地址和长度,也是48位
注意:如果是实模式,那么中断向量表是在0x0的位置
void init()
{unsigned char gdt_base[6];unsigned char idt_base[6];__asm {lgdt gdt_baselidt idt_basemov ax, 0x10lldt axsgdt gdt_basesidt idt_base}
}
4、段寄存器索引
在保护模式下,cs、ds、ss、es、fs、gs退化成一个索引。但是由于索引低3位保存了属性,所以如果需要检查段描述符的数值,可以直接GDT基地址 + 段寄存器来完成。同时,段寄存器也记录了当前访问的是LDT,还是GDT。
5、段寄存器的修改
cs外的寄存器都可以通过类似mov es/gs/ds/fs/ss ax这种方式来赋值
而cs寄存器只能通过jmp来完成,比如可以用es赋值给cs,start赋值给ip
__asm {start:jmp es:start}
6、其他寄存器
386下面有dr0、dr1、dr2、dr3、dr4等调试寄存器,对于理解软件调试很有帮助
除此之外,还有mmx、sse等多媒体指令,主要用于性能加速
__asm {mov eax, dr0mov eax, dr1mov eax, dr2mov eax, dr3}
7、CALL门
作为GDT表的一个段描述符存入,用段寄存器访问,但是里面的属性、内容不同
CALL门会使用到两个段描述符,这是稍微一点不同的地方
CALL门和jump使用广泛,不同的优先级别会导致不同的压栈方法,需要注意下
这种门描述符,一般不涉及具体的地址,它需要和一个段选择符绑定在一起。
8、TSS和任务门
用一块内存记录TSS下的寄存器布局内容(全局变量就可以),接着用一个GDT段描述符记录这块空间,最后用ltr指令 + 段寄存器进行加载。TSS和多任务绑定在一起,任务的切换,会导致GDT/LDT和TR寄存器的更新。一般GDT负责整个系统的布局,LDT负责线程空间的分布,而TR就是每个线程的上下文。TSS表示一段空间保存寄存器数据,而任务门表示一个任务状态。每个任务可以都有一个属于自己的TSS。
__asm {mov eax, 0x10ltr eax}
jump到LDT中的任务门或者GDT中的某个TSS都会产生上下文切换。TSS中的地址也会保存在TCB信息头当中。所有的操作都是硬件帮忙完成的,软件做的其实就是切换了一下tr寄存器。
9、CPL、RPL、DPL
CPL表示当前段寄存器的优先级,一般特指cs中的优先级
RPL表示拟使用的优先级,表示cs外其他段寄存器的优先级
DPL表示段描述符的优先级,表示GDT表中描述符的优先级
10、如何进入保护模式
开启A20 + cr0 pe位置起
11、如何分页
开启cr0 pg位 + 设置cr3寄存器,即MMU的目录首地址
在此之前,应该准备好表目录和页目录,可以用GDT的描述符生成,一个段描述符对应一个目录
初始化好就可以
MMU里面的表目录、页目录属性特别多,用到的时候学就可以了。
保护模式默认是分段模式,分页模式开启后,cpu会再做一次MMU的映射工作,这就是它的基本原理。
__asm {mov eax, cr0mov cr0, eaxmov eax, cr3mov cr3, eax}
12、如何eflags置位
__asm {pushfdpop eaxor eax,0x1push eaxpopfd}
13、输入输出
in、out指令
__asm {mov dx, 0x1234in ax, dxout dx, ax}
14、系统调用
int 15/ int 21等等,通过系统调用可以让cpu从用户模式跳入内核模式
__asm {int 10int 15int 21}
15、tlb和cache问题
查找对应汇编指令解决,参考IA32 Architecture Developer‘s Manual II
还有一种方法就是参考linux 386 cpu抑制部分的代码
16、参考资料有哪些
IA32 Architecture Developer‘s Manual I,II, III
<自己动手写操作系统>中第二章
<linux 0.11完全解析>
<X86 汇编语言 从实模式到保护模式>
17、主要的分析工具
qemu + gcc + binutils 等工具
PS:
从上面的描述也知道,数据空间 + 段描述符 + 段寄存器是保护模式学习的重中之重。理解了这个,其他概念都可以迎刃而解。当然,有了概念的理解还是不够的,最好利用qemu实践一下,或者找一些开源代码,比如ucore,实际操作一把,效果更好。
对于操作系统来说,OS不一定会使用到全部cpu特性。即使像linux这样大的系统,他们使用到的也只是一个通用的cpu特性,只要满足指令集、寄存器、输入输出、异常、中断、MMU、cache、多 core通信这些基本功能就行了。
随想录(386cpu保护模式)相关推荐
- 操作系统学习:实模式进入保护模式
本文参考书籍 1.操作系统真相还原 2.Linux内核完全剖析:基于0.12内核 3.x86汇编语言 从实模式到保护模式 ps:基于x86硬件的pc系统 保护模式相关介绍 从实模式进入保护模式其实经历 ...
- x86汇编语言从实模式百度云_Intel x86 CPU 32位保护模式杂谈之任务切换 上
目录: 什么是任务 任务由什么组成 任务门描述符是什么东东?有了TSS描述符为什么要有任务门描述符? 参考文献 什么是任务 任务(task)是处理器可以分配.执行.挂起的工作单位,笔者认为和我们操作系 ...
- IA-32系统编程指南 - 第三章 保护模式的内存管理【1】
第三章 保护模式的内存管理[1] [作者:lion3875 原创文章 参考文献<Intel 64 and IA-32 system programming guide>] IA-32保护模 ...
- x86CPU 实模式 保护模式 傻傻分不清楚? 基于Xv6-OS 分析CR0 寄存器
基于Xv6-OS 分析CR0 寄存器 之前一直认为晕乎乎的...啥?什么时候切换real model,怎么切换,为什么要切换? ------------------------------------ ...
- 保护模式下中断或异常示意图
保护模式下中断或异常示意图 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/08/24/3845741.html
- 深入了解Intel保护模式
学习逆向工程也快一年的时间了,从开始的16位实模式下的内存寻址模型到32位下保护模式内存的模型,实模式下的较为简单,段地址*16+偏移地址就是寻址的内存,但是保护模式下就远远没有这么简单了.很简单的一 ...
- ASM:《X86汇编语言-从实模式到保护模式》第10章:32位x86处理器的编程架构
★PART1:32位的x86处理器执行方式和架构 1. 寄存器的拓展(IA-32) 从80386开始,处理器内的寄存器从16位拓展到32位,命名其实就是在前面加上e(Extend)就好了,8个通用寄存 ...
- 实模式与保护模式详解二:地址映射
论8086如何寻址1MB物理空间 8086内部的寄存器都是16位的,但它有20位地址总线,可以寻址1MB的物理空间 将1MB的储存器按64KB分段,为什么按64KB分是因为16位最大的寻址范围就是下2 ...
- 实模式与保护模式详解一:寄存器
基本寄存器 在了解实模式与保护模式区别之前,先介绍一下几个基本的寄存器 通用寄存器 寄存器组中有8个32位寄存器,属于CPU内的寄存器,也称通用寄存器,按照用途可以分为数据寄存器组和指示器变址寄存器 ...
最新文章
- css 图片居中放大,不同比例图片居中缩放显示的三种方法
- 金融产品京东金融2015年战略主攻三大方向:股权众筹、农村金融和校园金融...
- UA OPTI501 电磁波3 SI单位制与电磁学常用单位
- c 数据压缩算法_CCSDS图像压缩算法之我见(一)
- 火狐插件youdao word capturer无法删除。
- Frog Jumps CodeForces - 1324C(二分)
- Tensorflow Estimator之LinearRegressor
- python接口自动化21-下载excel文件(Content-Type:octets/stream)
- 小程序好看的表单样式
- cydia红字解决方法(cydia安装软件时出现红字怎么解决)
- linux 中gnu的含义是,GNU是什么意思
- 【Kaggle 教程】Data Visualization 数据可视化-画图-各种图
- 音视频篇 - Android 音视频涉及到的技术
- 关于Raster的理解
- 阿里云播放器SDK的正确打开方式 | Aliplayer Web播放器介绍及功能实现(三)
- 一例所有文件都打不开的数据恢复过程
- CorelDRAWX8新功能摆脱传统工作模式
- NMF学习练习:做电影推荐
- 如何完成个人支付接口申请?
- 海康威视Sdk的demo成功运行