段寄存器

均为16位

寄存器功能

CS(code segment)代码段地址寄存器,存放代码段的起始地址

DS(data segment)数据段地址寄存器,存放数据段的起始地址

SS(stack segment)堆栈段地址寄存器,存放堆栈段的起始地址

ES(extra segment)附加段地址寄存器,存放附加段的起始地址

段选择符

实模式下的段寄存器(如cs,ss等)在保护模式下叫段选择子(Selector),用来存放段选择符

由于段选择子就是段寄存器是16位的,段选择符是16位的

段选择子包括三部分:描述符索引(index)、TI、请求特权级(RPL)。他的index(描述符索引)部分表示所需要的段的描述符在描述符表的位置,由这个位置再根据在GDTR中存储的描述符表基址就可以找到相应的描述符。然后用描述符表中的段基址加上逻辑地址(SEL:OFFSET)的OFFSET就可以转换成线性地址,段选择子中的TI值只有一位0或1,0代表选择子是在GDT选择,1代表选择子是在LDT选择。请求特权级(RPL)则代表选择子的特权级,共有4个特权级(0级、1级、2级、3级)。

index13位 TI1位 RPL2位

index索引用于寻找GDT或LDT中的段描述符的位置,所以能够保存在GDT中的段描述符数最大为2^13-1=8191

Linux的特权级只使用了0和2

例如给出逻辑地址:21h:12345678h转换为线性地址

a. 选择子SEL=21h=0000000000100 0 01b 他代表的意思是:选择子的index=4即100b选择GDT中的第4个描述符;TI=0代表选择子是在GDT选择;左后的01b代表特权级RPL=1

b. OFFSET=12345678h若此时GDT第四个描述符中描述的段基址(Base)为11111111h,则线性地址=11111111h+12345678h=23456789h

原文链接:https://blog.csdn.net/billpig/article/details/5833980

段描述符

段描述符8个字节(64位),存放在DGT或者LDT中,内部结构如下图

段式管理单元

程序过来一个逻辑地址,使用其段标识符(也即段选择符)的Index字段去索引段描述符表,若TI=0,索引全局段描述符表,TI=1,索引局部段描述符表,表的地址在相应的寄存器中。通过Index字段和段描述符表的位置能找到某项具体的段描述符。将段描述符中的base字段和逻辑地址中的offset字段合并即得到了线性地址。

Intel要求两次转换,这样虽说是兼容了,但是却是很冗余,呵呵,没办法,硬件要求这样做了,软件就只能照办,怎么着也得形式主义一样。

另一方面,其它某些硬件平台,没有二次转换的概念,Linux也需要提供一个高层抽像,来提供一个统一的界面。所以,Linux的段式管理,事实上只是“哄骗”了一下硬件而已。

按照Intel的本意,全局的用GDT,每个进程自己的用LDT——不过Linux则对所有的进程都使用了相同的段来对指令和数据寻址。即用户数据段,用户代码段,对应的,内核中的是内核数据段和内核代码段。

1234

__USER_CS index= 14 T1=0

__USER_DS index= 15 T1=0

__KERNEL_CS index= 12 T1=0

__KERNEL_DS index= 13 T1=0

T1均为0,则表示都使用了GDT,再来看初始化GDT的内容中相应的12-15项(arch/i386/head.S):

1234

.quad 0x00cf9a000000ffff /* 0x60 kernel 4GB code at 0x00000000 */

.quad 0x00cf92000000ffff /* 0x68 kernel 4GB data at 0x00000000 */

.quad 0x00cffa000000ffff /* 0x73 user 4GB code at 0x00000000 */

.quad 0x00cff2000000ffff /* 0x7b user 4GB data at 0x00000000 */

对照着段描述符的64位格式发现,四个段的基地址全为0。这样,给定一个段内偏移地址,按照前面转换公式,0 + 段内偏移,转换为线性地址,可以得出重要的结论,“在Linux下,逻辑地址与线性地址总是一致(是一致,不是有些人说的相同)的,即逻辑地址的偏移量字段的值与线性地址的值总是相同的。!!!”所以如果做linux下内核开发,对于上述的x86的段式管理可以完全不用理会,我们可以认为linux根本没有用intel弄出来的这个段式管理,而是以页式管理完成了所有的内存管理工作。

参考:Linux内核情景分析:45 深入理解Linux内核:73

linux 寄存器ss,段寄存器详解相关推荐

  1. linux服务器怎么查看cpu配置信息,linux服务器cpu信息查看详解

    在linux系统中,提供了/proc目录下文件,显示系统的软硬件信息.如果想了解系统中CPU的提供商和相关配置信息,则可以查/proc/cpuinfo.但是此文件输出项较多,不易理解.例如我们想获取, ...

  2. Linux文本编译工具VIM详解

    Linux文本编译工具VIM详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.VIM概述 1>.vim简介 1>.vi: 全称Visual editor,即文本编 ...

  3. 一站式linux0.11内核head.s代码段图表详解

    阅读本文章需要的基础: 计算机组成原理:针对8086,80386CPU架构的计算机硬件体系要有清楚的认知,我们都知道操作系统是用来管理硬件的,那我们就要对本版本的操作系统所依赖的硬件体系有系统的了解, ...

  4. Linux下的awk用法详解

    Linux下的awk用法详解 一.awk介绍 二.awk的语法 三.awk常见用法 四.awk其他用法 五.awk语言特性 一.awk介绍 1.AWK 是一种处理文本文件的语言,是一个强大的文本分析工 ...

  5. 汇编中的通用寄存器、标志寄存器、段寄存器

    通用寄存器: 寄存器和变量差不多,目的都是用于保存一些即将操作的数据 EAX(accumulator) 寄存器:扩展累加寄存器(一般在乘/除中会被主动调用),也可以用于其他用途 ECX(Count) ...

  6. linux脚本日期时间,Linux 日期和时间操作详解

    Linux 日期和时间操作详解 发布时间:2012-11-27 15:10:07   作者:佚名   我要评论 Linux将时钟分为系统时钟(System Clock)和硬件(Real Time Cl ...

  7. python定时任务crontab_【Python】Linux crontab定时任务配置方法(详解)

    CRONTAB概念/介绍 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行. cron 系统调度 ...

  8. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html IT168 技术文档]在开始步入Lin ...

  9. Linux Jump Label/static-key机制详解

    Linux Jump Label/static-key机制详解 RToax 2021年3 关于Linux Jump Label(x86)已经进行过概述,下面就static-key进行详述. 内核中有很 ...

最新文章

  1. 机器学习——使用Apriori算法进行关联分析
  2. eclipse断点调试 出现Source not found
  3. 【Python】在模仿中精进数据可视化09:近期基金涨幅排行可视化
  4. Spring学习-- SpEL表达式
  5. 管理服务器文件绿色版本,Services.msc服务器文件官方版
  6. linux脚本怎怎么屏蔽段落,怎么写shell脚本才能不耍流氓?
  7. java中tcp传图片_Java学习之TCP上传图片
  8. 【python】pyhton中的and
  9. matlab2c使用c++实现matlab函数系列教程-rank函数
  10. 第0章 Oracle的安装及相关配置
  11. JavaScript == 和 ===
  12. 股票交易数据下载 | 下载股票历史交易数据到本地Excel
  13. 正龙广告借接入平台实现财务集中管理
  14. OpenCore引导配置说明第十五版-基于OpenCore-0.6.8-04-06正式版
  15. SQL-(增)-插入操作
  16. 10款最赞的ROS机器人操作系统课程+为何ROS不是必须的
  17. 有限元分析及运用课程笔记第一章:引论
  18. 新机器部署linux系统(非虚拟机)
  19. Git 换行符自动转换
  20. 实验:网络常见的9个命令

热门文章

  1. win下使用TensorFlow object detection训练自己模型
  2. linux dhclient源码 多进程,Linux日志中出现大量dhclient mesage浅析,
  3. 四国军棋之故意式迟钝
  4. 搜狗输入法输入汉字时候选栏乱码
  5. 半导体(芯片制造)材料概述
  6. Mobile APP(Apple IOS app store)特性分析
  7. Echarts实现X轴拖动显示效果
  8. webgl天空盒边界缝隙_OPENGL中天空盒缝隙消除的解决办法
  9. 神经网络学习(1)————单层感知器以及python实现
  10. Unity3D图片质量设置