https://blog.csdn.net/vma_lma/article/details/20527189
我们可以把很多驱动程序编译成模块,随用随加载
极少数情况,某些模块是相互冲突的,比如 2.4 内核的某些版本之中,reiserfs 和 ext3 两种驱动不能同时被编译到内核当中。
所以,我们只能在内核中放入必要的驱动程序,其余的不那么需要的部分编译成模块放到 /lib/modules/`uname -r`/
之中,在需要的时候会被加载。
但是,对于具有通用性的内核,是很难论断出哪几种驱动程序才是真正必须的,究竟是 Intel 的 IDE 磁盘控制器还是 AMD/nVidia 的,抑或是 VIA 的,乃至SCSI 磁盘……是阿,这真是个很困扰人的问题,没有一个驱动可以在占用绝对少的空间的前提下应付所有的设备,于是,我们退而求其次,寻求一个中间介质 --- ramdisk
在启动前,引导程序首先在内存之中构建一个 ramdisk,成为一个基本文件系统,然后 Linux 内核以此为自己的启动,这样的好处是可以不必理会的问题,只要能驱动 ramdisk 就可以了。
用 ramdisk 启动之后,在 ramdisk 的启动脚本
(一般叫 /linuxrc) 之中,针对硬件尝试 ramdisk 里面的 /lib/modules/`uname
-r`/,加载恰当的驱动,这时系统已经具备了切换到硬盘或其他介质上的文件系统的条件了。
机不可失,这时,我们首先加载硬盘或光盘、u
盘等启动介质,然后设该介质为根分区,并运行其 init 进程为 1 进程,之后,在 init 脚本中,释放掉 initrd 的空间,这就是借助
initrd 的引导过程。在这个过程之中 引导程序帮我们多做了一件事 --- 构建 ramdisk, 把 initrd 放入内存。
这里面总结一下linuxrc的作用: (参考/usr/src/linux-2.4/Documentation/initrd.txt文档) 1)/linuxrc文件决定在挂载真正的文件系统之前所需完成的事情(譬如加载必要的网络驱动或者加载ext3文件系统).
2)/linuxrc加载必要的模块.
3)/linuxrc挂载根文件系统
4)/linuxrc调用pivot_root来改变根目录
既然linuxrc的主要目的是加载模快用的,那如果我们的内核没有动态的模块而所需的功能都是静态编译进内核的,那么是不是可以不用linuxrc文件呢?
答案是可以不用,在普通的linux操作系统里面可以加入noinitrd选项以告知boot loader 不使用initrd.
如果我们做网关,因为ram是我们的文件系统的载体,所以initrd一行当然不能去掉,但是我们可以不用linuxrc文件,sysroot文件夹和initrd文件夹.
阅读(393) | 评论(0) | 转发(0) |