这里的--static 参数告诉gcc把这个程序静态联接,这样这个程序不倚赖任何库就能运行。把编译好的init程序拷贝到/sbin下,备份好原来的那个。重新启动系统最后系统的输出结果是: hello, world!
然后停在那里。做这个实验以前先确定你知道如何把系统恢复到原来的状态,有一个简单的方法,在内核启动前给它加上init=参数,比如你原先的init被你改成了init。baKB 只要在启动的时候给内核加上init=/sbin/init。baKB就可以用原来的init程序启动系统。
做完以上实验,就明白了内核和init程序之间的关系。此外,init程序不一定是一个二进制可执行程序,它可以是一个bash脚本,一个指向另一个程序的联接,它的位置也并不一定要在/sbin下,只要在启动内核时,给内核加上 init参数就能被运行,比如,开始时给内核加上init=/bin/bash参数,内核在最后一步就直接运行bash给出提示符,不用登录系统就可以输入命令了。其功能类似单用户模式启动系统。 /sbin/init 程序只是内核默认运行的第一个程序。
六、编译一个Linux系统内核
1 编译前的规划和准备
在编译内核前,请先确定你的需求,把你的需求罗列成一张详细的表格。你需要让内核支持什么硬件,支持多少种分区类型和文件系统,支持哪些网卡,支持哪些网络协议。等等。请尽可能详细的罗列这些内容,但是你也不要太贪心,因为你所有能利用的空间只有1440KB,如果你编译出一个大于1440KB或很接近这个数字的内核,你的这个项目就不能完成了,你已经没有空间再放ramdisKB映象文件,除非你原意再多出一张软盘,做一个两张软盘的小Linux系统。对于声卡驱动之类,我劝你还是放弃吧,因为一个声卡驱动也许只让你的内核增大了十多 KB,但是你有了一个声卡驱动就务必要有一个播放器吧,否则声卡驱动就没有意义,可一个播放器的大小可不是一张软盘可以装得下的。在我先前制作的 babyLinux内核有900多KB,其中,文件系统部分站了大部分,因为我的目标是把它做成一个系统修复盘。因此我在内核中编译7种文件系统的支持, 每减少一个文件系统就可以减小几十甚至200多KB的内核大小。越是复杂,越是安全的文件系统,其支持模块也越大,比如在Linux下FAT模块只有 32KB,VFAT只有17KB,但是ext3的模块就有86KB,JFS达到216KB,reiserfs模块是224KB,可以想像,编译一个支持7 个文件系统的900多KB的内核,文件系统部分就占了600KB以上的空间,所以如果某一个文件系统是你根本不用的,那么还是不要编译进内核把,这样至少可以省下100多KB的空间。对于其它的驱动,比如网卡,通常大小只有8,9KB,最大的也不过10多KB,因此可以把常用的网卡芯片的驱动都编译进去。另外如果你想让你的babyLinux支持U盘,那么scsi的驱动模块也是不可小看的,它通常要接近150KB,因为U盘是被当做scsi设备来驱动的。另外你还需要让你的内核支持即插即用,这些都是不小的空间开销,我的建议是你放弃一两个你不用的文件系统。总之,你最后编译出来的内核大小最好不要超过900KB,否则你在busybox里只能编译进去很少的命令。
在我编译的busybox中,我编译进去120多个命令,基本上把 busybox支持的命令都包括进去了。加上小系统所必需的文件系统目录,/dev下的设备文件,以及/etc下几个必需的配置文件,做成 ramdisKB压缩后的大小是440多KB, 加上900KB左右的内核刚好可以放入一张1440KB软盘,请注意,你应该留下至少50KB的空间,因为我们要在软盘上创建一个ext2文件系统,而文件系统本生需要占据大概25KB的磁盘空间。另外lilo的引导文件boot.b的大小是5。7KB,还有装上lilo后自动产生的Map文件也要10多 KB的空间,Map文件的具体大小由内核安装的实际大小决定,通常不会超过30KB。
综上所述,请遵循下面的公式:
内核大小+文件系统压缩印象文件+50KB <= 1440KB
另外一点需要说明的是:
以上所罗列的文件系统模块大小是察看我现在使用的Redhat 9 的/lib/Modules下的模块文件得到的,实际编译进内核大小会小一点,因为我们用Make bzImage。在内核源代码目录树下生成的内核是经过压缩过的。如果你对以上说的内容不太明白也没有关系,我会在下面的内容中做详细的说明。
2 必需编译进内核的内容
首先,我们制作的这个小系统是基于一张软盘的,因此,你的内核必需支持软盘。另外对 IDE硬盘和cdrom的支持也是不可少的,否则做出来的babyLinux就没有实用价值,因为它不能访问硬盘和光盘上的内容这样的Linux虽然可以做的更小,但是制造一个完全没有用的东西是浪费时间。其它的包括framebuffer等,如果你需要支持在字符界面下以高分辨率显示,以看到更多的屏幕内容,那么就必需把framebuffer支持编译进内核,此外在高分辨率下使用的8x8字体也必需编译进去。否则即使你给内核传递了vga= 参数,内核会因为没有可用的小字体而自动转跳到低分辨率模式下,这是以前困扰我好几天想不明白的事情,后来通过反复试验才明白原来是缺少字体的文体。这里我先大致提一下需要注意的事情。在下一小节具体编译时,我会继续就某些细节问题说明。
BabyLinux操作系统的制作过程(下)
(参考链接: http://linux.ccidnet.com/art/741/20070119/1005105_1.html)
|