嵌入式程序linux启动过程,嵌入式Linux系统启动过程简介

【某人问题 内核在启动的过程中,是如何完成将本地的flash设备映射成文件系统的? 】

我用的是ramdisk.image.gz,烧写在flash的0x10140000处

我不太明白内核在启动过程中式如何将这个文件映射成/目录及各子目录的?

如果ramdisk.image.gz在flash中的位置发生了变化,应该如何修改内核啊?

【解答】 没理解错的话,ramdisk.image.gz应该是你的内核的压缩镜像。 你的问题,要分2方面和你解释: 1.将这个文件映射成/目录及各子目录的 不是将这个文件映射根目录成及各子目录的, 而是对应的根文件系统,简称rootfs(root file system), 对应着/根目录及其各个子目录和文件。 发现要解释清楚,要简单说清楚整个系统启动的过程: 【系统启动过程简介】 初始化代码读取uboot到内存里面,然后跳转到uboot那里去执行uboot, uboot初始化必要的硬件,加载一些驱动,其中包括nand flash的驱动, 然后根据你的uboot里面设置的一个启动命令: nand read 0x30007FC0 0x100000 0x200000;bootm 0x30007FC0 意思就是,先去读取nand flash,从0x100000开始,长度为0x200000的数据到memory的0x30007FC0处, 然后bootm表示从memory的0x30007FC0开始运行。 也就是去运行你的内核镜像了。 此处也就是你的ramdisk.image.gz。 而你的地址是0x10140000,所以,上面中的启动命令,至少0x100000要改成你的地址0x10140000。 然后,内核会自己解压缩,然后执行, 初始化硬件, 加载驱动模块, 最后去挂载rootfs, 而此文件系统是什么格式的,是从uboot里面定义的: #define CONFIG_BOOTARGS   "root=/dev/mtdblock2 rw init=/linuxrc console=ttyS0,115200 mem=16M rootfstype=yafffs2" 并在从uboot掉转到内核运行时候,传递给内核的, 这样内核在加载rootfs的时候,才知道,要以什么格式,比如上面的yaffs2格式, 去加载此文件系统。 此文件系统,也是你实现自己用相应的文件系统制作工具,制作的,然后烧写到对应的位置的。 上面中root=/dev/mtdblock2,表示,要去/dev/mtdblock2,也就是你的mtd的第3个分区,去加载。 而这里的mtd的第3个分区具体对应的nand flash中的的地址, 是你在内核中,一般是在core.c自己定义的的nand flash的分区。 一般是uboot是第一个分区,内核kernel是第二个,然后就是rootfs是第三个分区,也就是/dev/mtdblock2。 随便网上给你找个别人的分区: static struct mtd_partition rm9200_partitions[3] = {         {        /* uboot 256K */                 .name = "uboot",                 .size = 0x40000,                 .offset = 0         },         {        /* kernel 1.768M */                 .name = "kernel",                 .size = 0x1C0000,                 .offset = 0x40000         },         {        /* rootfs 2M */                 .name = "rootfs",                 .size = 0x200000,                 .offset = 0x200000         }, }; 如果按照上面分区,定义的/dev/mtdblock2的起始地址是0x200000,还算成大小是2M的位置, 然后,内核启动挂载rootfs的时候,就是,以上面从uboot传过来的参数中yaffs2格式, 到nand flash 的2M的地址读取并加载rootfs, 加载完成后,这样,里面对应的,你说的根目录,以及所有的文件,文件夹就都可以识别了。 然后才会去读取并运行初始化脚本相关的东西, 最后初始化console控制台,然后你才能看到那个常见的#,才可以输入命令,比如ls,才可以和系统交互。 所以,你说的位置或地址如何映射成/根目录的,实际就是这个rootfs,对应着mtdblock2, 对应的某个nand flash上的地址,比如此处的2M的地方。而不是内核kernel这个文件映射的。 内核kernel,对应着是分区里面的mtdblock1,比如上面的地址0x40000。 2. 如果ramdisk.image.gz在flash中的位置发生了变化,应该如何修改内核啊? 如果地址变化了,那么 uboot中定义的启动参数: nand read 0x30007FC0 0x100000 0x200000;bootm 0x30007FC0 中的0x100000就要换成你的新的地址就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值