Linux内核开发_2_Initramf

目录

 

什么是Initramf?

1.1 Initramf起源

1.1.1 tmpfs

1.1.2 Initramf诞生原因

1.2 qemu命令重新说明


什么是Initramf?


1.1 Initramf起源


1.1.1 tmpfs


在最初,Linus(Linux内核的作者)早期想要编写一个能够与chech(CPU缓存)的文件系统,Linus在rasmfs(ram(与内存交互的文件系统)上的chech(缓存功能)上做了封装,使其能够对主板上的L1和L2等不同级别的缓存进行交互,名字叫tmpfs,也被叫做临时的根文件系统,因为原本的交互一般使用的都是ramfs文件系统与内存交互,与磁盘会使用ext的文件系统与之交互,这一切都会通过一个叫VFS的Linux子系统来完成与这些文件系统的挂载并交互。

1.1.2 Initramf诞生原因


文件系统的编写也是需要要规范的,必须满足VFS的架构,后面我们在详细讨论这个。

但是如果我们想要定制Linux内核,比如一些发行版,开机都会有定制画面,或者加载一些第三方的DLIB库,这些工作在内核态是万万不能的,因为内核态是不能去做除了初始化硬件,和初始化内核态所需的一些变量参数,同时内核也不能进行浮点数运算,原因很简单,浮点数在内存中和其它整数的表示不一样,且运算指令集也不同,使用的运算器件也不一样,且如果用户态此时在进行浮点数运算,那么内核态就需要等待用户态完成浮点数运算才能进行下一次的浮点数运算,在硬件上浮点数的计算是比较复杂的,这些我后面会在CPU底层原理方面详细说一下。

同时内核只能做线程调度还有内存管理一些工作,其它的内核绝对不能参与,因为这样会大幅度降低内核效率,且内核是绝对不允许使用任何运行时还要去动态加载的第三方lib库,太过于耗时。内核一定要精简,效率高,你可以在Linux内核里看到大量宏,或者内联,以及汇编的代码,这些代码都是优化代码,因为内核掌管硬件,从事过单片机开发的都只能,单片机开发,绝对不能使用编译器优化命令,这样容易导致某些关键指令被优化导致某些电路开关无法打开。

如开GPIO1的电路,但是开完立马关掉如下代码:

GPIO1 = 1;

sleep(2);

GPIO = 0;

编译器会认为最终结果GPIO等0,会直接把上面代码省略掉,直接赋予GPIO0

后来,一些发行版的内核开发人员们想了一个办法,那就是在tmpfs上进行一个简单的封装,因为tmpfs是内核初始化结束后,运行VFS子系统时,会去主动加载一个临时根文件系统,也可以不加载,这里根据内核配置与内核启动参数,在这个上面去完成我们想要的工作,去加载我们要加载的第三方lib库,或者输出开机启动画面等等工作,这个就叫Initramf,就相当于是要加载的根文件系统的一个应用程序。它是建立在tmpfs上的,在执行完之后会去加载我们的根文件系统,如果没有指定内核参数,则加载默认的。

1.2 qemu命令重新说明


这里我们把上一篇文章的qemu启动命令在重新说一遍:
 

qemu-system-x86_64   \
     -kernel ./bzImage 内核文件
     -initrd ./rootfs  临时根文件系统
     -append "root=根文件系统 rdinit=第一个init程序"

-initrd 就是指定我们的临时根文件系统目录,同时临时根文件系统的格式只能是SVR4的归档格式,详细可以参考我上一篇的文章,指定了之后,-append给内核传递启动参数时立马的rdinit意思是从临时根文件系统里寻找第一个执行的程序,如果是init=则是从根文件系统里寻找,这个需要使用root=指定根文件系统

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章