免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5192 | 回复: 2
打印 上一主题 下一主题

关于给2.6内核传递initrd的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-30 19:27 |只看该作者 |倒序浏览
我用的boot loader 是vivi, s3c2410
2.6.14.1内核,我想用initrd做为根文件系统,
这样的话需给内核传递initrd_start,initrd_size这两个参数
可在内核文档中要求initrd_start为虚拟地址,

这怎么办,我应把initrd放在哪,initrd_start 设为什么?

论坛徽章:
0
2 [报告]
发表于 2008-01-02 12:13 |只看该作者
initrd_start是物理地址吧?直接下到指定的位置就行了

论坛徽章:
0
3 [报告]
发表于 2008-01-03 13:57 |只看该作者

回复 #1 duyaolin 的帖子

走一遍initrd处理的过程吧
2.6.12, arch\arm\kernel\setup.c

  1. static void __init early_initrd(char **p)
  2. {
  3.         unsigned long start, size;

  4.         start = memparse(*p, p);
  5.         if (**p == ',') {
  6.                 size = memparse((*p) + 1, p);

  7.                 phys_initrd_start = start;
  8.                 phys_initrd_size = size;
  9.         }
  10. }
  11. __early_param("initrd=", early_initrd);
复制代码

这里先解析你的initrd参数,把你给的物理地址和大小信息存入全局的phys_initrd_start和phys_initrd_size中
转到arch/arm/mm/init.c, bootmem_init()

  1. #ifdef CONFIG_BLK_DEV_INITRD
  2.         if (phys_initrd_size && initrd_node >= 0) {
  3.                 reserve_bootmem_node(NODE_DATA(initrd_node), phys_initrd_start,
  4.                                      phys_initrd_size);
  5.                 initrd_start = __phys_to_virt(phys_initrd_start);
  6.                 initrd_end = initrd_start + phys_initrd_size;
  7.         }
  8. #endif
复制代码

把物理地址转换成内核虚拟地址initrd_start和initrd_end后,再到init/initramfs.c, populate_rootfs()

  1. #ifdef CONFIG_BLK_DEV_INITRD
  2.         if (initrd_start) {
  3.                 int fd;
  4.                 printk(KERN_INFO "checking if image is initramfs...");
  5.                 err = unpack_to_rootfs((char *)initrd_start,
  6.                         initrd_end - initrd_start, 1);
  7.                 if (!err) {
  8.                         printk(" it is\n");
  9.                         unpack_to_rootfs((char *)initrd_start,
  10.                                 initrd_end - initrd_start, 0);
  11.                         free_initrd_mem(initrd_start, initrd_end);
  12.                         return;
  13.                 }
  14.                 printk("it isn't (%s); looks like an initrd\n", err);
  15.                 fd = sys_open("/initrd.image", O_WRONLY|O_CREAT, 700);
  16.                 if (fd >= 0) {
  17.                         sys_write(fd, (char *)initrd_start,
  18.                                         initrd_end - initrd_start);
  19.                         sys_close(fd);
  20.                         free_initrd_mem(initrd_start, initrd_end);
  21.                 }
  22.         }
  23. #endif
复制代码

代码很明显,对于initrd,作为文件存储为/initrd.image,再到init/do_mounts_initrd.c, initrd_load()

  1. create_dev("/dev/ram", Root_RAM0, NULL);
  2.                 /*
  3.                  * Load the initrd data into /dev/ram0. Execute it as initrd
  4.                  * unless /dev/ram0 is supposed to be our actual root device,
  5.                  * in that case the ram disk is just set up here, and gets
  6.                  * mounted in the normal path.
  7.                  */
  8.                 if (rd_load_image("/initrd.image") && ROOT_DEV != Root_RAM0) {
  9.                         sys_unlink("/initrd.image");
  10.                         handle_initrd();
  11.                         return 1;
  12.                 }
复制代码

这里的注释就是initrd的"终结者"了,到了/dev/ram就很没有疑问了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP