paradisedell 發(fā)表于 2005-2-1 14:26
求助映像文件的制作。
我從網(wǎng)上下載了 skyeye-binary-testutils-1.0.7的例子。
我從ep7312_with_framebuffer_touchscreen_minigui中得到y(tǒng)wcromfs-minigui.img文件。
我自己編譯了linux-2.4.13的內(nèi)核,打上了所有的補丁之后,生成了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目錄中。
應該是我創(chuàng)建img的方法不對。
請斑竹及各位高手幫我看看。我暫時還是一個初學者。多謝了??!
希望春節(jié)前解決這個問題,然后就可以移植minigui了。
halfyear 發(fā)表于 2005-2-1 16:08
修改skyeye.conf
用my.img 替換文件中的ywcromfs-minigui.img
halfyear 發(fā)表于 2005-2-1 16:33
我做過minigui 2 ep7312 lubbock的移植,碰到問題可以到minigui的論壇www.minigui.org上發(fā)帖子,或者給我發(fā)郵件ywc02@mails.tsinghua.edu.cn
paradisedell 發(fā)表于 2005-2-1 16:46
我已經(jīng)在skyeye.conf里面修改了。但是還是不行。
我察看了my.img和 ywcromfs-minigui.img文件,好像他們的格式不一樣。
我不知道生成img文件的正確方法是啥?
請各位高手指點指點。
halfyear 發(fā)表于 2005-2-1 16:58
[quote]
cp -r /mnt/test /usr/test
[/quote]
用cp -dpR /mnt/test /usr/test 試試
paradisedell 發(fā)表于 2005-2-2 09:35
多謝各位朋友。
我試了。但是還是不行。
不知道你們用的genromfs的版本。
我是從網(wǎng)上下載的genromfs-0.5.1-1.i386.rpm.
真是弄不明白了。
paradisedell 發(fā)表于 2005-2-3 11:55
經(jīng)過幾天的努力,這個問題解決了。下面是我的做法。
可能有些理解不是很對,但是確實可行。希望能夠?qū)Υ蠹矣行椭?br>
如何制作根文件系統(tǒng)?
建立如下的script腳本文件
#!/bin/sh
dd if=/dev/zero of=/dev/ram bs=1k count=2048
// 2048表示2M.用戶可以自己設定實際的數(shù)值。申請內(nèi)存空間
mke2fs -vm0 /dev/ram 2048
//將內(nèi)存空間轉(zhuǎn)換成ext2文件系統(tǒng)
mount -t ext2 /dev/ram /mnt/ramdisk
//mount文件系統(tǒng)
cp -avUserDir /mnt/ramdisk
//向文件系統(tǒng)中寫入用戶的各種文件
genromfs –v –V “ROMdisk” –d /mnt/ramdisk –f my.img
//制作根文件系統(tǒng)的映像文件
umount /mnt/ramdisk
//umount文件系統(tǒng)
dd if=/dev/ram bs=1k count=2048
//釋放內(nèi)存空間
my.img就是根文件系統(tǒng)??梢耘浜蟬kyeye使用了。
asenter 發(fā)表于 2005-2-4 15:02
樓主,很感謝你的經(jīng)驗共享
我想請教一個問題:就是uclinux 啟動時,他怎么知道根文件系統(tǒng)在哪里的?
:oops: ,疑惑很長時間了
halfyear 發(fā)表于 2005-2-4 15:49
在編譯內(nèi)核時,可以配置
CONFIG_CMDLINE="root=/dev/rom" //ROMDisk
或root=/dev/ram //RAMDisk
或root=/dev/mtdblock* //基于mtd驅(qū)動的文件系統(tǒng),例如JFFS2
或root=/dev/nfs //NFS文件系統(tǒng)
掛載根文件系統(tǒng)的源代碼在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 發(fā)表于 2005-2-4 16:16
謝謝你
:arrow:
我說的不是這些
我所指的是,在uclinux中生成的romfs.img,它保存在FLASH上的地址應該不是隨意的吧,我 想問的就是,內(nèi)核怎么知道這個romfs.img在哪里的? :!:
asenter 發(fā)表于 2005-2-5 09:40
:!:
頂一下了
是說 那個文件系統(tǒng)的鏡像,內(nèi)核怎么知道那個鏡像在哪的? :idea:
謝謝
halfyear 發(fā)表于 2005-2-5 11:09
我說一下我熟悉的Lubbock開發(fā)板的Flash分區(qū)在內(nèi)核中的設置:
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就是內(nèi)核啟動時掛載根文件系統(tǒng)的位置,事先在skyeye.conf中配置
mem_bank: map=M, type=RW, addr=0xa1000000, size=0x00800000, file=./initrd4M.img
這樣SkyEye運行target sim時就將鏡像裝入模擬的RAM中的0xa1000000開始的空間
不知道我目前了解的這點信息對你到uClinux源碼中尋找答案是否有幫助。
asenter 發(fā)表于 2005-2-5 13:42
:arrow:
很是感謝你
initrd=0xa1000000 可這個參數(shù)內(nèi)核是怎么知道的?
否則內(nèi)核也沒法把位于這個地方的RAMDISK鏡像弄到內(nèi)存
是不是由引導文件告訴內(nèi)核的?
可又不怎么對,因為有的uclinux編譯后直接把roomfs.img和內(nèi)核連接在一起了
那連在一起的時候roomfs.img的地址又怎么確定?
問題多多,現(xiàn)在自己的電腦又不在邊上。唉,更慘的是,昨天買了本垃圾書,關于uclinux的,內(nèi)容提要里說的好聽,真正的內(nèi)容都是網(wǎng)上摘的,氣死了