操作系统实现(三):二级引导程序loader
本节背景一级引导程序将处理器控制权交出后,便由二级引导程序完成主要的引导任务,包括硬件信息检测、处理器模式转换、页表配置等,并最终实现控制权向内核程序的转移。 本节目的 编写二级引导程序loader.asm 将二级引导程序装载到虚拟软盘镜像中 编写Makefile文件 实现由于自本节起,每节的任务量及代码量陡增,故不再依次贴上对应模块的代码,只有关键部分放相应代码,完整代码在github上查看。 首先照例定义本部分需要用到的常量,并规定起始地址0x10000。 此地址与boot的起始地址0x7c00的规定不同,boot的起始地址是早期的Intel大叔们规定并延续至今,在BIOS中写死的;而loader的起始地址是我们在boot中自己设置的,是在物理内存中较为随便地找出一块合适的空闲区域放置(具体物理内存空间分配见文章末尾)。 接着寄存器设置、清屏及显示加载信息等操作。 在完成了上述准备工作后,便是二级引导程序的第一个重点——加载内核程序。 实模式 -> 保护模式 -> Big Real Mode为了后续能够加载内核到1MB以上的内存,我们需要先打开A20地址线(关于...
操作系统实现(二):一级引导程序boot
本节背景计算机开机启动后,位于ROM中的BIOS即开始上电自检,这个过程BIOS会检测硬件设备是否存在问题。如果检测无误的话,将根据BIOS的启动项配置选择引导设备。 当检测到所选的引导设备的第一个扇区以被称为魔法数(0x55和0xaa)的两个字节结尾时,BIOS即认为该扇区是一个引导扇区(boot sector),则该引导设备是可引导的(bootable)。 随即BIOS将此扇区的数据复制到物理内存地址0x7c00处,随后将处理器的执行权移交给这段程序(跳转至0x7c00地址处执行),此即为第一次控制权转移。 用于引导内核启动的程序叫做引导程序(bootloader),引导程序需要完成引导扇区自启动、文件系统识别、硬件检测、处理器模式切换、页表配置等工作,并最终将控制权交给系统内核。 由于引导扇区被限制为一个扇区大小(512B),而对于现代操作系统的引导程序(需要设置显示模式、切换处理器模式及设置页表等)来说显然不够,因此将引导程序分为两段是现代操作系统开发中更常见的做法。 将引导程序分为两级后,一级引导程序boot用于寻找并加载二级引导程序进内存,并将控制权转移给二级引导程序...
操作系统实现(一):概述及前期准备
概述:首先对本系列内容将要实现的操作系统做一个简要概述: 本系列基于x86-64架构实现一个64位的类Linux操作系统。 本操作系统将分为引导层、内核层与应用层三大部分,并逐一对它们进行实现。 引导层。引导启动程序(bootloader)将使用Intel风格(基于x86-64架构)的汇编语言编写。实现引导扇区引导启动、文件系统识别、系统内核加载、内存容量检测、显示模式的检测与设置、处理器运行模式切换、页表配置等功能,进而完成系统内核运行前的准备工作。 内核层。内核层部分是操作系统的主要部分,该部分在开头将使用AT&T风格的汇编语言完成内核加载的剩余准备工作,随后即使用传统的系统编程语言C来编写内核的绝大部分。内核层将实现内存管理模块、中断/异常处理模块、进程管理模块、多核通信模块、文件系统模块、外部设备驱动等一系列功能模块,成为一个可以正常工作且功能相对完 整的系统内核。同时,本系统还将遵循POSIX规范标准,为应用层提供通用的编程接口(系统调用API)。 应用层。应用层部分将实现本系统的shell终端和一些其他基础命令。 环境:本系列要求对...