分享

求助映像文件的制作

 danydany_ok 2010-12-03

paradisedell 发表于 2005-2-1 14:26

求助映像文件的制作。

我从网上下载了 skyeye-binary-testutils-1.0.7的例子。
我从ep7312_with_framebuffer_touchscreen_minigui中得到ywcromfs-minigui.img文件。

我自己编译了linux-2.4.13的内核,打上了所有的补丁之后,生成了vmlinux文件,然后和ywcromfs_minigui.img文件放在同一个目录下面,使用skyeye可以正常工作。
但是我要加入自己的程序,所以就需要重新制作img文件。但是我不知道该怎样去做。
所以我就想在ywcromfs-minigui.img文件中加入自己的程序。
做法如下:

  mount -o loop ywcromfs-minigui.img  /mnt/test
   cp  -r /mnt/test  /usr/test
   然后我在/usr/test目录中加入了自己的程序.
   最后我重新生成一个新的映像文件。
   genromfs -d /usr/test -f my.img
   但是当我使用my.img和vmlinux配合使用的时候,skyeye就会出错。
  错误提示:Kernel panic: No init found.Try passing init= option to kernel.
        at panic.c :103.
    我猜想是kernel没有找到init程序。但是init程序就在/bin /sbin目录中。
   应该是我创建img的方法不对。
   请斑竹及各位高手帮我看看。我暂时还是一个初学者。多谢了!!
   希望春节前解决这个问题,然后就可以移植minigui了。

halfyear 发表于 2005-2-1 16:08

修改skyeye.conf
用my.img 替换文件中的ywcromfs-minigui.img

halfyear 发表于 2005-2-1 16:33

我做过minigui 2 ep7312 lubbock的移植,碰到问题可以到minigui的论坛www.minigui.org上发帖子,或者给我发邮件ywc02@mails.tsinghua.edu.cn

paradisedell 发表于 2005-2-1 16:46

我已经在skyeye.conf里面修改了。但是还是不行。
我察看了my.img和 ywcromfs-minigui.img文件,好像他们的格式不一样。
我不知道生成img文件的正确方法是啥?
请各位高手指点指点。

halfyear 发表于 2005-2-1 16:58

[quote]
cp -r /mnt/test /usr/test
[/quote]
用cp -dpR /mnt/test /usr/test 试试

paradisedell 发表于 2005-2-2 09:35

多谢各位朋友。
我试了。但是还是不行。
不知道你们用的genromfs的版本。
我是从网上下载的genromfs-0.5.1-1.i386.rpm.
真是弄不明白了。

paradisedell 发表于 2005-2-3 11:55

经过几天的努力,这个问题解决了。下面是我的做法。
可能有些理解不是很对,但是确实可行。希望能够对大家有些帮助。

如何制作根文件系统?
建立如下的script脚本文件
#!/bin/sh
dd if=/dev/zero of=/dev/ram bs=1k count=2048
// 2048表示2M.用户可以自己设定实际的数值。申请内存空间
mke2fs -vm0 /dev/ram 2048
//将内存空间转换成ext2文件系统
mount -t ext2 /dev/ram /mnt/ramdisk
//mount文件系统
cp -avUserDir /mnt/ramdisk
//向文件系统中写入用户的各种文件
genromfs –v –V “ROMdisk” –d /mnt/ramdisk –f my.img
//制作根文件系统的映像文件
umount /mnt/ramdisk
//umount文件系统
dd if=/dev/ram bs=1k count=2048
//释放内存空间

my.img就是根文件系统。可以配合skyeye使用了。

asenter 发表于 2005-2-4 15:02

楼主,很感谢你的经验共享

我想请教一个问题:就是uclinux 启动时,他怎么知道根文件系统在哪里的?
:oops: ,疑惑很长时间了

halfyear 发表于 2005-2-4 15:49

在编译内核时,可以配置
CONFIG_CMDLINE="root=/dev/rom"  //ROMDisk
或root=/dev/ram                                 //RAMDisk
或root=/dev/mtdblock*                       //基于mtd驱动的文件系统,例如JFFS2
或root=/dev/nfs                                  //NFS文件系统


挂载根文件系统的源代码在linux/init/do_mounts.c中
/*
* Prepare the namespace - decide what/where to mount, load ramdisks, etc.
*/
void __init prepare_namespace(void)
{
        int is_floppy;

        mount_devfs();

        md_run_setup();

        if (saved_root_name[0]) {
                root_device_name = saved_root_name;
                ROOT_DEV = name_to_dev_t(root_device_name);
                if (strncmp(root_device_name, "/dev/", 5) == 0)
                        root_device_name += 5;
        }

        is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;

        if (initrd_load())
                goto out;

        if (is_floppy && rd_doload && rd_load_disk(0))
                ROOT_DEV = Root_RAM0;

        mount_root();
out:
        umount_devfs("/dev");
        sys_mount(".", "/", NULL, MS_MOVE, NULL);
        sys_chroot(".");
        security_sb_post_mountroot();
        mount_devfs_fs ();
}

void __init mount_root(void)
{
#ifdef CONFIG_ROOT_NFS
        if (MAJOR(ROOT_DEV) == UNNAMED_MAJOR) {
                if (mount_nfs_root())
                        return;

                printk(KERN_ERR "VFS: Unable to mount root fs via NFS, trying floppy.\n");
                ROOT_DEV = Root_FD0;
        }
#endif
#ifdef CONFIG_BLK_DEV_FD
        if (MAJOR(ROOT_DEV) == FLOPPY_MAJOR) {
                /* rd_doload is 2 for a dual initrd/ramload setup */
                if (rd_doload==2) {
                        if (rd_load_disk(1)) {
                                ROOT_DEV = Root_RAM1;
                                root_device_name = NULL;
                        }
                } else
                        change_floppy("root floppy");
        }
#endif
        create_dev("/dev/root", ROOT_DEV, root_device_name);
        mount_block_root("/dev/root", root_mountflags);
}

asenter 发表于 2005-2-4 16:16

谢谢你
:arrow:
我说的不是这些

我所指的是,在uclinux中生成的romfs.img,它保存在FLASH上的地址应该不是随意的吧,我 想问的就是,内核怎么知道这个romfs.img在哪里的? :!:

asenter 发表于 2005-2-5 09:40

:!:
顶一下了
  是说 那个文件系统的镜像,内核怎么知道那个镜像在哪的? :idea:

谢谢

halfyear 发表于 2005-2-5 11:09

我说一下我熟悉的Lubbock开发板的Flash分区在内核中的设置:
static struct map_info lubbock_maps[2] = { {
        .size =                WINDOW_SIZE,
        .phys =                0x00000000,
        .inval_cache =         lubbock_map_inval_cache,
}, {
        .size =                WINDOW_SIZE,
        .phys =                0x04000000,
        .inval_cache =         lubbock_map_inval_cache,
} };

static struct mtd_partition lubbock_partitions[] = {
        {
                .name =                "Bootloader",
                .size =                0x00040000,
                .offset =        0,
                .mask_flags =        MTD_WRITEABLE  /* force read-only */
        },{
                .name =                "Kernel",
                .size =                0x00100000,
                .offset =        0x00040000,
        },{
                .name =                "Filesystem",
                .size =                MTDPART_SIZ_FULL,
                .offset =        0x00140000
        }
};
如果采用的是RAMdisk则设置
CONGIG_CMDLINE="root=/dev/ram rw initrd=0xa1000000,0x00800000 console=ttyS0,115200 mem=64M"
其中initrd=0xa1000000就是内核启动时挂载根文件系统的位置,事先在skyeye.conf中配置
mem_bank: map=M, type=RW, addr=0xa1000000, size=0x00800000, file=./initrd4M.img
这样SkyEye运行target sim时就将镜像装入模拟的RAM中的0xa1000000开始的空间

不知道我目前了解的这点信息对你到uClinux源码中寻找答案是否有帮助。

asenter 发表于 2005-2-5 13:42

:arrow:
很是感谢你


initrd=0xa1000000  可这个参数内核是怎么知道的?
否则内核也没法把位于这个地方的RAMDISK镜像弄到内存

是不是由引导文件告诉内核的?
可又不怎么对,因为有的uclinux编译后直接把roomfs.img和内核连接在一起了
那连在一起的时候roomfs.img的地址又怎么确定?

问题多多,现在自己的电脑又不在边上。唉,更惨的是,昨天买了本垃圾书,关于uclinux的,内容提要里说的好听,真正的内容都是网上摘的,气死了

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多