初始:系统引导
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
Hello RVOS!的学习笔记
一、硬件基础
参阅文章:理解“统一编址与独立编址、I/O端口与I/O内存” - 陈木 - 博客园 (cnblogs.com)
计算机CPU对外设的访问方法_rsicv cpu如何访问外设_NIUZI_J的博客-CSDN博客
在Hello RVOS 1中提到了一个内存映射的概念,及外设被映射到了内存之中。因此在qemu中代码运行的起始地址皆是从0x80000000开始的。因为前面的地址皆被分配给了外设。
一开始,我想当然,后来经过一些关于代码中地址的使用略微有些疑惑。
第一篇博客园的文章写的非常全。我记录以下我看完后的理解。
一个程序员访问外设方便,如何做?封装,抽象。便有了驱动程序。驱动程序想要控制硬件如何做?熟记引脚?直接赋值。于是便有控制器接口,比如说usb,AD接口等等。所以访问外设,无非操作接口中的寄存器或缓冲及端口,通过硬件电路实现控制外设。
那么话说回来,从硬件上来说,无非是CPU如何访问控制器?需要一个标识。那么这个标识就是地址。谈到地址能想到,物理地址,虚拟地址。关于硬件外设自然是物理地址。
对于外设而言有两种编址方式。这取决于所使用的计算机架构。
类似x86这样的复杂指令集架构来说,进行的是独立编址。即常用的内存地址和外设地址(硬盘也属于外部设备)分别独立编址。这意味地址会有重用。固需要两套指令分别来访问内存和外设。
统一编址则更应用于精简的架构上。比如ARM,还有这次的risc-V。外设接口中的IO寄存器(即IO端口)与存储单元一样看待,每个端口占用一个存储单元的地址,将存储空间的一部分划出来用作IO地址空间,统一编址也称为“I/O内存”方式,外设寄存器位于“内存空间”(很多外设有自己的内存、缓冲区,外设的寄存器和内存统称“I/O空间”)。CPU便只需要一套指令来访问存储器和外设了。(有人会说这回占用主存或内存,但在我看来若说会占用本可以给主存用的地址空间更为合适。占用主存内存则相当于独立编址而言)
至于应该如何访问,参见博客园文章便可知。io内存及统一编址,io端口则为独立编址。
看了很多文章?也就理解这些东西。博客园的文章确实好啊。
二、开端:系统引导
在RVOS实验中,这方面很简单。
以上是使用qemu软件模拟时系统引导过程,和真正的引导过程有些区别。
机器上电执行rom中的Botlouder,在qemu中代码执行后会跳转到一个固定的地址(内存起始位置)上执行内核代码。而-kernel os.elf其实就是将内核代码提前放入那个内存起始位置上。所以实际上内核引导即跳转到内核代码的地方。
多核则多个核同时执行上述过程。
而在真正的计算机中,以linux系统为例子。
自然先要进行一些硬件自检之类的工作(BIOS),然后是MBR引导,即加载bootloader即GRUB引导程序,然后GRUB引导程序来加载内核,将控制权交给内核,而内核此时需要一些必要的驱动程序来访问其余硬件,目前使用的是临时跟文件系统,随后挂在根文件系统,执行init程序。
这便是linux的主要引导过程。参见文章:LINUX系统引导启动过程:BIOS、bootlaoder、kernel、init - 知乎 (zhihu.com)
今天就先到这里了,写文章确实会花费一些时间,但确实在知识的理解上更深入记忆也更深刻。日后加油吧!