ucore-lab1-练习3report
练习3.分析bootload进入保护模式的过程
0. BIOS通过读取硬盘主引导扇区到内存,并跳转到对应内存中的位置,也就是从’%cs=0 $pc=0x7c00‘进入并执行bootloader,bootloader要完成:
(1) 切换到保护模式,启用分段机制;
(2) 读取磁盘中的ELF执行文件格式的ucore操作系统到内存;
(3) 显示字符串信息;
(4) 把控制权交给ucore操作系统;
对应于boot目录下的 asm.h,bootasm.S,bootmain.c文件。bootasm.S的start函数文件是最先执行的,此函数进行了一定的初始化,完成从实模式到保护模式的转换,并调用bootmain.c中的bootmain函数。bootmain函数实现了屏幕、串口和并口显示字符串,加载ucore到内存,然后跳转到ucore的入口处执行。asm.h中是bootasm.S所需要的头文件,主要是一些与x86保护模式的段访问方式相关的宏定义。
所谓实模式,是将整个物理内存看成分段的取余,程序的数据和代码位于不同区域,操作系统和用户程序没有区别对待,而且每个指针都是指向实际的物理地址,若通过指针更改了操作系统或其他用户程序取余,会带来很大的灾难,此模式下的80386只是一个快速的8086。
所谓保护模式,80386的全部32根地址线全部有效,可寻址高达4GB的线性地址空间和物理地址空间,可访问64TB的逻辑地址空间,可采用分段存储管理机制和分页存储管理机制,提供4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码数据的安全及任务的隔离。
1. 初始化:
首先调用bootasm.S中的start函数进行初始化,屏蔽中断,置位向量标志位,置位几个重要的段寄存器。

2. 开启A20:
当A20地址线控制禁止时,程序就像运行在8086上,1MB以上的地址是不可访问的,为了使能所有地址位的寻址能力,必须向键盘控制器8082发送一个命令,键盘控制器8042会将A20线置于高电位,使全部32条地址线可用,实现访问4GB内存。开启A20的具体步骤如下:
(1) 等待8042 Input Buffer为空。
(2) 发送Write 8042 Output Port (P2)命令到8042 Input Buffer。
(3) 等待8042 Input Buffer为空。
(4) 将8042 Outpput Port (P2)得到字节的第2位置1,然后写入8042 Input Buffer。
具体实现在bootasm.S文件中:

3. 初始化全局描述符表:
为了使分段存储管理机制正常运行,需要建立好段描述符和段描述符表,全局描述符表是一个保存多个段描述符的“数组”,其起始地址保存在全局描述符表寄存器GDTR中。GDTR长48位,其中高32位为基地址,低16位为段界限。这里只需要载入已经静态存储在引导区的GDT表和其描述符到GDTR寄存器:

4. 进入保护模式:
CR0的位0(PE)是启用保护(Protection Enable)标志。当设置该位时即开启了保护模式;当复位时即进入实地址模式。这个标志仅开启段级保护,而并没有启用分页机制。若要启用分页机制,那么PE和PG标志都要置位。所以这里需要将cr0的PE位置1:

5. 通过长跳转指令进入保护模式:

6. 置位段寄存器,建立堆栈:

7. 完成实模式到保护模式的转换,调用bootmain.c中的bootmain函数:

ucore-lab1-练习3report的更多相关文章
- 《ucore lab1》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 练习1:理解通过make生成执行文件的过程 详见<ucore lab1 exercise1>实验报告 练习2:使用qemu执行并调试 ...
- ucore lab1 bootloader学习笔记
---恢复内容开始--- 开机流程回忆 以Intel 80386为例,计算机加电后,CPU从物理地址0xFFFFFFF0(由初始化的CS:EIP确定,此时CS和IP的值分别是0xF000和0xFFF0 ...
- 《ucore lab1 exercise5》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 题目:实现函数调用堆栈跟踪函数 我们需要在lab1中完成kdebug.c中函数print_stackframe的实现,可以通过函数print_s ...
- 《ucore lab1 exercise3》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 题目:分析bootloader进入保护模式的过程 BIOS将通过读取硬盘主引导扇区到内存,并转跳到对应内存中的位置执行bootloader.请分 ...
- 《ucore lab1 exercise2》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 题目:使用qemu执行并调试lab1中的软件 为了熟悉使用qemu和gdb进行的调试工作,我们进行如下的小练习: 从CPU加电后执行的第一条指令 ...
- 《ucore lab1 exercise1》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 题目:理解通过make生成执行文件的过程 列出本实验各练习中对应的OS原理的知识点,并说明本实验中的实现部分如何对应和体现了原理中的基本概念和关 ...
- ucore操作系统学习笔记(一) ucore lab1系统启动流程分析
一.ucore操作系统介绍 操作系统作为一个基础系统软件,对下控制硬件(cpu.内存.磁盘网卡等外设),屏蔽了底层复杂多样的硬件差异:对上则提供封装良好的应用程序接口,简化应用程序开发者的使用难度.站 ...
- Ucore lab1实验报告
练习一 Makefile 1.1 OS镜像文件ucore.img 是如何一步步生成的? + cc kern/init/init.c + cc kern/libs/readline.c + cc ker ...
- ucore lab1练习2 qemu+gdb 不能协作调试的问题make lab1-mon
本练习是qemu结合gdb调试,但是我做实验的时候并不能像视频输入make lab1-mon那样顺利调试,期间有各种error,后来我找到原因,请看解决方法. 请先把ucore_lab文件删除,以下全 ...
- 《ucore lab1 exercise4》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 题目:分析bootloader加载ELF格式的OS的过程 通过阅读bootmain.c,了解bootloader如何加载ELF文件.通过分析源代 ...
随机推荐
- 【3-24】css样式表分类、选择器、样式属性
一.css样式表分类: (一)内联样式表:代码写在标签内的样式表 控制精确 代码重用性差 优先级最高 格式:<p style="样式属性">内容</p> ...
- LINUX系统备份还原
1.Linux系统备份工具 REAR (RELAX-AND-RECOVER) https://blog.csdn.net/qq43748322/article/details/78710754?loc ...
- JavaScript取消默认控件并添加新控件(DOM编程艺术第11章)
这一章实现的这个功能我研究了好久,这个思路我感觉已经是现在的我要膜拜的了,我感觉我的逻辑还是有些问题. 第一个问题:vid.height与vid.videoHeight vid.height = vi ...
- NRF51822之使用外部32Mhz晶振
硬件平台为微雪BLE400的(将原来的16mhz晶振改为32mhz.两个旁电容改为22pf) 以nRF51_SDK_10.0.0_dc26b5e\examples\ble_peripheral\ble ...
- JVM老年代和新生代的比例
在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新生代 ( Young ) 又被划分为三个区域:Eden.From Survivor.To Surviv ...
- 02-body标签中相关标签-1
主要内容: 字体标签: h1~h6.<font>.<u>.<b>.<strong><em>.<sup>.<sub> ...
- centos7 redis配置
https://www.cnblogs.com/web424/p/6796993.html
- linux下安装jdk,tomcat,maven
1. jdk安装 下载jdk的linux版本. >tar -zxvf jdk1.8.0_191.tar.gz 配置环境变量: >vim /etc/profile最前面添加: expor ...
- SAFESEH 映像是不安全的
1.打开该项目的“属性页”对话框 2.然后单击“链接器”--“命令行”,出现如下界面 3.将 /SAFESEH:NO 复制到“其它选项(D)”框中,然后点击应用 返回VS2013,重新编译运行程序即可 ...
- Delphi TMemoryStream写入到字符串和字符串写入到流
一.TMemoryStream数据写入到字符串里 var lvStream:TMemoryStream; s:AnsiString; p: PAnsiChar; begin lvStream:= TM ...