操作系统进入保护模式
call _empty_8042 mov al,#0x01 out #0x64,al //8042是键盘控制器其输出端口P2用来控制A20地址线 call _empty_8042 mov al,#0xDF out #0x60,al //选通A20地址线 call _empty_8042 初始化8259中断控制 //一段非常机械化的程序 mov ax,#0x0001 mov cr0,ax ;16位标志 jmpi 0,8 ;ip --- D1表示写数据到8042的P2端口 --- empty_8042: .word 0x00eb,0x00eb in al,#0x64 test al,#2 jnz empty_8042 ret以上内容展示了一段x86汇编代码用于从实模式切换到保护模式。这是操作系统启动过程中非常关键的一步。下面将逐部分详细解释代码的含义、作用以及背后的硬件原理。---1. 开启A20地址线assembly call _empty_8042 mov al,#0x01 out #0x64,al call _empty_8042 mov al,#0xDF out #0x60,al 为什么需要A20在8086实模式下CPU只能访问1MB内存20位地址。当访问地址超过1MB时会发生地址回绕例如0x100000被映射到0x00000。80286及后续处理器有24位以上地址线能访问更大内存但为了兼容旧程序默认情况下第20根地址线A20被强制为0仍然产生回绕。进入保护模式后需要访问1MB以上内存因此必须**开启A20地址线**使第20位有效。如何开启A20通常通过键盘控制器8042芯片的输出端口P2来控制A20。端口P2的位1bit1为1时开启A20为0时关闭。操作步骤如下1. 等待8042输入缓冲区空通过empty_8042子程序。2. 向命令端口0x64发送命令0xD1表示接下来要写入输出端口。3. 等待8042输入缓冲区空。4. 向数据端口0x60写入控制字节其中bit1设为1通常写0xDF保持其他位不变。图片中第一行代码向0x64写的是0x01这可能是笔误因为注释明确写着“D1表示写数据到8042的P2端口”。正确的命令应该是0xD1。第二行写入0xDF其二进制为11011111bit1为1从而开启A20。---2. 初始化8259中断控制器assembly 初始化8259中断控制 //一段非常机械化的程序 8259是可编程中断控制器PIC负责管理硬件中断。在实模式下8259默认将IRQ0~7映射到中断向量8~15IRQ8~15映射到70~77。但这些向量与CPU异常如除法错、缺页等冲突。进入保护模式后必须重新映射IRQ到不冲突的向量通常IRQ0~7映射到32~39IRQ8~15映射到40~47。初始化过程包括发送初始化命令字ICW1、ICW2、ICW3、ICW4代码虽然机械但必不可少否则中断会混乱。---3. 设置CR0寄存器进入保护模式assembly mov ax,#0x0001 mov cr0,ax ;16位标志 CR0是控制寄存器其位0PEProtection Enable用于开启保护模式。将ax设为0x0001后写入cr0即置位PE位。注意cr0是32位寄存器此处用16位ax写入高16位被清零在早期CPU中高16位保留且应为0故可行。这一步使CPU进入保护模式但此时指令预取队列中可能还有实模式下的指令且段寄存器仍指向实模式段因此需要立即刷新。---4. 远跳转刷新流水线assembly jmpi 0,8 ;ip jmpi是远跳转指令0是偏移8是段选择子。在保护模式下段选择子8的二进制为1000表示- 索引1GDT中的第1个描述符第0个是空描述符- TI0使用GDT- RPL0请求特权级0这个跳转会重新加载CS段寄存器指向GDT中定义的保护模式代码段同时刷新CPU的指令预取队列使后续指令都在保护模式下执行。注释ip可能表示跳转后的指令地址。---5. empty_8042子程序assembly empty_8042: .word 0x00eb,0x00eb in al,#0x64 test al,#2 jnz empty_8042 ret 该子程序用于等待键盘控制器8042的输入缓冲区为空确保可以安全地向其发送命令或数据。- .word 0x00eb,0x00eb这是两个16位数值对应机器码EB 00短跳转偏移0即两条空跳转指令相当于空操作可能用于延迟或对齐。- in al, #0x64从端口0x64读取8042的状态寄存器。- test al, #2测试状态寄存器的位2通常表示输入缓冲区是否满1为满。如果为1则跳转回empty_8042继续等待。- ret缓冲区空返回。每次操作8042前调用此子程序可避免因缓冲区满导致命令丢失。---总结图片中的代码片段完成了进入保护模式的核心步骤1. 开启A20通过8042设置P2端口的bit1解除地址回绕。2. 初始化8259重新映射硬件中断向量避免与CPU异常冲突。3. 设置CR0的PE位正式开启保护模式。4. 远跳转加载保护模式代码段刷新流水线。这些操作是操作系统启动时从实模式过渡到保护模式的经典流程为后续加载内核、启用分页等高级功能打下基础。

相关新闻

过劳死防线:心脏监测手环开发者的自救

过劳死防线:心脏监测手环开发者的自救

第一章 血色警报:测试工程师的健康危机图谱1.1 行业猝死率触目惊心的背后数据透视:2025年《中国互联网从业者健康白皮书》显示,软件测试岗位平均周加班时长超14小时,心源性猝死占比达37%隐匿杀手:无症状心肌缺血在35岁…

2026/7/8 15:23:11 阅读更多 →
使用jabref

使用jabref

在这里修改1.语言2.标签3.程序4.检查完整性5.补全信息6.挪动位置7.保存到自己想要的位置

2026/5/17 9:20:07 阅读更多 →
Python 3.12 MagicMethods - 20 - __gt__

Python 3.12 MagicMethods - 20 - __gt__

Python 3.12 Magic Method - __gt__(self, other)__gt__ 是 Python 中用于定义 大于比较(>) 的核心魔术方法。它是实现对象全序比较的重要部分,广泛应用于排序、筛选、优先级队列等场景。正确实现 __gt__ 可以让自定义类与内置类型一样自…

2026/5/17 9:20:07 阅读更多 →

最新新闻

gala-spider核心组件揭秘:拓扑图存储与根因定位原理解析

gala-spider核心组件揭秘:拓扑图存储与根因定位原理解析

gala-spider核心组件揭秘:拓扑图存储与根因定位原理解析 【免费下载链接】gala-spider An OS-level topology awareness service and a cause inference service. 项目地址: https://gitcode.com/openeuler/gala-spider 前往项目官网免费下载:htt…

2026/7/8 15:23:45 阅读更多 →
2026迪庆黄金回收白银回收铂金回收市民首选无隐形扣费正规备案回收门店联系方式推荐

2026迪庆黄金回收白银回收铂金回收市民首选无隐形扣费正规备案回收门店联系方式推荐

2026迪庆黄金白银铂金回收实测榜单|公安工商双备案无损测金无折旧费门店 迪庆香格里拉市区街头巷尾,贵金属回收店铺遍地丛生,行业套路层出不穷。不少市民变现时遭遇虚高报价、克扣损耗、未经同意熔金压价等问题。为帮助本地居民规避消费陷阱&…

2026/7/8 15:23:45 阅读更多 →
PilotGo-plugin-topology开发者手册:深入理解拓扑图生成器模块

PilotGo-plugin-topology开发者手册:深入理解拓扑图生成器模块

PilotGo-plugin-topology开发者手册:深入理解拓扑图生成器模块 【免费下载链接】PilotGo-plugin-topology system application architecture detection. 项目地址: https://gitcode.com/openeuler/PilotGo-plugin-topology 前往项目官网免费下载:…

2026/7/8 15:21:43 阅读更多 →
hpc-prrte开发者指南:参与贡献的完整流程与最佳实践

hpc-prrte开发者指南:参与贡献的完整流程与最佳实践

hpc-prrte开发者指南:参与贡献的完整流程与最佳实践 【免费下载链接】hpc-prrte hpc-prrte is the process manager of openmpi. It starts, stops, and manages parrallel computing tasks. 项目地址: https://gitcode.com/openeuler/hpc-prrte 前往项目官网…

2026/7/8 15:21:43 阅读更多 →
Docker工程化:从安装命令到CI/CD交付的系统认知

Docker工程化:从安装命令到CI/CD交付的系统认知

1. 工程化不是加个Dockerfile就完事:从“能跑”到“可交付”的认知断层很多人第一次接触Docker,是在某篇教程里照着敲下docker run hello-world,看到终端输出一行绿色文字,就以为自己“会Docker”了。接着兴冲冲去改项目&#xff…

2026/7/8 15:19:40 阅读更多 →
【Bug已解决】API Key invalid after rotation / Old key cached — Claude Code API Key 轮换后失效解决方案

【Bug已解决】API Key invalid after rotation / Old key cached — Claude Code API Key 轮换后失效解决方案

【Bug已解决】API Key invalid after rotation / Old key cached — Claude Code API Key 轮换后失效解决方案 1. 问题描述 在 Anthropic Console 中轮换(rotate)API Key 后,Claude Code 仍然使用旧 Key,报认证错误: $…

2026/7/8 15:19:40 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻