关于linux内核移植文件系统问题的一些讨论

wdw1600 2009-05-13 03:13:37
最近做linux系统移植,出现了文件系统无法挂载的问题,在网上看了很多类似的问题和答案还是没法解决,贴上来请教下做过的大侠

启动linux的时候出现下面的错误信息:
have set IISLRCK=GPE0, IISSCLK=GPE1, CDCLK=GPE2, IISSDI=GPE3, IISSDO=GPE4

line 1323 passed! have Enable IIS clock

success register irq: iisout_dma_done_handler

success register irq: iisin_dma_done_handler

UDA1341 audio driver initialized

driver uda1341 in /sound/oss/s3c2410-oss.c

yaffs: dev is 32505859 name is "mtdblock3" //这里"mtdblock3"是我存放cramfs文件系统的地方yaffs: passed flags ""

yaffs: Attempting MTD mount on 31.3, "mtdblock3"//这里是去寻找我的文件系统?yaffs: auto selecting yaffs2 //怎么到了这里又选择yaffs2了??VFS: Mounted root (yaffs filesystem). //还有这里我本来是cramfs文件系统,怎么变成mount yaffs文件系统了
mount_devfs_fs(): unable to mount devfs, err: -2 //失败。。。

Freeing init memory: 132K

Warning: unable to open an initial console. //我maknod了节点的,怎么还是错。。。Kernel panic - not syncing: No init found. Try passing init= option to kernel.


我对linux文件系统不是很熟悉,谢谢大虾们指点指点
...全文
412 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdw1600 2009-06-22
  • 打赏
  • 举报
回复
奇怪了,这帖子我早结了杂还说我没结
pottichu 2009-05-19
  • 打赏
  • 举报
回复
你的bootloader 里没有设置文件系统类型。。。

另外看一下
cat /proc/filesystems
你的kernel是否支持 cramfs
再看看
cat /proc/cmdline
看一下启动参数是什么。


另外你可以重点看一下 init目录下的 do_mounts.c 文件,这是kernel启动时候挂文件系统用的,
你可以在这里直接把文件系统类型些死了。
wdw1600 2009-05-19
  • 打赏
  • 举报
回复

/*********************************这个是我的FLASH分区*********************************/
static struct Partition NandPart[] = {
{0, 0x00040000, "boot"},
{0x00040000, 0x00200000, "MyApp"},
{0x00240000, 0x00200000, "kernel"},
{0x00440000, 0x03400000, "fs_cramfs"}, //第三个分区,放文件系统的
{0x03840000, 0x00800000, "fs_yaffs"},
{0x04040000, 0x02000000, "wince"},
{0x06040000, 0x39fc0000, "reserve"},
{0, 0x40000000, "erase_all"},
{0, 0 , 0}
};

/**************************这个是我的bootloader配置**********************************/
BootParams boot_params = {
{"auto-run", 1}, //0=boot without parameters,1=boot with parameters
//{"cpuclk", 2}, //0=200M, 1=300M, 2=400M, 3=440M
{"rundelay", 0}, //0 seconds
{"serial", 0}, //0=serial port 0, 1=serial port 1
{"AppRunAddr", 0x32000000},
{"baudrate", 115200},
{"machine", 193},
{"runAddr", 0x30201000},
{"rootfs", 3}, //rootfs参数是第三个分区
{"tty", 0},
{"displayS", 0}, //0=320*240 1=640*480 2 = 800*600
{"displayM", 0}, //0= lcd 1=vga 2=tv
{"initrdA", 0x30200000},
{"initrdL", 0},
{"memsize", 0x04000000},
//{"devfs", 1},
//{"ostore", 0}, //0=nand, 1=nor
{"userpara", sizeof(DEFAULT_USER_PARAMS)},
DEFAULT_USER_PARAMS,
{0}
};

/***********************************这个是引导linux启动部分,与文件系统有关的蓝色标注***********/
static void LoadRun(void)
{
U32 i, ram_addr, buf = boot_params.run_addr.val;
struct param_struct *params = (struct param_struct *)0x30000100;
int size;

memset(params, 0, sizeof(struct param_struct));
/*{
U32 *pD = (U32 *)0x30000100;

for(i=0; i<0x1000; i++)
pD[i] = 0;
}*/
if(boot_params.start.val) {
char parameters[2048];
char *rootfs;
char initrd[32];
char *tty_sel;
char *devfs_sel;
char *display_sel;

switch (boot_params.root_sel.val) {
case 0:
rootfs = "/dev/ram";
break;
case 1:
rootfs = "nfs";
break;
case 2:
rootfs = "/dev/mtdblock2"; // by pht.
break;
case 3:
rootfs = "/dev/mtdblock3"; //rootfs配置
break;
case 4:
rootfs = "/dev/mtdblock4";
break;
default:
rootfs=""; //user define
break;
}

switch (boot_params.display_sel.val) {
case 0:
display_sel = "display=sam320";
break;
case 1:
display_sel = "display=vga640";
break;
case 2:
display_sel = "display=vga800";
break;
default:
display_sel = "display=sam320";
break;
}

if(boot_params.root_sel.val)
sprintf(initrd, "load_ramdisk=0");
else
sprintf(initrd, "initrd=0x%08x,0x%08x",
boot_params.initrd_addr.val,
boot_params.initrd_len.val);

switch (boot_params.tty_sel.val) {
case 0:
tty_sel="ttySAC0";
break;
case 1:
tty_sel="ttySAC1";
break;
case 2:
tty_sel="ttyS0";
break;
case 3:
tty_sel="ttyS1";
break;
default:
tty_sel="ttySAC0"; //user define
break;
}


devfs_sel = "devfs=mount";


memset(parameters, 0, sizeof(parameters));
sprintf(parameters,
"root=%s init=/linuxrc %s console=%s,%d mem=%dK %s %s %s",
rootfs,initrd,tty_sel,boot_params.serial_baud.val,
boot_params.mem_cfg.val>>10,devfs_sel,display_sel,
boot_params.string);

params->u1.s.page_size = LINUX_PAGE_SIZE;
params->u1.s.nr_pages = (boot_params.mem_cfg.val >> LINUX_PAGE_SHIFT);
memcpy(params->commandline, parameters, strlen(parameters));

printf("Set boot params = %s\n", params->commandline);
}

printf("Load Kernel...\n");
/*
if(boot_params.osstor.val) //load program from NOR or NAND FLASH
memcpy((void *)buf, (void *)(0x04000000+0x00020000), 0x001e0000);
else {
*/
StartPage = NandPart[2].offset>>12;
size = NandPart[2].size;
ram_addr = buf;

for(i=0; size>0; ) {
if(!(i&0x3f)) {
if(CheckBadBlk(i+StartPage)) {
printf("Skipped bad block at 0x%x\n", i+StartPage);
i += 64;
size -= 64<<11;
continue;
}
}
ReadPage((i+StartPage), (U8 *)ram_addr);
i++;
size -= 2048;
ram_addr += 2048;
}
// }

if(!boot_params.root_sel.val) {
int ramdisk_sz;

printf("Load Ramdisk...\n");

StartPage = NandPart[3].offset>>11;
size = NandPart[3].size;

ram_addr = boot_params.initrd_addr.val;
ramdisk_sz = boot_params.initrd_len.val;

for(i=0; size>0&&ramdisk_sz>0; ) {
if(!(i&0x3f)) {
if(CheckBadBlk(i+StartPage)) {
printf("Skipped bad block at 0x%x\n", i+StartPage);
i += 64;
size -= 64<<11;
continue;
}
}
ReadPage((i+StartPage), (U8 *)ram_addr);
i++;
size -= 2048;
ram_addr += 2048;
ramdisk_sz -= 2048;
}
}

DsNandFlash();

//ChangeClockDivider(13,12);
//ChangeMPllValue(67,1,1); //300MHz,2440A!
//rCLKCON = 0x7fff0;
call_linux(0, boot_params.machine.val, buf);
}
yangzhifu 2009-05-18
  • 打赏
  • 举报
回复
从yaffs: dev is 32505859 name is "mtdblock3"
yaffs: passed flags ""

yaffs: Attempting MTD mount on 31.3, "mtdblock3
yaffs: auto selecting yaffs2
得到是用了yaffs文件系统,可以把启动的参数修改一下,rootfs=cramfs
pottichu 2009-05-15
  • 打赏
  • 举报
回复
你是如何修改 flash 分区大小的 ?
另外,把你的启动参数全部发上来 。
rzsheng 2009-05-14
  • 打赏
  • 举报
回复
不知道你用的 优龙 的 2410 是否能支持1G的 flash.

你这样修改了之后能否用df 看到flash存储空间的变化,能否看到真实的1G的空间?


[Quote=引用 6 楼 wdw1600 的回复:]
我看了bootloader里设置是那样的用的优龙的bootloader,
问题是这样出现的,我把开发板的flash改了,64M的k9f1208改成了1G的k9k8g08,bootloaer里分区块数我没改,只是把大小改了,在linux内核的devs.c文件里也做了相应的修改。
在小flash板子上能正确运行linux但是在大flash板子上就不行。网上有人说在文件系统里也要做修改,但是我不知道在哪里修改,谢谢大侠指点。
[/Quote]
wdw1600 2009-05-14
  • 打赏
  • 举报
回复
是2440的,能支持1Gflash ,我再上面跑了WINCE看了的,没问题,
bootloader里面设置:root=/dev/mtdblock3是这样设置的没错。而且我把cramfs文件系统是放在flash的第四个分区的。还是出现上面的情况。是不是再文件系统里要修改什么参数啊,我改了flash分区大小,分区个数和名字没变!
wdw1600 2009-05-14
  • 打赏
  • 举报
回复
是2440的,能支持1Gflash ,我再上面跑了WINCE看了的,没问题,
bootloader里面设置:root=/dev/mtdblock3是这样设置的没错。而且我把cramfs文件系统是放在flash的第四个分区的。还是出现上面的情况。是不是再文件系统里要修改什么参数啊,我改了flash分区大小,分区个数和名字没变!
morris88 2009-05-13
  • 打赏
  • 举报
回复
采用 bootloader 下载 linux 核心,然后就可以加载一些参数 root=/dev/mtdblock3 console= 等等
之类的来启动 linux ...
wdw1600 2009-05-13
  • 打赏
  • 举报
回复
我看了bootloader里设置是那样的用的优龙的bootloader,
问题是这样出现的,我把开发板的flash改了,64M的k9f1208改成了1G的k9k8g08,bootloaer里分区块数我没改,只是把大小改了,在linux内核的devs.c文件里也做了相应的修改。
在小flash板子上能正确运行linux但是在大flash板子上就不行。网上有人说在文件系统里也要做修改,但是我不知道在哪里修改,谢谢大侠指点。
wdw1600 2009-05-13
  • 打赏
  • 举报
回复
哦,先谢谢两位的解答,我用的Bootloader是专用的,我得去分析下bootloader再试试,谢谢!
pottichu 2009-05-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wdw1600 的回复:]
引用 1 楼 morris88 的回复:
可以在启动命令行设置一下嘛 root=/dev/xxx ...

请问下morris88大侠启动命令行设置是不是在文件系统里面的linuxrc文件里设置?

[/Quote]

root=/dev/mtdblock3

这个要在 uboot的启动参数里设置。
你的问题其实很明显。

你的文件系统是 cramfs, 但是你按照 yaffs 格式去挂载,当然不能成功了。


如何设置 u-boot ,你google一下就有了 。
wdw1600 2009-05-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 morris88 的回复:]
可以在启动命令行设置一下嘛 root=/dev/xxx ...
[/Quote]
请问下morris88大侠启动命令行设置是不是在文件系统里面的linuxrc文件里设置?
wdw1600 2009-05-13
  • 打赏
  • 举报
回复
have set IISLRCK=GPE0, IISSCLK=GPE1, CDCLK=GPE2, IISSDI=GPE3, IISSDO=GPE4

line 1323 passed! have Enable IIS clock

success register irq: iisout_dma_done_handler

success register irq: iisin_dma_done_handler

UDA1341 audio driver initialized

driver uda1341 in /sound/oss/s3c2410-oss.c

yaffs: dev is 32505859 name is "mtdblock3" //这里"mtdblock3"是我存放cramfs文件系统的地方
yaffs: passed flags ""

yaffs: Attempting MTD mount on 31.3, "mtdblock3"//这里是去寻找我的文件系统?
yaffs: auto selecting yaffs2 //怎么到了这里又选择yaffs2了??
VFS: Mounted root (yaffs filesystem). //还有这里我本来是cramfs文件系统,怎么变成mount
yaffs文件系统了
mount_devfs_fs(): unable to mount devfs, err: -2 //失败。。。

Freeing init memory: 132K

Warning: unable to open an initial console. //我maknod了节点的,怎么还是错。。。
Kernel panic - not syncing: No init found. Try passing init= option to kernel


我重新贴下上面乱了行了
morris88 2009-05-13
  • 打赏
  • 举报
回复
可以在启动命令行设置一下嘛 root=/dev/xxx ...

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧