Linux启动过程中文件系统的加载

嵌入式操作系统

57人已加入

描述

 

  我觉得我的文章相对来说都是比较浅显的。一些初学者可以看看,这也是我不在嵌入式那个版上发文的原因。对于高手来说,如果你们不吝啬时间的话,希望也能帮我看看,指点一下其中的错误。这也是我到这里来和大家交流的目的。

  在完成了模块驱动后,就要挂载文件系统了。我一直以为:

  我编译的内核是采用了initrd的模式,设备是在RAM DISK文件系统下的/linuxrc脚本程序加载的,因此在这上面浪费了很多时间。不过对initrd算是有了比较深的理解,这个等一下再说。

  其实,内核挂载的第一个文件系统就是nand flash中的root.cramfs,关于挂载相关的代码mount_root()在文件/fs/super.c里面。随后将devcie文件系统挂载到/dev目录下面,代码为mount_devfs_fs()。因为采用了noninitrd的模式,因此文件系统的挂载就完毕了,init进程继续往下走到一直到运行:

  if (execute_command)

  execve(execute_command,argv_init,envp_init);

  这里init切换成另外一个线程,运行程序在execute_command中定义。execute_command是vivi传进来的命令行,启动过程中可以看到:

  Kernel command line: noinitrd root=/dev/bon/2 init=/linuxrc console=ttyS0

  因此execute_command对应/linuxrc,因此程序运行根目录下的脚本linuxrc,在我的系统中他对应:

  #!/bin/sh

  echo "mount /etc as ramfs"

  /bin/mount -n -t ramfs ramfs /etc

  /bin/cp -a /mnt/etc/* /etc

  echo "re-create the /etc/mtab entries"

  /bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/3 /

  /bin/mount -f -t ramfs ramfs /etc

  exec /sbin/init

  这个就不解释了(最后是启动bash),大家可以在linux下把root.cramfs挂载到/mnt下面看看内容就知道了:

  mount –t cramfs –o loop root.cramfs /mnt/cramfs

  这里其实想告诉大家,我们如何实现开机自动加载一些运行程序,现在应该很明白了吧,写个脚本就OK了。(其实是我以前一直在yy这个问题)

  最后讲一下initrd(initail ram disk)

  原理我就不说了,陈词滥调了,网上多的很。我将一点我的理解,initrd包含了部分module的驱动,从一定程度上分担了内核的大小,因为启动的时候这两者还是要同时被load到memory中去的;因此更重要的是它可以保证内核的可移植性,对不同的硬件平台,只要提供不同的initrd文件系统,而内核可以保持不变。因此,initrd的主要作用是加载一些复杂的与平台相关的硬件,如SCSI硬盘驱动,网卡驱动(像无盘工作站,使用nfs)等。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分