在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
  • Minikube 架构及启动流程剖析

    原文作者 wzqnls 编辑 夏天 对于要学习 Kubernetes 或者需要本地开发的开发人员来说 Minikube 是一个不错的选择 通过使用 Minikube 这个工具 我们可以非常快捷地在本地部署一套单节点的 Kubernetes
  • 线程和进程的区别(面试必备)

    参考文章 https www jianshu com p 2dc01727be45 线程与进程的区别通俗的解释 https www jianshu com p 8ad441510860 附加可参考文章 https baijiahao bai
  • windows下命令行修改系统时间;修改系统时间的软件

    找了很久 都没有找到 还找了关键词 dos下修改系统时间 因为看到linux下修改系统时间是用hwclock 命令写入主板芯片 而我由于某些原因想自动化修改系统时间 所以找windows下修改系统时间的软件 没有找到 有一个 意天禁止修改系
  • mapengpeng1999@163.com 操作系统4~处理机调度

    处理机调度 1 三级调度体系 1 处理机调度主要是对处理机运行时间进行分配 即 按照一定算法或策略 将处理机运行时间分配给各个并发进程 同时尽量提高处理机的使用效率 2 现代操作系统中 按调度所实现的功能分3种类型 高级调度 中级调度和低级
  • pycharm内存不足时如何修改设置?

    Help gt Find Action gt type VM Options gt Click Edit Custom VM Options Pycharm 2016 2 will open the appropriate vmoption
  • RTX线程通信之——线程标志

    文章目录 Thread Flags 概念 RTX线程标志API 案例 LED灯同步闪亮 小结 参考资料 Thread Flags In a real application we need to be able to communicate
  • Ubuntu 10.10下安装TFTP的步骤 tftp-hpa版本

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

    nvida smi提供一个查看GPU信息的方法 然而这种方式不能查看GPU型号 型号被省略成了GeForce RTX 208 如果我们需要查看GPU的型号 只需要运行nvidia smi L即可 mrfive ubuntu nvidia s
  • nslookup命令详解

    nslookup命令用于查询DNS的记录 查看域名解析是否正常 在网络故障的时候用来诊断网络问题 nslookup的用法相对来说还是蛮简单的 主要是下面的几个用法 1 直接查询 这个可能大家用到最多 查询一个域名的A记录 nslookup
  • 安装黑苹果双系统专辑贴(持续更新...)

    最近终于开始研究黑苹果 然后浏览了几篇文章贴收集一下 以便需要时随时阅览 和同学们互相学习 零基础篇 1 https blog csdn net a792396951 article details 80230946 2 https zhu
  • 操作系统 段页式存储管理

    一 引入 分页系统是以页面作为内存分配的基本单位 能有效地提高内存利用率 但信息共享等不方便 分段系统是以段作为内存分配的基本单位 它能够更好地满足用户多方面的需要 信息共享 动态链接等 但采用分区方式管理物理内存 仍然存在碎片问题 段页式
  • 通过源码包*.src.rpm定制开发rpm

    为什么80 的码农都做不了架构师 gt gt gt 1 基本流程 1 下载 安装相应的src rpm包 wget xxx src rpm rpm ivh xxx src rpm 这里的 安装 是指把xxx src rpm中的tar gz p
  • Ubuntu9.04太多乱码(中文不能正常显示)

    最近在使用Ubuntu9 04的过程中 发现有好多地方都出现乱码 其实是中文不能正常显示 现在把我所遇到的所有乱码问题集中一下 方便以后查阅参考 一 Flash乱码 在终端输入 sudo gedit etc fonts conf d 49
  • 图解五种磁盘调度算法, FCFS, SSTF, SCAN, C-SCAN, LOOK

    一 FCFS 调度 先来先服务 磁盘调度的最简单形式当然是先来先服务 FCFS 算法 虽然这种算法比较公平 但是它通常并不提供最快的服务 例如 考虑一个磁盘队列 其 I O 请求块的柱面的顺序如下 98 183 37 122 14 124
  • 【操作系统】王道考研 p42 段页式管理方式

    段页式管理方式 知识总览 分段 分页管理方式中最大的优缺点 关于段式管理会产生外部碎片 ps 分段管理中产生的外部碎片也可以用 紧凑 来解决 只是需要付出较大的时间代价 分段 分页 段页式管理 示意图 先分段 后分页 段页式管理的逻辑地址结
  • java IO、NIO、AIO详解

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 IO流 同步 阻塞 二 NIO 同步 非阻塞 三 NIO2 异步 非阻塞 正文 回到顶部 概述 在我们学习Java的IO流之前 我们都要了解几个关键词 同步与异步 sy
  • C#实现FTP文件夹下载功能【转载】

    网上有很多FTP单个文件下载的方法 前段时间需要用到一个FTP文件夹下载的功能 于是找了下网上的相关资料结合MSDN实现了一段FTP文件夹下载的代码 实现的思路主要是通过遍历获得文件夹下的所有文件 当然 文件夹下可能仍然存在文件夹 这样就需
  • Common块和Bss段的区别

    昨天看 程序员的自我修养 链接 装载与库 发现不是很理解为什么要用common块 然后仔细看了一番 有了自己的理解 common块 用来存放弱符号 而全局未初始化变量是弱符号 但是难道不是应该存放在 bss段吗 为什么要有common块呢

随机推荐

  • 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 页表等 打开进入保护模