Chinaunix首页 | 论坛 | 博客
  • 博客访问: 275765
  • 博文数量: 89
  • 博客积分: 1380
  • 博客等级: 中尉
  • 技术积分: 705
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-10 11:04
文章分类

全部博文(89)

文章存档

2014年(4)

2011年(1)

2010年(42)

2009年(42)

我的朋友

分类: 嵌入式

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

阅读(829) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~