开发者社区> 长烟慢慢> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Linux 存储管理3——地址映射全过程

简介: 假定一条程序已经运行,整个映射机制都已建立好,并且cpu正在执行main()中的:call 08048368 这条指令,要转移到虚拟地址0x08048368去。接下来我们分析整个地址映射的过程: 首先是段式映射阶段。
+关注继续查看

假定一条程序已经运行,整个映射机制都已建立好,并且cpu正在执行main()中的:call 08048368 这条指令,要转移到虚拟地址0x08048368去。接下来我们分析整个地址映射的过程:

首先是段式映射阶段。由于地址0x08048368是一个程序的入口,更重要的是在执行的过程中是由cpu中的“指令指针寄存器(用于存储下次将要执行的指令在代码段中的偏移量)”EIP所指向的代码段中。因此i386 CPU使用代码段寄存器CS的当前值来作为段式映射的“选择码”,也就是用它作为在段描述表中的下标。

什么是段描述表呢?什么是全局段描述表GDT?什么是局部段描述表LDT?

我们先回顾一下保护模式下段寄存器的格式:


也就是说,bit2(TI=Table Indicator:指示器)为0时表示用GDT,为1时表示用LDT。intel的设计意图是内核用GDT而各个进程都用其自己的LDT,最后两位RPL为所要求的特权级别,分为4个级别,0为最高级。(一般内核为0级,用户未3级)

现在可以来看看CS的内容了,内核在建立一个进程时都要将其段寄存器设置好,有关代码如下:


这里reg->xds 是段寄存器DS的映像,一次类推,这里可以看到一个有趣的事,就是除了CS被置成USER_CS之外,其他所有的段寄存器都设置成USER_DS,你看,比如堆栈寄存器SS,也被设置成了USER_DS,这说明了什么呢?这说明:虽然Intel的意图是将一个进程映像分成代码段、数据段、和堆栈段,但是,linux内核却并不买这个帐,在linux中堆栈段和数据段式不分的。

上面说寄存器的映像,被设置成了USER_CS和USER_DS到底是什么:


也就是说,Linux内核中只使用四种不同的段寄存器数值,两种用于内核本身,两种用于所有的进程。现在我们讲这四种数值用二进制展开并与段寄存器的格式相对照:


首先TI都是0,也就是说全部使用GDT。这就与Intel的设计意图不一致了。实际上,在Linux内核中基本上不使用局部段描述表LDT。LDT只是在VM86模式中运行wine以及其它在Linux上模拟Windows软件或DOS软件的程序中才使用。

再看RPL,只用了0和3两级,内核为0级而用户(进程)为3级。

回到我们的程序中。我们的程序显然不是内核程序,所以在进程的用户空间运行,内核在调度该进程进入运行时,把CS设置成_USER_CS即0x23。所以,CPU以4为下标,从全局扫描表GDT中找对应的段描述项








版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Linux 服务器建站新手教程不需要敲一行命令【新手小白篇】
Linux 服务器配置、运行、不用敲命令 WordPress 建站攻略——助力新手快速利用Linux系统建立属于自己的站点——给新手节省宝贵的时间,避免采坑!
598 0
linux服务器上用docker的一些命令
以下是把一个NET CORE项目弄到LINUX服务器上的一些记录,NET CORE+MYSQL+MONGODB+REDIS, 不知道为什么买的云LINUX服务器直接安装MYSQL好慢好慢,只好用DOCKER来弄了,不过NET CORE项目代码还是在宿主机,
184 0
Progress进度查看器是一个可以显示Linux命令的工具
Progress进度查看器是一个可以显示Linux命令的工具
640 0
linux 内存清理释放命令
linux 内存清理/释放命令 1.清理前内存使用情况  free -m 2.开始清理  echo 1 > /proc/sys/vm/drop_caches3.清理后内存使用情况 free -m4.
1160 0
常用的linux系统监控命令整理
找到最耗CPU的java线程ps命令 命令:ps -mp pid -o THREAD,tid,time 或者 ps -Lfp pid 结果展示:   这个命令的作用,主要是可以获取到对应一个进程下的线程的一些信息。
11571 0
Linux下的两个聊天命令的使用方法
一、 write用法:write 用户名;敲回车后,自己和对方将会同时处于聊天的状态,但是被发起连接的人只能收到发起聊天请求的人的聊天内容,但是不能回复,如果想要回复的话必须先向对方发起连接,这样以来两个人就可以聊天了,注意root可以向任何发起连接,但是其它人是不能向root发起连接的,默认情况下root的message 是disabled的。
704 0
Linux系统信息查看命令
系统 # uname -a #查看内核/操作系统/CPU信息 # head -n 1 /etc/issue #查看操作系统版本 # cat /proc/cpuinfo #查看CPU信息 # hostname #查看计算机名 # lspci -tv #列出所有PCI设备 # lsusb -...
918 0
Linux Shell : Test命令参数解析
格式: test conditions test -n string : string 不为空 test -z string : string 为空 test int1 -eq int2  : int1 == int 2test int1 -ne int2  : int1 != int2 te...
814 0
+关注
长烟慢慢
系统架构师
814
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载