今天主要是对操作系统的启动进行学习,因为都是理论的部分,这篇博客就当学习的笔记了
计算机的启动过程
BIOS
首先在按下电源键后计算机首先读取写在ROM中的BIOS(Basic Input/Output System 基本输入输出系统)
它保存着计算机最重要的基本输入输出的程序,其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。此外,BIOS还向作业系统提供一些系统参数。系统硬件的变化是由BIOS隐藏,程序使用BIOS功能而不是直接控制硬件。现代作业系统会忽略BIOS提供的抽象层并直接控制硬件组件。——百度百科
然后BIOS程序会进行硬件自检,若硬件出问题发出相应的蜂鸣,自检通过后BIOS移交控制权给存储器,按照设置的存储器的启动顺序,若存储器第一个扇区的最后两个字节为$0x55$和$0xAA$则代表该存储器可以用于启动,若不是则将控制权给下一个存储器
存储器
找到可以用于启动的存储器后,机器读取第一个扇区的前446个字节(调用操作系统的机器码)然后运行启动管理器让用户选择要启动的操作系统
操作系统
控制权移交给操作系统后,操作系统的内核会被先载入内存,然后以Linux为例子会启动init进程,这是操作系统的第一个进程,pid为1,其他所有的进程都是它的后代,init进程会逐步调用系统模块直到操作系统启动完成
关于内存地址
针对32位系统cpu的寻址空间是2^32即4GB,其中包含了一些固定的地址访问固定的硬件如访问BIOS
加电后cpu的第一条指令地址是0xFFFFFFF0也就是BIOS的地址,然后BIOS就好开始执行上面描述的流程
在读取主引导记录是会将扇区的512字节读到内存的0x7C00地址,由于512字节太小,所以这512字节就用来些载入内核的代码
bootloader
上面说的载入内核的代码就是bootloader,不过本次我们不自己写bootloader,主要是因为学习的梯度吧,就直接使用县城的GRUB,然后我们的主要任务就是弄出一个能被GRUB识别的操作系统内核,所以要符合GRUB的规范——multiboot规范
今天学校的课挺多,就先到这吧,看文档去了,明天周末大干一番