X86架构保护模式研究

X86汇编语言:从实模式到保护模式(代码+注释)--c10、11(保护模式:32位x86处理器编程架构+进入保护模式) 在进入实模式之后,段寄存器的高速换粗部分保留了原始的内容,但其内容是无效的,同时进入后,流水线中的指令并未清除,原来的指令都是16位的译码规则,进入保护模式后需要将其转变为32位的译码模式,因此需要刷新流水线以保证程序运行正常。第21根地址线,为了满足原始的8086处理器只有20条地址线,导致的仅为问题。控制保护模式开关的是控制寄存器CR0,CR0的0位为PE位(保护模式允许位),CR0是个32位寄存器。最初的状态为实模式,因此在GDT中安装描述符必须要将GDT的线性地址转化为逻辑地址和偏移地址。 阅读详情

最近在研究X86架构保护模式,记录下研究过程,然后写了一个汇编启动程序来验证保护模式下,指令执行方式。

 

提到保护模式就不得不提 “实模式”,当处理器加电后会从一个地址0xfff0执行一个跳转jmp指令到0x7c00地址处执行启动扇区指令,实模式下段寄存器长度为16位,一次只能寻址到64KB内存。

实模式下寻址方式:

段地址(存在段寄存器)*16+偏移来定位一个内存地址。

mov ax,0x0

mov ds,ax

mov byte [0x100],'a'

以上代码将'a' 写入地址 为ds:0x100的内存区域,那么这个地址为 0x0*16+0x100=0x100

进入保护模式后就不能通过这种方式寻址了。

保护模式寻址方式

段选择子加段内偏移

段段子子同样存放于段寄存器中,它不再是一个地址,而是一个索引,指向全局描述符表的某一项,GDT(全局描述符表)。

GDT 里面存放段描述符,段描述符里存放有段基址。

 

段描述符格式

以上是Intel手册中的关于全局描述符表和段描述符数据结构。

进入保护模式流程

1.设置GDT

2.设置CR0 ,PE位=1 进入保护模式

3.跳转到保护模式下指令(执行长跳转清空指令流

将汇编代码编译bin格式后,写入USB存储,通过在BIOS设置为USB启动,在电脑屏幕上显示LoadProect加载保护模式成功

保护模式汇编代码 保护模式测试代码

%define CODESEG 0x7c00 ;代码段地址

         mov word bx,ds:[gdt_table+CODESEG]

         ;描述符1 代码段描述符
         mov word [bx+8],0x0 ;段长度
         mov word [bx+10],0x7c00 ;段基址
         mov word [bx+12],0x9a00 
         mov word [bx+14],0xc0 ;段颗粒度 4KB

         ;创建#3描述符,保护模式下的堆栈段描述符
         mov dword [bx+0x18],0x00007a00
         mov dword [bx+0x1c],0x00409600

         ;GDTR表长度
         mov word [cs: gdt_addr+CODESEG],31  
                                 
         lgdt [cs: gdt_addr+CODESEG] ;加载GDTR地址到寄存器
      
         cli ;禁止中断

         ;开启保护模式
         mov eax,cr0
         or eax,1
         mov cr0,eax

        ;跳转至保护模式下代码 16段选择子:32位偏移
        jmp dword 0x0008:protect_start

    bits 32
    protect_start:
         mov cx,0x10 ;加载数据段
         mov ds,cx
         call clear_console
        
        ;向显示缓冲区写入 LoadProtect 以显示到屏幕上
        mov byte ds:[0],'L'
        mov word ds:[1],0x7
        mov byte ds:[2],'o'
        mov word ds:[3],0x7
        mov byte ds:[4],'a'
        mov word ds:[5],0x7
        mov byte ds:[6],'d'
        mov word ds:[7],0x7
        mov byte ds:[8],'P'
        mov word ds:[9],0x7
        mov byte ds:[10],'r'
        mov word ds:[11],0x7
        mov byte ds:[12],'o'
        mov word ds:[13],0x7
        mov byte ds:[14],'t'
        mov word ds:[15],0x7
        mov byte ds:[16],'e'
        mov word ds:[17],0x7
        mov byte ds:[18],'c'
        mov word ds:[19],0x7
        mov byte ds:[20],'t'
        mov word ds:[21],0x7
         jmp end
end:
    jmp end
;清空输出缓冲区
clear_console:
    push eax
    push edi

    xor eax,eax
    mov al,0x0
    mov ecx,0x500
    mov edi,0xb8000
    cld
    rep stosb

    pop edi
    pop eax
    ret

gdt_addr    dw 0x0;段限长度
gdt_table  dd (gdt+CODESEG);GDT的物理地址     
gdt:
    ;描述符0 空描述符
	dd 0x0,0x0
    
    ;代码段描述符
	dd 0x0,0x0

;显示缓冲区段描述符
view_seg:
    dw 0xffff ;段限长
    dw 0x8000 ;段基址 00-15
    db 0x0b ;段基地 16-23
    db 0x92;段属性 P-1 DPL-2 S-1 TYPE-4
    db 0x40;Segment Limit-4 AVL-1 L-1 DB-1 G-1
    db 0x0 ;段基址

times 510-($-$$) db 0
db 0x55,0xaa

 

x86保护模式——全局描述符表GDT详解 GDT作用 GDT全称Global Descriptor Table,是x86保护模式下的一个重要数据结构,在保护模式下,GDT在内存中有且只有一个。GDT的数据结构是一个描述符数组,每个描述符8个字节,可以存放在内存当中任意位置: 其中,addr相当于GDT的基地址,GDT的总长度(单位字节)为GDT界限。 在实模式中,CPU通过段地址和段偏移量寻址。其中段地址保存到段寄存器,包含:CS、SS、DS、ES、FS、GS。段偏移量可以保存到IP、BX、SI、DI寄存器。在汇编代码mov ds:[si], a 阅读详情

相关推荐

X86汇编语言深入指南:从实模式到保护模式

本文还有配套的精品资源,点击获取 简介:《X86汇编语言:从实模式到保护模式》详细介绍了X86架构处理器从实模式到保护模式的演进过程,包含汇编语言基础、内存管理、中断处理和系统级编程等内容。书中解释了实模式下的内存访问和中断机制,以及保护模式如何通过分页和分段机制提供高级内存管理和保护。作者提供了丰富的汇编代码示例,通过"booktool"工具,读者可以实践和调试代码,加深...

weixin_33608403的博客 1554

关于保护模式的简单介绍(转)

  [这个贴子最后由wildcatgsk在 2005/10/26 02:48pm 第 1 次编辑] 保护

Hellfire的专栏 1552

Ansys Zemax实战:5步搞定衍射光学元件(DOE)设计,附赠超透镜(metalens)避坑指南

本文详细介绍了使用Ansys Zemax进行衍射光学元件(DOE)和超透镜(metalens)设计的5步实战流程。从基础光学系统搭建到相位面设计验证,再到制造准备与实测对比,全面解析了OpticStudio中的关键技巧和常见避坑指南,帮助工程师高效完成复杂光学元件设计。

orange的博客 618

x86实模式和保护模式寻址

文章目录x86寻址方式基址-偏移寻址分页寻址实模式寻址x86 分片寄存器32位保护模式寻址GDT结构GDT headGDT entry x86寻址方式 基址-偏移寻址 x86 cpu的寻址方式在历史早期主要是分片寻址(segmentation),其基本设计是任何地址由base 和 offset组成,通过将地址空间按不同规则切分成多块,每块起始地址作为base,在每个区块的偏移作为offset即可定位到具体物理地址,分片寻址在x86历史主要有两种 real mode 32bit protect mode r

cheng3100的博客 1215

weblogic 集群搭建,双机部署,相关问题记录

4.5.集群搭建1 参考网址https://wenku.baidu.com/view/76365129cd1755270722192e453610661ed95aa4.html IP地址 端口 角色 192.168.1.160 9001 AdminServer ...

zl386119974的专栏 1669

JSAPI微信支付(小程序)V3版本JAVA代码实战源码

1.1、商户通过JSAPI/小程序下单接口获取到发起支付的必要参数prepay_id后,再通过微信小程序调起微信支付收银台JSAPI/小程序下单_JSAPI支付|微信支付商户文档中心1.3、微信H5发起类似,结合文档,细微调整,前端返回类似,参考文档修改为微信内置浏览器调起支付即可。

java web 705

[转贴]自己动手写操作系统

自己动手写操作系统(一) 作者:伊梅 自由软件社区是一个充满自由和梦想的地方,在10余年的时间里它创造了一个又一个奇迹。然而,这些奇迹的创造者不只是Stallman,也不只是Linus Torvalds,而是活跃在世界各地的不计其数的开发人员。 在使用各种功能强大的自由软件时,我总会对其开发者充满崇敬之情,期盼有朝一日自己也能成为他们中的一员。很多对自由社区充满向往之情的人,虽然也想

1289

Xilinx PL端DP显示接口开发实战(一)——环境搭建与硬件选型

本文详细介绍了Xilinx PL端DP显示接口开发的环境搭建与硬件选型实战经验。从Vivado和Vitis 2021.1版本的软件安装要点,到DP141和MCDP6000芯片的选型建议,再到DP1.4接口的RX/TX方向开发关键点,为开发者提供了全面的技术指导。文章还分享了IP核配置、BD原理图设计以及常见问题排查的实用技巧,帮助开发者高效完成Xilinx DP接口开发项目。

weixin_29250573的博客 174

X86实模式与保护模式简介

X86实模式与保护模式简介 X86实模式与保护模式物理地址的计算方式

qq_45577173的博客 3067

Python连接高斯数据库踩坑实录:从SASL报错到SSL安全连接的完整指南

本文详细记录了Python连接高斯数据库时遇到的SASL authentication报错及其解决方法。通过剖析SASL认证机制,对比了修改数据库配置、使用官方驱动等方案的利弊,并重点提供了通过自动化脚本生成SSL证书,实现安全、免密连接的完整指南,帮助开发者彻底解决连接难题。

weixin_28340315的博客 438

YALMIP介绍及怎么在Matlab中加YALMIP、SDPT3

目录YALMIP简介怎么在Matlab中加YALMIP?1. 创建决策变量:2. 添加约束:3. 参数配置4. 求解怎么在MatlabR2019a中加YALMIP?1.下载工具包2.放置工具包3.添加路径4.测试安装结果怎么在MatlabR2019a中加SDPT3? YALMIP简介 怎么在Matlab中加YALMIP? yalmip是一位“集大成者”,它不仅自己包含基本的线性规划求解算法,比如linprog(线性规划)、bintprog(二值线性规划)、bnb(分支界定算法)等,他还提供了对cpl

m0_51431440的博客 2万+

x86 CPU的保护模式——概述(一)

我们在前面已经介绍过实模式了,它是32位 CPU 的一种工作模式,模拟了16位 CPU 的工作环境,但是大多数时候 CPU 并不会处于实模式,而是保护模式,我们接下来看看实模式和保护模式有什么区别。

weixin_62515670的博客 1293

98DX3236内核编译过程小结

0.条件(1)Marvell技术支持提供的压缩文件:GNU EABI:arm-mv5sft-linux-gnueabi_SW3.2.tar.bz2.tar.bz2armebv7-marvell-linux-gnueabi-softfp_i686_201201.tar.bz2CPSS代码:Cpss-PP-DxCh-4.2_012.zipLinux内核文件:lsp-4.2_012.zipLSP-Uni...

snaking616 1803

windows内核研究(保护模式 1-段寄存器)

摘要:x86保护模式与段寄存器机制 保护模式是现代x86处理器的核心运行模式,为操作系统提供内存管理、硬件保护和多任务支持。与实模式相比,保护模式采用分段与分页机制实现虚拟内存和进程隔离,并通过特权级(Ring 0-3)限制用户程序权限。段寄存器(CS/DS/SS等)在保护模式下演变为选择子,指向GDT/LDT描述符表,决定内存访问权限和范围。每个段寄存器包含16位可见部分和80位隐藏属性(基址、界限、权限等),可通过特殊指令探测其特性。段描述符(8字节)与段选择子(16位)共同构成保护模式下的内存访问控制

weixin_43754657的博客 1221

如何做好软件需求分析?

软件需求分析也称为系统需求分析或需求分析工程等,是开发人员经过深入细致的调研和分析,准确理解用户和项目的功能、性能、可靠性等具体要求,将用户非形式的需求表述转化为完整的需求定义,从而确定系统必须做什么的过程。软件开发一般包括:可行性分析、需求分析、软件设计、软件开发、软件测试、软件实施、软件服务等步骤,需求分时软件开发的第一步骤。用户需求分析是指在系统设计之前和设计、开发过程中对用户需求所作的调查与分析,是系统设计、系统完善和系统维护的依据。

qq_41854911的博客 1415

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

x86-64体系架构下的保护模式详解(零基础入门)

x86-64保护模式深度解析:现代操作系统的核心运行环境提供了内存保护、特权级隔离和虚拟内存支持。关键特性包括:1)64位扩展的段页式内存管理(4级页表结构);2)Ring0-Ring3特权级隔离及系统调用机制;3)中断描述符表(IDT)实现安全中断处理。保护模式通过CR0/CR3寄存器控制,与实模式相比具备2^64寻址能力和完善的安全机制,是操作系统开发、虚拟化和安全研究的底层基础。注:本文仅供技术学习,非法使用将承担法律责任。

fearhacker的专栏 1093

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

保护模式下的分页机制

在x86/x86-64架构的保护模式下,​分页机制(Paging)​​ 是内存管理的核心,它通过虚拟地址到物理地址的映射实现内存隔离、虚拟内存和多任务支持。

fearhacker的专栏 863

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

手写X86——第一节——课程介绍(QEMU)

🔥本篇概览:详细讲解了手写X86在保护模式下的编程第1节——课程介绍🌈⭕🔥

做一个善良的人,做好自己的事,如果愿意,再发一份光。 1193

如何使用 KRaBs:用 Rust 编写的终极 x86 引导程序完整指南

KRaBs(Kernel Reader and Booters)是一个用纯 Rust 编写的 x86/x86_64 链式引导程序,专为在 32 位/64 位 PC 上引导 ELF 格式的 vmlinux 和其他内核而设计。它支持 Linux x86/x86_64 引导协议的最小子集,允许用户指定内核命令行和 initrd/initramfs,是系统开发和内核研究的理想工具。 ## KRaBs 核

gitblog_01092的博客 1066

从零开始构建操作系统:30天自制操作系统的完整实践指南

你是否曾经好奇操作系统是如何从零开始构建的?当计算机启动时,第一个程序是如何运行的?操作系统又是如何管理内存、调度任务、处理中断的?这些问题在《30天自制操作系统》项目中得到了完美的解答。这个开源项目通过30天的渐进式学习,带领开发者从512字节的引导程序开始,最终构建出一个功能完整的图形化操作系统。 《30天自制操作系统》项目不仅仅是一个代码仓库,更是一套完整的学习体系。它采用"学中做、做中学

gitblog_00152的博客 253

x86架构中的保护模式

在x86架构中所谓保护模式其实就是段的存储方式能够达到一种保护机制。也正因为有了保护模式(段的存储方式)所以才会有特权模式,以及后面的多任务之说;         在实模式下段的存储很简单,就是代表一个段基地址;如:ds(ds=0x7c00),那么数据段的基地址就是0x7c00;再比如:ds:ax(ds=0x0000;ax=0x7c00)那么段基地址就是0x00;物理地址就是:(ds * 16)

YuZhiHui_No1的专栏 3538

【x86架构】架构基础

介绍x86架构基础。

jiangwei0512的博客 3万+

x86架构实模式和保护模式

x86架构实模式和保护模式 0. 术语释义 实模式——real model 保护模式——protected model 1. 概述 保护模式又称虚拟地址保护模式,与之相对的是实模式。 保护模式是在80286系列开始实现的一种CPU操作模式。在此之前,只有实模式。但是为了保持向前兼容,即在新的处理器上依然能够运行老的软件和系统,所以在现代的计算机上电后,系统会首先运行在实模式下,然后再转换为保护模式...

读芯术 1029

x86 - CPU架构/寄存器详解 (三) 保护模式

本文内容: CPU架构通用寄存器状态寄存器状态标志(Status Flags)控制标志(DF flag)系统标志以及IOPL域(System Flags and IOPL Field)系统地址寄存器GDTRLDTRIDTRTR段寄存器控制寄存器CR0CR1CR2CR3CR4调试寄存器其他寄存器EIPTSC浮点寄存器MSR参考资料   80286 也是一款 16 位的处理器,大部分的寄存器都和 8086 处理器一样。因此,80286 和 8086 一样,因为段寄存器是 16 位的,而且只能使用 16 位的偏移

Gyc8787的博客 7542

X86保护模式(一)· 何为保护模式

在实模式下,用户程序对内存的访问十分自由,它可以访问1MB内的任何地址,任意修改其它程序的内存空间,也可以访问任何端口,这也意味着可以访问任何设备,诚然,这对于现代计算机来说,是一件非常危险的事情。 在当下多用户多任务的背景下,内存中通常会有多个任务在同时运行,为了使他们彼此隔离,防止因某个用户程序的错误而影响其它程序甚至操作系统,引入保护模式是非常有必要的。 ...

尽头2nxszn98的博客 1412

X86架构(CPU、总线、内存)

先了解计算机底层最基本的工作原理,以便于以后能理解Linux系统的运作模式!! 总体概要 原文中对于x86架构的总结图片,重点牢记这些寄存器的作用,以及段的工作模式 计算机的工作模式(了解一下) 1、 CPU、总线、内存 对于一个计算机来讲,所有功能看似是输入输出设备的功劳,实际干活的还是CPU。同时CPU通过内存不断的保存和取出中间数据,然后基于中间结果进行进一步的计算。总线是CPU和其...

本末实验室 1万+
上一篇: Linux 进程调度分析
下一篇: Linux内核模块原理
IT回忆录
博客等级 码龄16年 42粉丝 100原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值