在loader中创建GDT,进入保护模式

2023-11-03

回顾
上一节实现了从BIOS中加载MBR,MBR从磁盘2扇区读取loader加载到内存0x900处,但loader目前尚未实现任何功能。

Q&A
Q1:loader在OS中主要做什么?
答:创建一些系统数据结构,如GDT,页表等,打开进入保护模式的开关。

Q2:保护模式与实模式主要有哪些不同?
答:
(1)寻址范围:实模式下共20根地址线,寻址范围1MB;进入保护模式会打开20根地址线的限制。
(2)访问限制:保护模式下段寄存器中存储的不再是段基址,而是段选择子,选择子中包含段描述符在全局描述符表中的索引,GDTR寄存器中存储全局描述符表在内存中的地址,通过索引可获取段描述符在内存中的地址,段描述符记录段的功能,权限信息。
GDTR寄存器结构:
在这里插入图片描述
选择子结构:
在这里插入图片描述
段描述符(汇编实现这个结构真是令人头大…)
在这里插入图片描述
非系统段type,共四位:
X :可执行/不可执行,代码段为1,数据段为0
C:代码段一致性,数据段扩展方向)
R:可读/不可读
A:cpu访问后置1,初始化为0

Q3:如何进入保护模式?
答(按顺序):
1、在内存中创建GDT,并初始化段描述符(初始化了代码段,数据段,显存段)
2、将控制寄存器CR0 PE位(第0位)置1,将0x92端口置1;
3、初始化GDTR寄存器,0-3位初始化为0,后32位填写GDT在内存中的起始位置。
4、将控制寄存器CR0 PE位置1,打开保护模式

开始动手

实现功能所需知识的补充
1、汇编lgdt指令,用于修改gdtr寄存器的值
2、bochs查看控制寄存器的命令:creg;查看gdt: info gdt
3、平坦模型:初始化三个段描述符,代码段,数据段,显存段。代码段和数据段采用平坦模型,即段基址为0,段界限0xffff,寻址范围4GB。
4、远跳转清空cpu指令流水线
修改CR0控制寄存器后,机器已经进入保护模式,但应在保护模式下执行的指令已经在实模式的环境下被放上cpu指令流水线,同时段描述符缓冲寄存器也是在实模式下加载的,所以需要使用jmp跳转指令清空指令流水线,然后重新加载段描述符缓冲寄存器。

5、dd命令,其实在上一节已经用过了,loader加载在2扇区,和mbr隔了一个扇区,因此需要跳过两个扇区,因此加上seek=2参数,loader大于512字节,因此count也需要修改,索性改为4。
代码loader.S

%include "boot.inc"
section loader vstart=0x900
LOADER_STACK_TOP equ 0x900
jmp loader_start
GDT_BASE:      ;全局描述符表定义在内存0x900处
dd 0x00000000
dd 0x00000000

CODE_DESC: dd 0x0000FFFF
           dd DESC_CODE_HIGH4

DATA_DESC: dd 0x0000FFFF
           dd DESC_DATA_HIGH4
VIDEO_DESC: dd 0x80000007
            dd DESC_VIDEO_HIGH4

GDT_SIZE equ $-GDT_BASE
GDT_LIMIT equ GDT_SIZE-1
times 60 dq 0         ;目前有三个描述符,预留60个描述符的空位
;三个描述符都是0特权级
SELECTOR_CODE equ (0x0001<<3)+TI_GDT+RPL0
SELECTOR_DATA equ (0x0002<<3)+TI_GDT+RPL0
SELECTOR_VIDEO equ (0x0003<<3)+TI_GDT+RPL0

gdt_ptr  dw  GDT_LIMIT
         dd  GDT_BASE

loader_start:
mov sp, 0x900    ;0x900以下可作为栈的地址
;open A20 address line ;打开A20地址线
in al,0x92
or al,0000_0010b
out 0x92,al

;initialize GDTR register ;初始化GDTR寄存器
lgdt[gdt_ptr]

;let CR0 register PE site equ 1  ;将CR0寄存器0位置1
mov eax,cr0
or eax, 0x00000001
mov cr0, eax
 jmp  SELECTOR_CODE:p_mode_start	 ;跳转清空cpu指令流水线
;jmp $
p_mode_start:
mov ax, SELECTOR_DATA      ;初始化段描述符缓冲寄存器
   mov ds, ax
   mov es, ax
   mov ss, ax
   mov esp,LOADER_STACK_TOP
   mov ax, SELECTOR_VIDEO
   mov gs, ax
   jmp $

boot.inc是《操作系统真相还原》一书提供的配置文件,一开始自己写段描述符的各个位,调试了好久一直都表示不对,所以还是乖乖的用人家的配置文件吧,基本思路也是按照这本书上做的。
结果验证
加载GDT成功:
在这里插入图片描述
可以看见1,2,3三个代码段哈
creg查看控制寄存器CR0第0位:
在这里插入图片描述
OK了,其实还有很多细节有待考究,调试的时候还出了好多莫名其妙的错误

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在loader中创建GDT,进入保护模式 的相关文章

  • Java课程设计之学习成绩管理系统

    package System import java awt import java awt event import java io import javax swing import javax swing table Abstract
  • fork之后子进程到底复制了父进程什么

    fork之后子进程到底复制了父进程什么 发表于2015 4 3 9 54 08 2161人阅读 分类 操作系统 include
  • 计算机网路基础 - 一些基本概念与网络结构

    1 基本概念 计算机网络 通信技术 计算机技术 是两项技术紧密结合的产物 通信系统的基础模型 计算机网络 是指将地理位置不同 具有独立功能的多台计算机及其外部设备 通过通信线路连接 在网络操作系统 网络管理软件及网络通信协议的管理和协调下
  • MySQL基础(非常全)

    MySQL基础 一 MySQL概述 1 什么是数据库 答 数据的仓库 如 在ATM的示例中我们创建了一个 db 目录 称其为数据库 2 什么是 MySQL Oracle SQLite Access MS SQL Server等 答 他们均是
  • 线程和进程的区别(面试必备)

    参考文章 https www jianshu com p 2dc01727be45 线程与进程的区别通俗的解释 https www jianshu com p 8ad441510860 附加可参考文章 https baijiahao bai
  • Linux系统的安装(在VM虚拟机上安装CentOS 7)

    工具准备 物理计算机一台 配置要求 操作系统 win10 64位 大家基本上都是 硬盘可用容量 20G以上 内存容量 4G以上 虚拟机安装包 VMware workstation full 12 5 下载链接 点我下载 提取码 9gha C
  • linux 如何创建卷组

    1 创建一个物理卷 Pvcreate dev sd1 dev sd2 dev sd3 dev sd4 2 用刚才创建的物理卷创建一个卷组 Vgcreate 卷组名 dev sd1 dev sd2 dev sd3 dev sd4 3 创建逻辑
  • CentOS 7 关闭网络限制

    1 安装CentOS 7 3操作系统mini版本即可 2 设置关闭Selinux 编辑 etc selinux config vi etc selinux config SELINUX disabled 重启机器 查看selinux状态 s
  • Ubuntu 10.10下安装TFTP的步骤 tftp-hpa版本

    背景 由于想要在tq2440板子上用tftp下载kernel 所以要在自己的PC机的Ubuntu 10 10上安装tftp服务 所以就去网上找了些教程 但是很悲剧 按照那些教程去操作 结果还都是无法正常运行tftp服务 最后还是从一个外国人
  • ps aux 和ps -aux和 ps -ef的选择

    Linux中的ps命令是Process Status的缩写 ps命令用来列出系统中当前运行的那些进程 ps命令列出的是当前那些进程的快照 就是执行ps命令的那个时刻的那些进程 如果想要动态的显示进程信息 就可以使用top命令 要对进程进行监
  • 操作系统PV操作及读者写者问题

    操作系统PV操作及读者写者问题 目录 1 信号量 2 P V操作原语可描述为以下式子 3 解释 4 互斥模式原理 5 同步模式原理 6 读者写者问题 1 信号量 PV操作与信号量的处理有关 信号量是表示资源的实体 是一个与队列有关的整型变量
  • 红帽7.9部署telnet服务

    升级ssh 为预防万一提前配置telnet服务 安装软件包 yum install telnet server yum install xinetd xinetd加入开机自启 systemctl enable xinetd service
  • 安装黑苹果双系统专辑贴(持续更新...)

    最近终于开始研究黑苹果 然后浏览了几篇文章贴收集一下 以便需要时随时阅览 和同学们互相学习 零基础篇 1 https blog csdn net a792396951 article details 80230946 2 https zhu
  • InfoQ视频直播分享报名:前贝尔实验室、Oracle架构师为你在线揭秘分布式平台内核...

    报名方式 关注InfoQ微信公众号 ID infoqchina 回复 InfoQ 即可观看在线直播技术分享 分享地点 u0026amp 时间 InfoQ直播微课堂将在熊猫 TV 网站播出 看腻了卖肉的女主播 来看看QCon 的明星讲师如何
  • 程序员的自我修养——链接、装载与库

    1 温故而知新 操作系统概念 北桥 连接高速芯片 系统调用接口 以软件中断的方式提供 如Linux使用0x80号中断作为系统调用接口 多任务系统 进程隔离 设备驱动 直接使用物理内存的弊端 地址空间不隔离 内存使用效率低 程序运行的地址不确
  • 深入ftrace kprobe原理解析

    Linux krpobe调试技术是内核开发者专门为了编译跟踪内核函数执行状态所涉及的一种轻量级内核调试技术 利用kprobe技术 内核开发人员可以在内核的绝大多数指定函数中动态插入探测点来收集所需的调试状态信息而基本不影响内核原有的执行流程
  • Elasticsearch 日志

    下载并安装 Filebeat 首次使用 Filebeat 请参阅入门指南 复制代码片段 curl L O https artifacts elastic co downloads beats filebeat filebeat 7 2 0
  • Linux alien命令

    一 简介 alien是一个用于在各种不同的Linux包格式相互转换的工具 其最常见的用法是将 rpm转换成 deb 或者反过来 二 安装 http toutiao com a6188997768449360129 三 实例 http www
  • [架构之路-185]-《软考-系统分析师》-3-操作系统基本原理 - 文件索引表

    目录 一 文件的索引块 二 索引分配表 三 索引表的链接方案 四 多层索引 五 混合索引分配 一 文件的索引块 存放在目录中的文件 并非是文件的真实内容 目录中记录了文件的索引块是几号磁盘块 文件对应的索引表是存放在指定的磁盘块中的 二 索
  • Linux(12):磁盘配额(Quota)与进阶文件系统管理

    磁盘配额 Quota 的应用与实作 Quota 的一般用途 针对 www server 例如 每个人的网页空间的容量限制 针对 mail server 例如 每个人的邮件空间限制 针对 file server 例如 每个人最大的可用网络硬盘

随机推荐

  • 21届毕业生,想做软件测试,没工作经验而且已经毕业,怎么找软件测试工作?

    如果说你是上面现状去找软件测试工作 而且居然还找到了 那么可能会是如下几种情况 1 该公司对软件质量要求很低 随便来个会点点点的 能够检查功能是否正常即可 毕竟我是真遇到过一个CEO说 软件测试很难吗 我都能测试啊 没必要找测试人员 开发完
  • 不对等的爱情该不该放弃

    刚好两个人对爱情都有勇气全力以赴是多么难得的巧合 每个人都有自己的过往 我期望我们在最适当的时候相遇 一个投入的人碰上一个疏离的人 结局必定黯然 下一次 我希望我们相遇的时间会好一点 爱情经常出现一种奇怪的模式 你很用力的去爱一个人 对方却
  • jmeter JDBC request提示“Cannot convert value '0000-00-00 00:00:00' from column 6 to TIMESTAMP.”

    在学习jmeter数据库相关的过程中 在请求数据库时报错 Cannot convert value 0000 00 00 00 00 00 from column 6 to TIMESTAMP 解决方法 更改连接数据库方式 在连接 jdbc
  • C++基础入门教程

    1 C 初识 1 1 第一个C 程序 编写一个C 程序总共分为4个步骤 创建项目 创建文件 编写代码 运行程序 1 1 1 创建项目 Visual Studio是我们用来编写C 程序的主要工具 我们先将它打开 1 1 2 创建文件 右键源文
  • 获取本地硬盘信息

    using System using System Runtime InteropServices using System Text namespace driverId Serializable public struct HardDi
  • JS-语法进阶

    JS 语法进阶 三元运算符 类数组对象
  • 蓝桥杯 51单片机 AT24C02

    工作电压为1 8v 6v 第7引脚 WP 接地时允许正常读写 24C02设备地址包括固定部分和可编程部分 编程部分由A2 A1 A0三个硬件引脚来控制 设备地址最后一位用于设置数据传输方向 读 写 在IIC总线协议中 设备地址是起始信号后第
  • git分支管理策略

    1 总览 git 的分支整体预览图如下 从上图可以看到主要包含下面几个分支 master git默认主分支 这里不作操作 stable 稳定分支 替代master 主要用来版本发布 develop 日常开发分支 该分支正常保存了开发的最新代
  • 黑客自学路线

    谈起黑客 可能各位都会想到 盗号 其实不尽然 黑客是一群喜爱研究技术的群体 在黑客圈中 一般分为三大圈 娱乐圈 技术圈 职业圈 娱乐圈 主要是初中生和高中生较多 玩网恋 人气 空间 建站收徒玩赚钱 技术高的也是有的 只是很少见 技术圈 这个
  • Shader开发之三大着色器

    Shader开发之三大着色器 固定功能管线着色器Fixed Function Shaders 固定功能管线着色器的关键代码一般都在Pass的材质设置Material 和纹理设置SetTexture 部分 Shader Custom Vert
  • Anaconda3-5.1.0下载和安装

    下载安装anaconda的小插曲 1 在官网上找到windows的32位的下载 毕竟是八年前的老本了 另一个本装的64位 结果网站上出现问题 没有成功下载 2 万能的网络 终于找到可以下载的清华镜像地址 Index of anaconda
  • 如何阅读源代码

    我们在写程式时 有不少时间都是在看别人的代码 例如看小组的代码 看小组整合的守则 若一开始没规划怎么看 就会 噜看噜苦 台语 不管是参考也好 从开源抓下来研究也好 为了了解箇中含意 在有限的时间下 不免会对庞大的源代码解读感到压力 网路上有
  • Win11 安装Docker Desktop报错:Update the WSL kernel by running “wsl --update“ or follow instructions

    这个问题解决了一整个下午 看了无数的解决方案 最后找到了最有效的解决方案 总结如下 安装Docker Desktop之后 打开出现这样的问题 根据提示在powershell通过 wsl update 命令 出现 error 那么可以试试下面
  • 计算机视觉技术与应用综述

    引用自 无人系统之 眼 计算机视觉技术与应用浅析 张 丹 单海军 王 哲 吴陈炜 一 前言 近年来 人工智能和深度学习获得突破 成为了大众关注的焦点 如LeCun Y Bengio Y Hinton G等 1 提出的深度卷积网络在图像识别领
  • 一篇文章搞定Python多进程(这才是正确的Python多进程的打开方式)

    1 Python多进程模块 Python中的多进程是通过multiprocessing包来实现的 和多线程的threading Thread差不多 它可以利用multiprocessing Process对象来创建一个进程对象 这个进程对象
  • python3 [爬虫入门实战] 爬虫之selenium 模拟QQ登陆抓取好友说说内容(暂留)

    很遗憾 部分数据有些问题 不过还是可以进行爬取出来的 先贴上源代码 encoding utf8 from selenium import webdriver import re from bs4 import BeautifulSoup f
  • 二分字符串,没有连续的 1,使用递归思路,以及算法改进探讨

    今天聊一个递归解决二分字符串的问题 问题 给定正整数 N 计算所有长度为 N 但没有连续 1 的二分字符 比如 N 2 时 输出为 00 01 10 当 N 3 时 输出为 000 001 010 100 101 这个问题我在网上简单搜了一
  • linux 修改文件用户组和所有者

    目录 1 linux下修改文件用户组 2 linux下修改文件所有者 3 linux下同时修改文件所有者和用户组 1 linux下修改文件用户组 chgrp change group的简写 修改文件所属的用户组 chgrp 用户组名 文件名
  • (转) .net web项目的安装制作

    原 http blog csdn net houlinghouling archive 2005 06 17 396338 aspx 一 创建基本安装部署项目 1 在解决方案资源管理器 右击解决方案 添加 新建项目 安装部署项目 Web安装
  • 在loader中创建GDT,进入保护模式

    回顾 上一节实现了从BIOS中加载MBR MBR从磁盘2扇区读取loader加载到内存0x900处 但loader目前尚未实现任何功能 Q A Q1 loader在OS中主要做什么 答 创建一些系统数据结构 如GDT 页表等 打开进入保护模