分类: 嵌入式
2009-11-16 17:13:58
今天终于感觉到对以前的一些概念的理解有点事是而非,很多东西感觉是已经理解了,但是真正细细考究起来,又不知其所以然,既然选择了嵌入式这一行,那么从今天起也就踏踏实实地做上去,要学的虽然很多,但通过自己的摸索,一点点地去研究,一定可以进步的,所以加油哦,再也不能偷懒了哦... 今天的第一天,学习的内容是ramdisk文件系统的建立,看了几种文件系统的区别,什么jffs2, cramfs, ramdisk, squashfs 但是还是没有一个直观的概念。 一个一个去理解吧。
这是我的project中关于创建ramdisk的那一部分:
//首先建立挂载点
mkdir -p image/tmp
//清空挂载点文件夹里的内容
rm -rf image/tmp/*
//在本地目录下产生一下ramdisk的块文件 //dev/zero的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件.
dd if=/dev/zero of=image/ramdisk bs=1024k count=18
// 格式化ramdisk (创建文件系统,系统为ext2文件系统)
mke2fs -F image/ramdisk
//挂载ramdisk到挂载点
mount -o loop image/ramdisk image/tmp cd image;
tar xzvf ramdisk_def.tar.gz -C tmp/
.... .....
//转换到root权限
chown root.root image/tmp/* -R
-chmod a+s image/tmp/bin/su
chmod a+x image/tmp/lib/ -R
umount image/tmp/
gzip image/ramdisk
在 kerenl启动阶段,需要用到 initrd, 具体的我的bootpImage 是这样的 (make bootpImage initrd = ramdisk.gz)
那下面就要谈谈initrd是如何运作和加载的了: Linux启动阶段的Ramdisk相当于一个未格式化的硬盘分区,核心可以直接将initrd的内容释放到一个未初始化的Ramdisk里,于是,相应的内容被加载到相应的Ramdisk中,同时,这个Ramdisk也被格式化成某种由initrd格式所表达的分区格式。 那到底initrd是怎样被kernel加载的, 我在这里给出调用的层次结构(我的是2.4的kernel): init/main.c---init() init/do_mounts.c---->prepare_namespace()--->initrd_load() initrd_load()--->rd_load_image()--->identify_ramdisk_image()--->crd_load() --->gunzip() initrd_load()--->mount_root()--->mount_block_root()--->sys_mount() init/main.c-->run_init_process(这会导致调用 execve 来启动 init 进程)
busybox中的init 就会加载/etc/inittab脚本文件,一般说来在这个脚本文件里最终会加载/etc/init.d/rc.sysinit