linux 内核源代码情景分析——Intel X86 CPU 系列的寻址方式
当我们说一个CPU是“16位”或“32”位时,指的是处理器中“算数逻辑单元”(ALU)的宽度。数据总线通常与ALU具有相同的宽度。当Intel决定在16位CPU 8086中采用1M字节的内存空间,地址总线的宽度也就确定了,那就是20位。问题就来了:既然是ALU是16位,也就是说直接加以运算的指针长度是16位,即这个指针所能代表的地址最多有216,不能达到20位地址总线所能寻址的最大空间,于是Intel在8086 CPU中设置了4个“段寄存器”:CS、DS、SS和ES,分别用于可执行代码、数据、堆栈和其他。每个段寄存器都是16位的,对应于地址总线中的高16位。每条“访内”指令中的“内部地址”都是16位的,但是在送上地址总线之前都在CPU内部自动的与某个段寄存器的内容相加,形成一个20的实际地址。这样,就实现了从16位内部地址到20位实际地址的转换。转换公式:实际地址 = 段寄存器 + (内部地址<<4)。
由于8086这种到内存寻址方式缺乏对内存空间的保护,所以为了区别于后来的“保护模式”,就称为“实地址模式”。针对8086这种缺陷,Intel从80286开始实现“保护模式”,不久后80386 CPU也开发成功了,从80386以后,虽然在速度和功能上不断的提改进,但并无重大的质的改变,遂统称为i386结构,下面我们将以80386为背景,介绍i386的保护模式。
1、虚拟地址、逻辑地址、线性地址、物理地址的区别

由图可以看出它们之间的区别
2、分段机制

分段步骤:
1)先检查段选择符TI,确定段描述符保存在GDTR还是LDTR中
2)从段选择符高13位(见下图的段选择符格式)* 8 + GDTR中的内容得到段基地址。也可以这样想,GDTR存放的是段描述符表这个数组的首地址,而段选择符的高13位*8是其下标,因为段描述符是8字节长,所以在段描述表里是以8字节为一个单位
3)然后将2)得到的值与偏移量相加就得到了线性地址
3、段选择符格式

GDT的第一项是”空选择符“(即索引值为0,TI标志为0),当把它加载到一个段寄存器(除了CS和SS之外)中时,处理器不会产生异常,但是当使用含有空选择符的段寄存器访问内存时就会产生异常。段选择符的值通常由链接编辑器或链接加载程序进行设置或修改,而非应用程序.
为了减少地址转换时间和复杂性,处理器提供了6个段寄存器,为了访问某个段的程序,必须把段选择符加载到一个段寄存器中,为了避免每次访问内存时都去读、解码一个段描述符和引用段描述符表,每个段寄存器都有一个“可见”部分和“隐藏”部分(影子寄存器),当一个段选择符被加载到一个段寄存器可见部分中时,处理器也同时把段选择符指向的段描述符中的段地址、段限长和访问控制信息加载到段寄存器的隐藏部分中。缓冲在段寄存器(可见和隐藏部分)中的信息时的处理器可以在进行地址转换时不再需要花费时间从段描述符中读取基地址和段限长。操作系统必须保证对描述符表的改动反映到影子寄存器中,最简单的方法是在对描述符表中描述符作过任何改动之后就立刻重新加载6个段寄存器
4、段描述符格式

B31——B24、B23——B16、B15——B0组合成段基地址Base,Base为32位
L19——L16、L15——L0组合成段限长Limit,Limit为20位
G颗粒度,G=0,Limit单位是字节,G=1,Limit单位是4KB
D 如果段偏移量是32位置1,若是16位,清0
AVL 系统软件可用位,忽略
P为0表示不在内存中,linux总是为1
DPL 表示为访问这个段而要求的CPU最小的优先级
S系统标志:0表示是一个系统段,否则是普通的代码段或数据段
type 指定段的类型、说明段的访问种类以及段的扩展方向
linux 内核源代码情景分析——Intel X86 CPU 系列的寻址方式的更多相关文章
- Linux内核源代码情景分析系列
http://blog.sina.com.cn/s/blog_6b94d5680101vfqv.html Linux内核源代码情景分析---第五章 文件系统 5.1 概述 构成一个操作系统最重要的就 ...
- Intel X86 CPU 系列的寻址方式
Intel X86 CPU 系列的寻址方式 数据总线和地址总线要尽量相同,这个是一个地址就是一个指针.
- linux 内核源代码情景分析——地址映射的全过程
linux 内核采用页式存储管理.虚拟地址空间划分成固定大小的"页面",由MMU在运行时将虚拟地址映射成某个物理内存页面中的地址.页式内存管理比段式内存管理有很多好处,但是由于In ...
- Linux内核源代码情景分析-fork()
父进程fork子进程: child = fork() fork经过系统调用.来到了sys_fork.具体过程请參考Linux内核源码情景分析-系统调用. asmlinkage int sys_fork ...
- linux 内核源代码情景分析——linux 内存管理的基本框架
386 CPU中的页式存管的基本思路是:通过页面目录和页面表分两个层次实现从线性地址到物理地址的映射.这种映射模式在大多数情况下可以节省页面表所占用的空间.因为大多数进程不会用到整个虚存空间,在虚存空 ...
- linux 内核源代码情景分析——linux 内核源代码中的C语言代码
linux 内核的主体是以GNU的C语言编写的,GNU为此提供了编译工具gcc.GNU对C语言本身作了不少扩充. 1) gcc 从 C++ 语言中吸收了"inline"和" ...
- linux 内核源代码情景分析——用户堆栈的扩展
上一节中,我们浏览了一次因越界访问而造成映射失败从而引起进程流产的过程,不过有时候,越界访问时正常的.现在我们就来看看当用户堆栈过小,但是因越界访问而"因祸得福"得以伸展的情景. ...
- linux 内核源代码情景分析——linux 内核源码中的汇编语言代码
1. 用汇编语言编写部分核心代码的原因: ① 操作系统内核中的底层程序直接与硬件打交道,需要用到一些专用的指令,而这些指令在C语言中并无对应的语言成分: ② CPU中的一些特殊指令也没有对应的C语言成 ...
- Linux内核源代码情景分析-中断半
一.中断初始化 1.中断向量表IDT初始化 void __init init_IRQ(void) { int i; #ifndef CONFIG_X86_VISWS_APIC init_ISA_irq ...
随机推荐
- DEDE判断当前是否有下级栏目,有就显示所有下级栏目,没有就显示同级栏目!
{dede:channel name='type' runphp='yes' if(reid == "0") @me = "son";else @me = &q ...
- Jmeter系列(10)- Linux环境安装之Jmeter下载配置
step-1下载 我是之前windows有,就直接copy到Linux系统了 step-2Jmter放到local目录 mv apache-jmeter-5.2.1 /usr/local/ step- ...
- DevOps与CICD简介
整体知识点 ·Devops与CI/CD简介 ·Gitlab安装与Git命令使用 ·Gitlab实现持续集成 ·Gitlab实现分支管理 ·Jenkins简介及安装 ·Jenkins插件管理及基础配置 ...
- linux环境下,使用Navicat连接mysql时,提示本地IP无法连接虚拟环境下的mysql解决方案
在Linux环境下,使用Navicat连接mysql时,提示本地IP无法连接虚拟环境下的mysql,提示如下: 而导致连接错误的原因是MYSQL没有开启远程登录权限. 解决方案: 在mysql命令中执 ...
- P3190-[HNOI2007]神奇游乐园【插头dp】
正题 题目链接:https://www.luogu.com.cn/problem/P3190 题目大意 \(n*m\)的网格上有权值,求一条权值和最大的不交回路. \(1\leq n\leq 100, ...
- Chrome浏览器启动参数大全(命令行参数)
前言 在开发Web项目当中,浏览器必不可少,而浏览器的启动参数可以帮我们实现很多功能. 常用参数 常用参数请参考下表. 序号 参数 说明 1 --allow-outdated-plugins 不停用过 ...
- 查看显卡报错:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
当输入nvidia-smi时出现 NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make ...
- SpaCy下载及安装
SpaCy可以说是坑多到怀疑人生.. 但是看在它那么功能那么强大的份上,我还是决定原谅它哈哈哈~ 1.首先用官网给的命令快速安装纯属扯淡..(结果就是一直拒绝你的连接) 官网:https://spac ...
- 细说JUC的线程池架构
前言 线程的创建是需要JVM和OS(操作系统)相互配合的,一次的创建要花费许多的资源. 1.首先,JVM要为该线程分配堆栈和初始化大量内存块,栈内存至少是1MB. 2.其次便是要进行系统的调用,在OS ...
- BIBD&SBIBD的矩阵题
证明不存在 \(01\) 方阵 \(A\) 使得: \(A^TA=\begin{pmatrix}7&2&\dots &2\\2&7&\dots&2\\ ...