初识操作系统(启动区和初始化)
工具介绍
GCC: GNU Compiler Collection, 可以编译多语言的编译器。编译流程:预处理->编译->汇编->链接。
NASM:NASM是一个为可移植性与模块化而设计的一个80x86的汇编器。文件格式为 xx.asm
QEMU: 一个开源的计算机仿真器和虚拟器。可以模拟不同架构的处理器(arm、x86、risc-v),也可以作为虚拟机使用
MAKEFILE: 批处理工具,可以通过其指定如何编译链接文件
寄存器介绍
介绍在8086中存在的寄存器。
通用寄存器:
- AX,accumulator,累加寄存器
- CX,counter,计数寄存器
- DX,data,数据寄存器
- BX,base,基址寄存器
X表示extend,因为之前的寄存器都是8位的。因此8位寄存器有:AL,AH,CL,CH,DL,DH,BL,BH。
另外32位通用寄存器为:EAX,ECX,EBX,EDX。
索引寄存器,包含段地址的偏移量:
- SP,stack pointer,栈指针寄存器
- BP,base pointer,基址指针寄存器
- SI,source index,源变址寄存器
- DI,destination index,目的变址寄存器
32位索引寄存器为:ESP,EBP,ESI,EDI。
段寄存器,作程序指令,数据或栈的基础位置:
- CS,code segment,代码段寄存器
- SS,stack segment,栈段寄存器
- DS,data segment,数据段寄存器
- ES,extra segment,附加段寄存器
- FS,segment part2,没用名称
- GS,segment part3, 没有名称
状态和控制寄存器:
- IP,instruction pointer,指令指针寄存器,它是从 Code Segment 代码寄存器处的偏移来存储执行的下一条指令
- FLAG : Flag 寄存器用于存储当前进程的状态
启动区介绍(bootloader)
1 | CYLS EQU 10 |
初始化寄存器,其中0x7c00表示程序装载的位置,可以参考链接中的内存分布图,0x00007C00 — 0x00007DFF为启动区装载地址(IBM规定)。参考:https://www.glamenv-septzen.net/en/view/6
初始化之后为读盘操作,这里读了10个柱面,每个柱面18个扇区,2个磁头(1张软盘有80个柱面,2个磁头,18个扇区,一个扇区512字节),即C0-H0-S1 -> C9-H1-S18,共180KB内容。INT指令为调用BIOS函数。
整体地址:
+ 0x00007C00 -- 0x00007DFF:启动区状态地址
+ 0x000008000 -- 0x000008200:启动区内容,默认读取
+ 0x000008200 -- 0x00000E600:软盘剩下内容
一般向一个空软盘保存文件时:
- 文件名会写在0X002600以后的地方
- 文件的内容会写在0X004200以后的地方
因此磁盘的内容位于内存0X8000+0X4200=0XC200的地方,即最后的jump语句执行的地方。
初始化介绍
1 | ; 有关BOOT_INFO |
将画面模式信息保存在内存里面,同时把像素数、颜色数、键盘信息保存在0x0ff0附近,从内存分布图上来看,这块没有被使用。
参考BIOS设定:https://wiki.osdev.org/BIOS
MAKEFILE详解:
来源:https://github.com/ghosind/HariboteOS
1 |
|
gcc已经做好编译汇编的操作,在haribote.sys进行链接,最后用dd命令生成img文件。
Linux启动介绍
内核启动过程:https://www.cnblogs.com/anywherego/p/18217546
启动区需要看grub源码~