操作系统开启分段并进入保护模式

news2024/11/17 13:52:17

在这里插入图片描述

段基地址

32位的地址,如果没开启分页,指的是当前段所在的物理地址,否则是分页前的虚拟地址

G(Granurality)

值为1表示段界限以4K为单位,否则以字节为单位

段界限

描述段的大小size-1,单位由G决定。

D/B

  • 对于代码段,1表示32位的偏移或操作数,0表示16位的偏移或操作数
  • 对于栈段,1表示使用esp,0表示使用sp

L

表示64位,32位下置0

AVL

留给操作系统自己使用的,意义自定义

P

1表示当前段有效,0表示当前段无效

DPL(descriptor priority level)

表示当前段的优先级

S

1表示数据段或代码段,0表示系统段

type

数据段

  • 可执行
  • 扩展方向
  • 可写
  • 最近是否访问

代码段

  • 可执行
  • 是否依从
  • 可读
  • 最近是否访问

安装GDT

使用指令lgdt m48,m48为内存地址,在16位下为16位,32位下为32位,其地址里面存有如下数据
4字节addr|2字节size,size是GDT的大小减去1,addr为GDT所在的内存地址。

小端序

由于小端序有点违反直觉,要注意一下

段选择子

在这里插入图片描述
16位的段选择指,高13位表示该段在GDT表中是第一个段描述符,共有 2 13 − 1 2^{13}-1 2131个有效的段描述符,开始的第一个是NULL空描述符。

TI

表示是从全局描述符表找,还是从局部描述符表找

RPL

与DPL相关,请求特权级,暂时为0

本代码用到的4个有效段描述符

DPL=0,G=0,S=1,D=1,P=1

  1. 空描述符,intel要求的,留个非法NULL地址访问用
  2. 代码段,地址0x00007c00,type=0x8;limit=0x1ff
  3. 数据段,地址0x00b8000,type=0x2,limit=0xffff
  4. 栈段, 地址0x00000000, type=0x6,limit=0x7a00,数据向下扩展,栈的特性。有效地址从0x00007c00-0x00007a00,注意,当段属性向下扩展时,处理器检查的是下界,而向上扩展时,检查的是上界,这也就是说,其实地址从0xffffffff-0x00007a00,处理器均不会报错。
times 8 db 0
    dd 0x7c0001ff,0x00409800
    dd 0x8000ffff,0x0040920b
    dd 0x00007a00,0x00409600

[bits 16]
    mov ax,cs      
    mov ss,ax
    mov sp,0x7c00
    mov dword [cs:gdt+0x7c02],gdt+0x7c06
    lgdt [cs:gdt+0x7c00]
    in al,0x92                         ;南桥芯片内的端口 
    or al,0000_0010B
    out 0x92,al                        ;打开A20
    cli
    mov eax,cr0
    or eax,1
    mov cr0,eax                        ;设置PE位
    jmp dword 0x0008:flush
[bits 32]
flush:
    mov cx,0x10         ;加载数据段选择子(0x10)
    mov ds,cx
    mov byte [0x00],'P'  
    mov byte [0x02],'r'
    mov byte [0x04],'o'
    mov byte [0x06],'t'
    mov byte [0x08],'e'
    mov byte [0x0a],'c'
    mov byte [0x0c],'t'
    mov byte [0x0e],' '
    mov byte [0x10],'m'
    mov byte [0x12],'o'
    mov byte [0x14],'d'
    mov byte [0x16],'e'
    mov byte [0x18],' '
    mov byte [0x1a],'O'
    mov byte [0x1c],'K'
    mov cx,0x18         ;加载堆栈段选择子
    mov ss,cx
    mov esp,0x7c00

    mov ebp,esp                        ;保存堆栈指针 
    push byte '.'                      ;压入立即数(字节)
    
    sub ebp,4
    cmp ebp,esp                        ;判断压入立即数时,ESP是否减4 
    jnz loop                          
    pop eax
    mov [0x1e],al                      ;显示句点 
loop:
    jmp loop
    
gdt:
    dw 31
    dd 0
    times 8 db 0
    dd 0x7c0001ff,0x00409800
    dd 0x8000ffff,0x0040920b
    dd 0x00007a00,0x00409600
    times 510-($-$$) db 0
    db 0x55,0xaa

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

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

相关文章

【Linux】缓冲区/磁盘inode/动静态库

目录 一、缓冲区 1、缓冲区的概念 2、缓冲区的意义 3、缓冲区刷新策略 4、同一份代码,打印结果不同 5、仿写FILE 5.1myFILE.h 5.2myFILE.c 5.3main.c 6、内核缓冲区 二、了解磁盘 1、磁盘的物理结构 2、磁盘的存储结构 2.1磁盘的定位 3、磁盘的抽象…

【openGauss】浅试openGauss3.1.0中有关mysql兼容的部分特性

前言 在9月30号,openGauss推出了3.1.0这一预览版(注意,openGauss的“x.y.z”版本号,“y”的位置如果不是0,就不是长期支持版,不建议生产使用)。 这个版本增加了不少新内容, https:/…

【KGAT】Knowledge Graph Attention Network for Recommendation

note 其实不结合KG,何向南团队之前也直接使用GCN做了NGCF和LightGCN。KGAT结合KG和GAT,首先是CKG嵌入表示层使用TransR模型获得实体和关系的embedding;然后在attention表示传播层,使用attention求出每个邻居节点的贡献权重&#…

35岁有儿有女,为什么我开始自学编程?

零基础编程入门越来越容易 这么讲并不夸张:无论你初学哪门编程语言,第一行代码几乎都是打印出 Hello world ! print(Hello world!) print(Hello python!) 遥想当年,花上一两天折腾完各种安装配置调试环境,写下第一句“面世代码…

该怎么选择副业,三条建议形成自己的副业思维

受经济环境的影响,许多年轻人觉得原来稳定的工作不那么稳定,看着周围的朋友因为企业破产和失业,生活变得没有信心,也想找到自己的副业,在紧急情况下赚更多的钱。所以,年轻人在选择副业时也面临着很多困惑&a…

Java --- JUC的CompletableFuture的使用

目录 一、Future接口 二、Future接口的功能 三、FutureTask 四、CompletableFuture背景及使用 4.1、CompletionStage 4.2、CompletableFuture 4.3、四个静态方法 4.4、减少阻塞和轮询 4.5、使用CompletableFuture完成电商大比价 五、CompletableFuture常用API 5.1、获…

【华为OD机试真题 C++】TLV解析 【2022 Q4 | 100分】

■ 题目描述 TLV编码是按[Tag Length Value]格式进行编码的,一段码流中的信元用Tag标识,Tag在码流中唯一不重复,Length表示信元Value的长度,Value表示信元的值。 码流以某信元的Tag开头,Tag固定占一个字节&#xff0…

机器学习 | 逻辑回归

一.基本原理 面对一个分类问题,建立代价函数,通过优化方法迭代求解出最优的模型参数,然后测试验证我们这个求解的模型的好坏。逻辑回归是一种分类方法,主要用于二分类问题,应用于研究某些事件发生的概率 二.优缺点 …

day28【代码随想录】回溯之组合、组合总和|||、电话号码的字母组合

文章目录前言一、组合(力扣77)剪枝优化二、组合总和 III(力扣216)剪枝优化三、电话号码的字母组合(力扣17)总结前言 1、组合 2、组合总和||| 3、电话号码的字母组合 一、组合(力扣77&#xff0…

第1章 计算机组成原理概述

文章目录前言1.0 课程简介1.0.1 课程的地位1.0.2 课程学习思路1.0.3 课程组成1.1 计算机系统简介1.1.1 计算机组成1.计算机的类型2.计算机的组成3.软件组成1.1.2 计算机系统的层次结构1.物理层方面2.程序员角度1.1.3 计算机体系结构与计算机组成1.2 计算机的基本组成1.2.1 冯诺…

esp8266测试1.44英寸TFT屏(驱动7735)的demo

参考这教程: 使用esp8266点亮福利屏型号st7735的1.44的TFT屏 管脚连接: 我的用的TFT1.44寸ST7735,与NodeMCU针脚接线成功连接 VCC——3V GND——G LED——3V CLK——D5 SDI——D7 RS——D6 RST——D4 CS——D8 这里给出常用的屏幕管脚定义 以及esp8266…

女生也能学编程:行政女生转行学编程获13000元薪资

“女生不能学编程” “女生学编程找不到工作” “企业根本不会招女生” …… 这样类似的说法,让非常多的女生放弃了学编程,但达妹今天要明确的说,这种说法是 错误的! 只要你愿意改变,有梦想,想追求更好的…

想要快速准备好性能数据?方法这不就来了!

[内部资源] 想拿年薪30W的软件测试人员,这份资料必须领取~ Python自动化测试全栈性能测试全栈,挑战年薪40W 性能测试的一般流程 收集性能需求——>编写性能脚本——>执行性能测试——>分析测试报告——>系统性能调优。 在收集性能需求后…

Spring IOC\AOP\事务\注解

DAY1 一、引言 1.1 原生web开发中存在哪些问题? 传统Web开发存在硬编码所造成的过度程序耦合(例如:Service中作为属性Dao对象)。 部分Java EE API较为复杂,使用效率低(例如:JDBC开发步骤&…

17. 【gRPC系列学习】http2 各类型帧的含义

本节介绍http2有哪些类型的帧以及各帧的主要作用,是rfc7540规范标准定义,文末有参考链接,为后续介绍gRPC帧处理做技术储备。 1. 帧结构 帧长度3个字节 24 bit帧类型1个字节,含义如下:FrameData FrameType = 0x0FrameHeaders FrameType = 0x1FramePriority …

MySQL#4(JDBC常用API详解)

目录 一.简介 1.概念 2.本质 3.优点 4.步骤 二.API详解 1.DriverManager(驱动管理类) 2.Connection 3.Statement 4.ResultSet 5.PreparedStatement 一.简介 1.概念 JDBC就是使用Java语言操作关系型数据库的一套API(Java DataBase Connectivity)Java 数据库连接 2.本…

年货节微信活动有哪些_分享微信小程序商城开发好处

新年临近,又是百姓们囤年货的日子。各行业的微商商城或者线下实体店的商家们,趁此机会别,做一波优惠促销活动,今年的业绩就靠它来个完美的收尾啦! 1.类型:转盘拆福袋等抽奖活动 点击对应抽奖按钮&#xff0…

Doo Prime 提供高达 1000 倍杠杆,助您撬动无限机遇

2022 年 11 月 19 日,Doo Prime 正式将全部账户类型的可选杠杆从 1:500 上调至 1:1000 倍,提供更灵活的杠杆选择,让全球客户有机会以更少的资金撬动更高的潜在利润,进一步拓展投资机遇。 *备注:杠杆调整详情请参阅下文…

Sentinel系列——概述与安装1-1

Sentinel系列——概述与安装1-1概述服务雪崩解决方法基本概念资源规则Sentinel 是如何工作的安装Sentinel下载地址启动修改sentinel启动参数设置启动端口设置用户名密码概述 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言…

面试官问 Redis 的数据结构的时候怎么答能加分?

一提到 Redis,我们的脑子里马上就会出现一个词:“快。”但是你有没有想过,Redis 的快,到底是快在哪里呢?实际上,这里有一个重要的表现:它接收到一个键值对操作后,能以微秒级别的速度…