哈工大李治军操作系统--操作系统基础(操作系统启动)

本文详细解析了计算机开机启动的首条指令执行流程,从实模式到保护模式的转换,以及Linux操作系统如何从主引导扇区加载至内存并初始化系统。通过分析BIOS中断、硬件检测、内存管理及中断向量表的设置,揭示了Linux内核的启动机制。

打开电源,计算机执行的第一句指令是什么?

(1) x86PC刚开机时CPU处于实模式;
(2) 开机时, CS=0xFFFF, IP=0x0000;
(3) 寻址0xFFFF0(ROM BIOS映射区);
(4) 检查RAM, 键盘, 显示器, 软硬磁盘;
(5) 将软盘0面0道1扇区(主引导扇区, 对应操作系统第一段代码,即主引导程序.Linux 0.11源码对应文件为boot/bootsect.s)读入0x7c00处;
(6) 设置cs=0x07c0, ip=0x0000.

在这里插入图片描述

bootsect.s

bootsect.s (1个扇区)把自身从0x7c000处搬到0x90000处,再把setup.s(4个扇区)搬到0x90200处,然后调用0x13号中断在屏幕上打印“Loading system…”,再把system模块加载到0x10000处。之后确定根文件系统的设备号,若没指定,则根据所保存的引导盘的每磁道扇区数判定盘的类型(是1.44M A盘吗?)并保存其设备号于root_dev。最后139行跳转到setup.s执行。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
140行~227行代码用来加载system模块,由于采用比较原始的CHS模式读取软盘比较复杂,不再细看,暂且当成一个黑箱吧,日后若研究细节再做分析。

在这里插入图片描述
在这里插入图片描述

setup.s

代码105行之前,利用 ROM BIOS 中断例程获取系统参数(如光标位置、内存大小等),并写入 0x900000-x901FF 处(覆盖原来的 bootsect.s 区域)。然后把 system 模块从 0x10000-0x8ffff (当时认为 system 模块不会超过512K)搬到 0x0000 处(0x00000-0x003ff 的256个中断号的中断向量表被覆盖,之后再用int就不再是查0x00000处的中断向量表了,而是查IDT)。然后开启 A20 地址线并设置 8259A 中断控制芯片,再设置 CR0 的 PE 位,进入 32 位保护模式,转到 system 模块的第一个代码 head.s 执行。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
执行191行之后,跳到0x00000000。那么该处对应哪个代码文件呢?

Makefile

要让操作系统正常运行,必须通过Makefile控制各个代码文件加载顺序、如何组合等工作。Makefile是make工具的配置文件,相当于批处理文件,在含有Makefile的当前目录里执行make命令,就会根据Makefile中的信息对源代码进行编译、链接等工作。在这里插入图片描述
根据Makefile的配置要求,0x00000000处就是system模块的head.s,下面要进入head.s执行。
在这里插入图片描述

head.s

本程序重新设置GDT和IDT,并做一些校验工作(如A20地址线是否启动等),然后设置并开启分页(分页相关的内容在内存管理再说),然后跳入main函数执行。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

源代码(个人适当增加注释)

bootsect.s

!
! SYS_SIZE is the number of clicks (16 bytes) to be loaded.
! 0x3000 is 0x30000 bytes = 196kB, more than enough for current
! versions of linux
!
SYSSIZE = 0x3000
!
!	bootsect.s		(C) 1991 Linus Torvalds
!
! bootsect.s is loaded at 0x7c00 by the bios-startup routines, and moves
! iself out of the way to address 0x90000, and jumps there.
!
! It 
<think>好的,我现在需要帮助用户解决关于如何在本地电脑上搭建哈工大操作系统课程(治军)的HitOSlab实验环境的问题。根据用户提供的引用内容,我需要整理出具体的步骤,同时确保回答结构清晰,符合用户的要求。 首先,用户提到他们参考了阿里云服务器搭建的指南,但用户现在可能更关心本地环境的配置。我需要结合引用中的信息,比如安装依赖库、配置步骤,以及可能遇到的错误和解决方法。 接下来,我需要确认用户的需求是本地环境而非云服务器。引用[1]中提到用户通过阿里云搭建了Linux环境,但用户现在的问题是关于自己的电脑,所以需要调整步骤,适用于本地虚拟机或物理机安装。 引用[3]中的命令是解决运行实验环境时的依赖问题,比如安装i386架构的库,这在本地Ubuntu系统中同样适用。需要确保用户执行这些命令以避免运行时错误。 另外,用户提到的实验二涉及操作系统的引导,可能需要在Bochs模拟器中运行。因此,安装Bochs和相关工具是必要的步骤,可能需要编译源码或者通过包管理器安装。 可能遇到的问题包括32位库的兼容性、图形界面安装(如果用户使用无界面的服务器版)、以及实验代码的配置是否正确。需要提前预警这些情况,并在步骤中给出解决方案,比如使用sudo apt-get安装所需的库,或者修改Makefile中的路径。 最后,生成的相关问题需要与实验环境配置相关,比如如何调试实验代码,如何安装Bochs,如何处理常见错误等。这些可以帮助用户进一步解决可能遇到的困难。</think>### HitOSlab实验环境配置指南 根据哈工大操作系统实验要求,本地环境搭建分为以下步骤: 1. **基础系统准备** - 推荐使用Ubuntu 14.04 64位系统(物理机/虚拟机均可) - 安装图形界面(若使用服务器版): ```bash sudo apt-get update sudo apt-get install ubuntu-desktop ``` [^1] 2. **安装必要依赖库** ```bash sudo dpkg --add-architecture i386 sudo apt-get update sudo apt-get install libsm6:i386 libx11-6:i386 libxpm4:i386 gcc-multilib build-essential ``` 这是保证32位程序运行的关键步骤[^3] 3. **获取实验材料** ```bash git clone https://github.com/hoverwinter/HIT-OSLab cd HIT-OSLab ``` 4. **配置实验环境** - 安装Bochs模拟器: ```bash sudo apt-get install bochs bochs-x ``` - 修改oslab/linux-0.11/Makefile中的路径配置 - 编译内核: ```bash make all ``` 5. **验证环境** ```bash cd oslab ./run ``` 若出现黑屏终端,输入`sync`后回车即进入实验系统
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值