ucore实验Lab1知识点总结
Intel 80386
ucore目前支持的硬件环境是基于Intel 80386以上的计算机系统。
Intel 80386是80x86系列中的第一种32位微处理器。80386的内部和外部数据总线都是32位,地址总线也是32位,可寻址高达4GB内存。
工作方式包括实模式、保护模式以及虚拟86模式。
Bootloader
MBR与磁盘分区
在目前x86的系统架构中,系统硬盘位于第0号磁道:0到511KB的区块为MBR(硬盘中的每一个磁道容量为512KB),开机管理程序使用这块区域来储存第一阶段开机引导程序(stage1)。接着位于1到62号磁道作为第1.5阶段的开机引导程序(stage1.5),从第63号磁道开始才是操作系统的分区。
主引导记录(MBR,Master Boot Record)是位于磁盘最前边的一段引导(Loader)代码。它负责磁盘操作系统(DOS)对磁盘进行读写时分区合法性的判别、分区引导信息的定位,它由磁盘操作系统(DOS)在对硬盘进行初始化时产生。
MBR的内容分为三部分:第一部分是0到445KB,是计算机的基础导引程序,也称为第一阶段的导引程序;接着446KB到509KB为磁盘分区表,由四个分区表项构成(每个16个字节)。负责说明磁盘上的分区情况。内容包括分区标记、分区的起始位置、分区的容量以及分区的类型。最后一部分为结束标志只占2KB,其值为AA55,存储时低位在前,高位在后。
从百度百科借了张图:

MBR中紧跟在主引导程序后的主分区表这64字节(01BE~01FD)中包含了许多磁盘分区描述信息,尤其是01BE~01CD这16字节,包含了分区引导标志bootid、分区起始源头beghead、分区起始扇区relsect、分区起始柱面begcy1、操作系统类型systid、分区结尾磁头endhead、分区结尾扇区begsect、分区结尾柱面begcy1、分区扇区起始位置relsect、分区扇区总数numsect。
其中分区引导标志bootid表示当前分区是否可以引导,若为0x0,则表示该分区为非活动区;若为0x80,则为可开机启动区。若有多个开机启动区,则由用户开机时的选择而定(如GRUB的菜单)。
分区扇区起始位置relsect表示分区中第一个扇区相对于磁盘起始点的偏移位置。
实模式到保护模式
- 准备好GDT(Global Descriptor Table)
- 关中断
- 加载GDT到GDTR寄存器
- 开启A20,让CPU寻址大于1M
- 开启CPU的保护模式,即把cr0寄存器第一个bit置1
- 跳转到保护模式代码


or al, 2
out 0x92, al
A20
1981年8月,IBM公司最初推出的个人计算机IBM PC使用的CPU是Inter 8088.在该微机中地址线只有20根。在当时内存RAM只有几百KB或不到1MB时,20根地址线已经足够用来寻址这些 内存。其所能寻址的最高地址是0xffff,
也就是0x10ffef。对于超出0x100000(1MB)的寻址地址将默认地环绕到0xffef。当IBM公司与1985年引入AT机时,使用的是Inter 80286 CPU,具有24根地址线,最高可寻址16MB,并且有一个与8088那样实现地址寻址的环绕。
但是当时已经有一些程序是利用这种环绕机制进行工作的。为了实现完全的兼容性,IBM公司发明了使用一个开关来开启或禁止0x100000地址比特位。由于当时的8042键盘控制器上恰好有空闲的端口引脚(输出端口P2,引脚P21),
于是便使用了该引脚来作为与门控制这个地址比特位。该信号即被称为A20。如果它为零,则比特20及以上地址都被清除。从而实现了兼容性。
当A20地址线控制禁止时,程序就像运行在8086上,1MB以上的地址是不可访问的,只能访问奇数MB的不连续的地址。为了使能所有地址位的寻址能力,必须向键盘控制器8082发送一个命令,键盘控制器8042会将A20线置于高电位,使全部32条地址线可用,实现访问4GB内存。
GDT
GDT全称是Global Descriptor Table,中文名称叫“全局描述符表”,想要在“保护模式”下对内存进行寻址就先要有 GDT。GDT 表里的每一项叫做“段描述符”,用来记录每个内存分段的一些属性信息,每个“段描述符”占 8 字节。
在保护模式下,我们通过设置GDT将内存空间被分割为了一个又一个的段(这些段是可以重叠的),这样我们就能实现不同的程序访问不同的内存空间。这和实模式下的寻址方式是不同的, 在实模式下我们只能使用address = segment << 4 | offset的方式进行寻址(虽然也是segment + offset的,但在实模式下我们并不会真正的进行分段)。在这种情况下,任何程序都能访问整个1MB的空间。而在保护模式下,通过分段的方式,程序并不能访问整个内存空间
ELF文件
链接视图通过Section Header Table描述,执行视图通过Program Header Table描述。Section Header Table描述了所有Section的信息,包括所在的文件偏移和大小等;Program Header Table描述了所有Segment的信息,即Text Segment, Data Segment和BSS Segment,每个Segment中包含了一个或多个Section。
中断
ucore实验Lab1知识点总结的更多相关文章
- 清华大学OS操作系统实验lab1练习知识点汇总
lab1知识点汇总 还是有很多问题,但是我觉得我需要在查看更多资料后回来再理解,学这个也学了一周了,看了大量的资料...还是它们自己的80386手册和lab的指导手册觉得最准确,现在我就把这部分知识做 ...
- 关于ucore实验一的资料查找
任务:阅读实验一makefile 搞清楚ucore.img是如何构建的 $@ $< $^ 这三个变量分别是什么意思 https://blog.csdn.net/YEYUANGEN/arti ...
- lab_0 清华大学ucore实验环境配置详细步骤!(小白入)
实验步骤 1.下载项目 从github上 的https://github.com/kiukotsu/ucore下载 ucore lab实验: git clone https://github.com/ ...
- 《ucore lab1 exercise1》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 题目:理解通过make生成执行文件的过程 列出本实验各练习中对应的OS原理的知识点,并说明本实验中的实现部分如何对应和体现了原理中的基本概念和关 ...
- 《ucore lab1 exercise5》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 题目:实现函数调用堆栈跟踪函数 我们需要在lab1中完成kdebug.c中函数print_stackframe的实现,可以通过函数print_s ...
- 《ucore lab1》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 练习1:理解通过make生成执行文件的过程 详见<ucore lab1 exercise1>实验报告 练习2:使用qemu执行并调试 ...
- 《ucore lab1 exercise3》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 题目:分析bootloader进入保护模式的过程 BIOS将通过读取硬盘主引导扇区到内存,并转跳到对应内存中的位置执行bootloader.请分 ...
- 《ucore lab1 exercise2》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 题目:使用qemu执行并调试lab1中的软件 为了熟悉使用qemu和gdb进行的调试工作,我们进行如下的小练习: 从CPU加电后执行的第一条指令 ...
- 《ucore lab1 exercise4》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 题目:分析bootloader加载ELF格式的OS的过程 通过阅读bootmain.c,了解bootloader如何加载ELF文件.通过分析源代 ...
随机推荐
- python 字符前缀,运算符、换行符、数据类型和变量
补充 *)/ 表示的除法即使是整数,结果也是浮点数 *)python表示的整数是没有大小限制的.而某些语言根据其储存长度是有大小限制的.例如Java对32位整数的范围限制在-2147483648-21 ...
- access truncate
access int access(const char *pathname, int mode); 确定文件或文件夹的访问权限 //unistd.h #define R_OK 4 /* Test f ...
- odoo12 权限配置1
权限配置文档说明,这里使用公司开发的两个权限配置模块,可以快速的帮助你来配置复杂的odoo权限. 安装以下两个模块,SystemGroups模块是快速帮助你批量添加,创建基础群组需要用到的模块 Bas ...
- 关于使用Hadoop MR的Eclipse插件开发时遇到Permission denied问题的解决办法【转】
搭建了一个Hadoop的环境,Hadoop集群环境部署在几个Linux服务器上,现在想使用windows上的Java客户端来操作集群中的HDFS文件,但是在客户端运行时出现了如下的认证错误,被折磨了几 ...
- 素数、杨辉三角、封装结构和集合操作(15)——IPython使用和封装解构
IPython使用 帮助 ? ##Ipython的概述和简介 help(name) ##查询指定名称和帮助 obj? ##列出obj对象的详细信息 obj?? ##列出更详细的信息 特殊变量 _表示前 ...
- Ubuntu环境下载程序到STM32
1 JLink方式 1.0 下载JLink 传送门:SEGGER官网 图1.0 下载JLink 1.2 安装JLink 双击打开下载文件:JLink_Linux_V644i_x86_64.deb 1. ...
- jenkins自动打包生成docker镜像后自动发布并nginx代理访问
之前曾写过docker及jenkins基础使用 https://www.cnblogs.com/xiaochangwei/category/816943.html 现在搭建环境的功能为: 1.jen ...
- JMockit学习笔记
一.在eclipse下建立JMockit工程 1.下载最新版JMockit(jmockit-1.4.zip): 2.解压后的文件夹包含有:library jars, source files, sam ...
- SpingBoot四——前后端分离
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:https://www.cnblogs.com/by-dream/p/11336057.html 根据之前的教程,我们已经可以独立 ...
- day36_8_20数据库3外键
一.一对多 在数据库使用数据中经常遇到一对多的情况,以公司员工为例. 一张完整的员工表有以下字段: id name gender dep_name dep_desc . 以此建表得: id n ...