linux0.11中jmpi 0,8解析

        系统在执行该行代码时已经为保护模式, jmpi 0,8会将段选择子(selector)载入cs段寄存器,并计算出逻辑地址。

段选择子的结构如下:

段选择子包括三部分:描述符索引(index)、TI、请求特权级(RPL)。

  • index(描述符索引)部分表示所需要的段的描述符在描述符表的位置,由这个位置再根据在GDTR中存储的描述符表基址就可以找到相应的描述符。
  • TI表示描述符表的类型,0=GDT,1=LDT
  • RPL--请求等级,有0,1,2,3四个取值,权限从大到小。

在jmpi 0,8中,段选择子的值为8。按照二进制表示即为1000,那么

TI = 0          --GDT表
RPL = 0         --内核级访问权限
INDEX = 1       --GDT表第二个元素,从0开始

而段寄存器的格式如下:

Struct SegMent{
WORD	Selector段选择子;//16位selector
WORD	Attribute;//16位的Attribute
DWORD	Base;//32位的Base
DWORD	Limit	//32位的Limit
};

 那么上述的selector会被加载到段寄存器cs的selector部分,而段寄存器的不可见部分相当于缓存,它会将查询到的段的信息(段基值,段限长,可读可写等属性)缓存起来,当下次仍然用同样的段选择子去查询时就不用再查表,就直接用缓存的部分,相当于提高了执行效率,当然这个只是和该文主题没有半毛钱关系,仅仅记录。

接下来就要去GDT表中查找段的信息,那GDT表到底长什么样子?以下是GDT表中元素的排列情况,可以看到内代码段和数据段描述符分别为GDT表的第一和第二个元素。

GDT表中每个元素定义如下:

                                                                  图1

 G表示段界限粒度,为0时表示粒度为1字节,为1时表示粒度为4KB,一般置为1

 S表示是否为系统段,为1时表示系统段,为0时表示非系统段

可以看出每个段描述如占用8字节,即4个字

有了以上定义,只要知道其中的数据排列就能得出每个段的段基值和段界限,在源码中找到如下定义:

;// 全局描述符表开始处。描述符表由多个8 字节长的描述符项组成。
;// 这里给出了3 个描述符项。第1 项无用,但须存在。第2 项是系统代码段
;// 描述符(208-211 行),第3 项是系统数据段描述符(213-216 行)。每个描述符的具体
;// 含义参见列表后说明。
gdt:dw	0,0,0,0		;// 第1 个描述符,不用。
;// 这里在gdt 表中的偏移量为08,当加载代码段寄存器(段选择符)时,使用的是这个偏移值。dw	07FFh		;// 8Mb - limit=2047 (2048*4096=8Mb)dw	0000h		;// base address=0dw	9A00h		;// code read/execdw	00C0h		;// granularity=4096, 386
;// 这里在gdt 表中的偏移量是10,当加载数据段寄存器(如ds 等)时,使用的是这个偏移值。dw	07FFh		;// 8Mb - limit=2047 (2048*4096=8Mb)dw	0000h		;// base address=0dw	9200h		;// data read/writedw	00C0h		;// granularity=4096, 386

那么jmpi 0,8中的index=1所指向的段描述符的内容如下:

	dw	07FFh		;// 8Mb - limit=2047 (2048*4096=8Mb)dw	0000h		;// base address=0dw	9A00h		;// code read/execdw	00C0h		;// granularity=4096, 386

 按照图1中进行排列,注意按照小端格式排列:

经过组合

                     段基值为  0x00000000 = 0

                     段限长为 0x007FF = 2047, 即2048 * 4KB = 8M

此处为什么要+1,应该是一种约定。另外G=1,就表示段界限单位为4KB.  另外也可以得出段界限的最大空间为

(0xFFFFF + 1) * 4KB = 4GB

那么最后可以得出jmpi 0,8所要跳转到的物理地址为

                 base(0) + ip(0) = 0

此地址处就是操作系统核心的head.s文件存放在内存中的地址。此处的地址需要经过MMU转换吗?系统在现在的执行阶段,其实还没有开启分页机制,那么该0其实就是真实的物理地址。这些都是由CR0寄存器决定的, 可以把它认为是一个动态配置。CR0寄存器格式如下:

 Protection Enable(保护使能)是CR0寄存器的第0位(bit 0)。当设置了PE标志时,启用保护模式;当清除PE标志时,启用实地址模式。该标志位并不直接启用分页机制,它仅启用段级别的保护。要启用分页,必须同时设置PE和PG标志。

Paging(分页)标志位是CR0寄存器的第31位。当该位被设置时(为1时),启用分页机制;当该位被清除时(为0时),禁用分页机制。当分页被禁用时,所有线性地址都被视为物理地址。也就是说没有分页机制,段机制通过段基址加偏移后就是真实物理地址,如果PE标志(寄存器CR0的第0位)未设置,PG标志则没有影响;在PE标志被清除时设置PG标志会导致通用保护异常(#GP)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/782205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC常见面试题

1:Spring mvc执行流程 回答: 版本1:视图版本,jsp 用户发送出请求到前端控制器DispatcherServletDispatcherServlet收到请求调用HandlerMapping(处理映射器)HandlerMapping找到具体的处理器,生成处理器对象及处理器拦…

二十四种设计模式与六大设计原则(一):【策略模式、代理模式、单例模式、多例模式、工厂方法模式、抽象工厂模式】的定义、举例说明、核心思想、适用场景和优缺点

目录 策略模式【Strategy Pattern】 定义 举例说明 核心思想 适用场景 优缺点 代理模式【Proxy Pattern】 定义 举例说明 核心思想 适用场景 优缺点 单例模式【Singleton Pattern】 定义 举例说明 核心思想 适用场景 优缺点 多例模式【Multition Pattern】…

C# 微软官方学习文档

链接:https://learn.microsoft.com/zh-cn/dotnet/csharp/ 在C#的学习过程中,我们可以参考微软官方的学习文档。它是一个免费的学习平台,提供了丰富的C#学习路径和教程(如下图),对我们入门到高级应用开发都…

Intellij IDEA / Android studio 可持续开发笔记

Intellij 的Java/安卓工具链有着一种不可持续性,这种不可持续性体现在多个方面。 首先是不可持续运行。IDEA 使用时间越长,内存占用越大,从不主动释放。运行时间越长,日志越多,从不主动清理。 然后是不完整的开源&am…

用html实现一个手风琴相册设计

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>手风琴相册设计</title><link rel"stylesheet" href"./style.css"> </head> <body> <h1>Accordio…

Linux 著名的sudo、su是什么?怎么用?

一、su 什么是su&#xff1f; su命令&#xff08;简称是&#xff1a;substitute 或者 switch user &#xff09;用于切换到另一个用户&#xff0c;没有指定用户名&#xff0c;则默认情况下将以root用户登录。 为了向后兼容&#xff0c;su默认不改变当前目录&#xff0c;只设…

【蓝桥杯第十三届省赛】(部分详解)

九进制转十进制 #include <iostream> #include<math.h> using namespace std; int main() {cout << 2*pow(9,3)0*pow(9,2)2*pow(9,1)2*pow(9,0) << endl;return 0; }顺子日期 #include <iostream> using namespace std; int main() {// 请在此…

分布式理论:CAP理论 BASE理论

文章目录 1. CAP定理1.1 一致性1.3 分区容错1.4 矛盾 2. BASE理论3. 解决分布式事务的思路4. 扩展 解决分布式事务问题&#xff0c;需要一些分布式系统的基础知识作为理论指导。 1. CAP定理 Consistency(一致性): 用户访问分布式系统中的任意节点&#xff0c;得到的数据必须一…

python超详细知识点汇总整理

1、注释以及编码格式的声明 单行注释&#xff1a;# &#xff08;后面放上被注释的内容&#xff09;多行注释&#xff1a;字符段落的上下加上三引号 举个例子: ‘’’ …‘’’编码格式的声明&#xff1a;#coding:utf-8 或者是 #codingutf-8 2、代码编写格式和一些琐碎说明 同…

大数据设计为何要分层,行业常规设计会有几层数据

大数据设计通常采用分层结构的原因是为了提高数据管理的效率、降低系统复杂度、增强数据质量和可维护性。这种分层结构能够将数据按照不同的处理和应用需求进行分类和管理&#xff0c;从而更好地满足不同层次的数据处理和分析需求。行业常规设计中&#xff0c;数据通常按照以下…

暴力破解pdf文档密码

首先安装pdfcrack工具包 apt install pdfcrack 默认密码字典存储在/usr/share/wordlists里&#xff0c;是gz文件&#xff0c;将它解压并copy到pdf目录 然后使用pdfcrack破解 密码在最后一行user-password的单引号里

Python面对对象 - 类的反射机制

Python面对对象类的反射机制是面向对象编程语言中比较重要的功能&#xff0c;可以动态获取对象信息以及动态调用对象。通过字符串形式的类名或属性来访问对应类或属性。 一、对象的反射 1. getattr 获取指定字符串名称的对象属性、方法&#xff1a; 当访问的属性不存在时&#…

【四】【单片机】蜂鸣器,蜂鸣器模块化编程 1000HZ 鸣响 ms 毫秒,利用定时器让蜂鸣器以特定频率响 ms 毫秒

蜂鸣器模块化编程 1000HZ 鸣响 ms 毫秒 //Buzzer.h #ifndef __BUZZER_H__ #define __BUZZER_H__void Buzzer_Time(unsigned int ms);#endifBuzzer.h文件中只含有一个Buzzer_Time函数&#xff0c;这个函数用来让蜂鸣器以1000HZ固定频率发声ms毫秒。 //Buzzer.c #include <REG…

Python学习(二)

数据容器 数据容器根据特点的不同&#xff0c;如&#xff1a; 是否支持重复元素是否可以修改是否有序&#xff0c;等 分为5类&#xff0c;分别是&#xff1a; 列表&#xff08;list&#xff09;、元组&#xff08;tuple&#xff09;、字符串&#xff08;str&#xff09;、集…

09_Web组件

文章目录 Web组件Listener监听器ServletContextListener执行过程 Filter过滤器Filter与Servlet的执行 案例&#xff08;登录案例&#xff09; 小结Web组件 Web组件 JavaEE的Web组件&#xff08;三大Web组件&#xff09;&#xff1a; Servlet → 处理请求对应的业务Listener →…

Linux利用Jenkins部署SpringBoot项目保姆级教程

在当今快速发展的软件开发领域&#xff0c;持续集成和持续部署&#xff08;CI/CD&#xff09;已经成为提升开发效率、缩短产品上市时间的关键实践。Linux系统以其稳定性和开源友好性&#xff0c;成为众多开发者和企业的首选平台。而Spring Boot&#xff0c;作为一个轻量级的Jav…

飞天使-k8s知识点28-kubernetes散装知识点5-helm安装ingress

文章目录 安装helm添加仓库下载包配置创建命名空间安装 安装helm https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gztar -xf helm-v3.2.3-linux-amd64.tar.gzcd linux-amd64mv helm /usr/local/bin修改/etc/profile 文件&#xff0c;修改里面内容,然后重新启用export PATH$P…

深入理解 Hadoop 上的 Hive 查询执行流程

在 Hadoop 生态系统中&#xff0c;Hive 是一个重要的分支&#xff0c;它构建在 Hadoop 之上&#xff0c;提供了一个开源的数据仓库系统。它的主要功能是查询和分析存储在 Hadoop 文件中的大型数据集&#xff0c;包括结构化和半结构化数据。Hive 在数据查询、分析和汇总方面发挥…

如何使用 Python 本地客户端操作读写云服务器 Redis 缓存数据库详细教程(更新中)

Redis 基本概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的使用 ANSI C 语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库&#xff0c;并提供多种语言的 API。它通常被称为数据结构服务器&#xff0c;因为值&#xff08;value…

本地虚拟机服务器修改站点根目录并使用域名访问的简单示例

说明&#xff1a;本文提及效果是使用vmware虚拟机&#xff0c;镜像文件是Rocky8.6 一、配置文件路径 1. /etc/httpd/conf/httpd.conf #主配置文件 2. /etc/httpd/conf.d/*.conf #调用配置文件 调用配置文件的使用&#xff1a; vim /etc/httpd/conf.d/webpage.conf 因为在主配…