请教如何把yocto rootfs 修改从挂载在flash上改成挂载到ram上

新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 68, 距离下一级还需 132 积分
论坛徽章:1
我目前用的是Qualcomm的MSM9x15平台,目前代码中使用的bootcmd为:
KERNEL_BOOT_OPTIONS ?= &root=/dev/mtdblock2 rw rootfstype=yaffs2 rootflags=tags-ecc-off console=ttyHSL0,115200 console=ttyHSL1,115200&
root是挂载在flash上的。
现在的需求要改成挂载到ram上,按照baidu的方法,我试着改了一下:
KERNEL_BOOT_OPTIONS ?= &root=/dev/ram0 rw console=ttyHSL0,115200 console=ttyHSL1,115200&
但是内核启动的时候报错说找不到rootfs,如下面的错误。
对这一块很陌生,请教如何改到挂载到ram上呢?
万谢!List of all partitions:
1f00& && && && &1024 mtdblock0&&(driver?)
1f01& && && &&&20736 mtdblock1&&(driver?)
1f02& && && &&&50688 mtdblock2&&(driver?)
1f03& && && &&&40704 mtdblock3&&(driver?)
1f04& && && & 152576 mtdblock4&&(driver?)
1f05& && && && &5376 mtdblock5&&(driver?)
1f06& && && && &2304 mtdblock6&&(driver?)
No filesystem could mount root, tried:&&ext3 ext2 ext4 squashfs vfat btrfs yaffs yaffs2
VFS: Unable to mount root fs on unknown-block(1,0)
User configuration error - no valid root filesystem found
Kernel panic - not syncing: Invalid configuration from end user prevents continuing
[&c0014a44&] (unwind_backtrace+0x0/0xfc) from [&c0666ad4&] (dump_stack+0x20/0x24)
[&c0666ad4&] (dump_stack+0x20/0x24) from [&c06670dc&] (panic+0x94/0x1cc)
[&c06670dc&] (panic+0x94/0x1cc) from [&c08fae70&] (mount_block_root+0x1ec/0x238)
[&c08fae70&] (mount_block_root+0x1ec/0x238) from [&c08fb09c&] (mount_root+0xf8/0x11c)
[&c08fb09c&] (mount_root+0xf8/0x11c) from [&c08fb228&] (prepare_namespace+0x168/0x1c8)
[&c08fb228&] (prepare_namespace+0x168/0x1c8) from [&c08faa54&] (kernel_init+0x1ec/0x230)
[&c08faa54&] (kernel_init+0x1ec/0x230) from [&c000ee30&] (kernel_thread_exit+0x0/0x8)
Watchdog bite received from modem software!
modem subsystem failure reason: err.c:537:Error detected on remote processor..
subsys-restart: subsystem_restart(): Restart sequence requested for modem, restart_level = 1.
Kernel panic - not syncing: subsys-restart: Resetting the SoC - modem crashed.
[&c0014a44&] (unwind_backtrace+0x0/0xfc) from [&c0666ad4&] (dump_stack+0x20/0x24)
[&c0666ad4&] (dump_stack+0x20/0x24) from [&c06670dc&] (panic+0x94/0x1cc)
[&c06670dc&] (panic+0x94/0x1cc) from [&c0043e70&] (subsystem_restart+0x1e8/0x234)
[&c0043e70&] (subsystem_restart+0x1e8/0x234) from [&c0044484&] (restart_modem+0xb4/0xd0)
[&c0044484&] (restart_modem+0xb4/0xd0) from [&c0044734&] (modem_wdog_bite_irq+0x38/0x60)
[&c0044734&] (modem_wdog_bite_irq+0x38/0x60) from [&c00b1c94&] (handle_irq_event_percpu+0x98/0x2a4)
[&c00b1c94&] (handle_irq_event_percpu+0x98/0x2a4) from [&c00b1f04&] (handle_irq_event+0x64/0x84)
[&c00b1f04&] (handle_irq_event+0x64/0x84) from [&c00b4a3c&] (handle_fasteoi_irq+0xbc/0x120)
[&c00b4a3c&] (handle_fasteoi_irq+0xbc/0x120) from [&c00b1590&] (generic_handle_irq+0x30/0x40)
[&c00b1590&] (generic_handle_irq+0x30/0x40) from [&c000ed4c&] (handle_IRQ+0x70/0x94)
[&c000ed4c&] (handle_IRQ+0x70/0x94) from [&c00084b4&] (gic_handle_irq+0x48/0x60)
[&c00084b4&] (gic_handle_irq+0x48/0x60) from [&c0671300&] (__irq_svc+0x40/0x70)
Exception stack(0xcf02de48 to 0xcf02de90)
de40:& && && && && && & 0001f03a ffffffff 000006fc c2c
de60: 0000a c0a31068 ceab515d c0925c68 cf02debc cf02de90 cf02de90
de80: c521b0
ffffffff
[&c0671300&] (__irq_svc+0x40/0x70) from [&c03521b0&] (__delay+0x0/0xc)复制代码
回复 6# fire_vr
设置CONFIG_INITRAMFS_SOURCE路径不要使用打包好之后的,而是要使用源文件路径
不需要制作ram0 image,也不要在cmdline中设置"root=",另外cmdline中需要添加"rdinit=/sbin/init"
小富即安, 积分 3447, 距离下一级还需 1553 积分
论坛徽章:1
本帖最后由 arm-linux-gcc 于
15:04 编辑
& & 设置CONFIG_INITRAMFS_SOURCE路径不要使用打包好之后的,而是要使用源文件路径
不需要制作ram0 image,也不要在cmdline中设置&root=&,另外cmdline中需要添加&rdinit=/sbin/init&
白手起家, 积分 68, 距离下一级还需 132 积分
论坛徽章:1
先自己顶一下
小富即安, 积分 3447, 距离下一级还需 1553 积分
论坛徽章:1
你的rootfs image有多大?
白手起家, 积分 68, 距离下一级还需 132 积分
论坛徽章:1
有大概36M。。。
小富即安, 积分 3447, 距离下一级还需 1553 积分
论坛徽章:1
[ 本帖最后由 arm-linux-gcc 于
10:48 编辑 ]
我记得initramfs的size是有限制的,具体多少记不得了,36M的size应该是超了,如果不行就再裁剪一下(只保留必要的,把不必要的放到flash里去)
make menuconfig,配置如下
General setup
&&[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
&&()& & Initramfs source file(s)& && && && & 填入你的rootfs源文件的目录地址
Device Drivers
&&[*] Block devices&&---&
& & & && &RAM block device support& & 去掉这个选项
cmdline设置
&console=ttyHSL0,115200 console=ttyHSL1,115200 rdinit=/sbin/init&
白手起家, 积分 68, 距离下一级还需 132 积分
论坛徽章:1
本帖最后由 fire_vr 于
14:22 编辑
我现在裁剪到2M左右了,现在的文件系统打包到Kernel里面,即改CONFIG_INITRAMFS_SOURCE:
CONFIG_INITRAMFS_SOURCE=&/devdata/ykong/Rootfs/_install&
但跑起来的时候有下面错误:
我的ram0是在ubuntu上这样生成的,请问有问题吗?
sudo mknod ram0 b 1 0
&&#0: mdm9615-sitar-snd-ca鶹FS: Cannot open root device &ram0& or unknown-block(1,0): error -2
Please append a correct &root=& here are the available partitions:
1f00& && && && &1024 mtdblock0&&(driver?)
1f01& && && &&&20736 mtdblock1&&(driver?)
1f02& && && &&&50688 mtdblock2&&(driver?)
1f03& && && &&&40704 mtdblock3&&(driver?)
1f04& && && & 152576 mtdblock4&&(driver?)
1f05& && && && &5376 mtdblock5&&(driver?)
1f06& && && && &2304 mtdblock6&&(driver?)
VFS: Unable to mount root fs on unknown-block(1,0)
User configuration error - no valid root filesystem found
白手起家, 积分 68, 距离下一级还需 132 积分
论坛徽章:1
自己顶。。。
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:22
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处21ic官方微信-->
F28XX系列FLASH搬移到RAM里运行实现方法
本帖子中包含更多资源
才可以下载或查看,没有帐号?
高级工程师, 积分 5374, 距离下一级还需 2626 积分
高级工程师, 积分 5374, 距离下一级还需 2626 积分
高级工程师, 积分 5374, 距离下一级还需 2626 积分
高级工程师, 积分 5374, 距离下一级还需 2626 积分
1、 建立一个工程;(怎么建立省略)
2、 将工程里面源文件(source)的“DSP2833x_SysCtrl.c” 、 “DSP2833x_usDelay.asm”
和“DSP2833x_CodeStartBranch.asm”文件(如果用的是 TI 提供的文件就是这四
个 文 件 ) 分 别 替 换 成 “ DSP28xxx_SysCtrl.c ” 、 “ DSP28xxx_usDelay.asm ” 和
“DSP28xxx_CodeStartBranch.asm” 。
另外,在将“DSP28xxx_SectionCopy_nonBIOS.asm”文件添加到工程里面;
备 注 : “ DSP28xxx_SysCtrl.c ” 、 “ DSP28xxx_usDelay.asm ” 、
“DSP28xxx_CodeStartBranch.asm”和“DSP28xxx_SectionCopy_nonBIOS.asm”
我已经放在附件里面上传了。
3、 添加 CMD: “DSP2833x_Headers_nonBIOS.cmd” 和 “F2833x_nonBIOS_flash.cmd” 。
如果工程里面已经有了 CMD,要换成这 2 个。
备注: “DSP2833x_Headers_nonBIOS.cmd”和“F2833x_nonBIOS_flash.cmd”也
已经放在附件里。
4、 编译烧写。
cmd是做什么用的呢?没用过呀
F28XX系列FLASH搬移到RAM里运行实现方法
初级工程师, 积分 2868, 距离下一级还需 132 积分
初级工程师, 积分 2868, 距离下一级还需 132 积分
初级工程师, 积分 2868, 距离下一级还需 132 积分
初级工程师, 积分 2868, 距离下一级还需 132 积分
mark ,我比较喜欢
初级工程师, 积分 2518, 距离下一级还需 482 积分
初级工程师, 积分 2518, 距离下一级还需 482 积分
初级工程师, 积分 2518, 距离下一级还需 482 积分
初级工程师, 积分 2518, 距离下一级还需 482 积分
赞一个!mark
看来大家都比较喜欢& &
初级工程师, 积分 2868, 距离下一级还需 132 积分
初级工程师, 积分 2868, 距离下一级还需 132 积分
初级工程师, 积分 2868, 距离下一级还需 132 积分
初级工程师, 积分 2868, 距离下一级还需 132 积分
版主,那些文件呢? 是不是就把文件名改一下就玩了?我看cmd文件有点区别
版主,那些文件呢? 是不是就把文件名改一下就玩了?我看cmd文件有点区别
controlSUITE里面没有嘛
中级技术员, 积分 175, 距离下一级还需 125 积分
中级技术员, 积分 175, 距离下一级还需 125 积分
中级技术员, 积分 175, 距离下一级还需 125 积分
中级技术员, 积分 175, 距离下一级还需 125 积分
不错,好资料,谢谢了,呵呵
F28XX系列FLASH搬移到RAM里运行实现方法
资深工程师, 积分 12764, 距离下一级还需 7236 积分
资深工程师, 积分 12764, 距离下一级还需 7236 积分
资深工程师, 积分 12764, 距离下一级还需 7236 积分
资深工程师, 积分 12764, 距离下一级还需 7236 积分
这个操作的很简洁的,下载了这个资料。
初级工程师, 积分 2226, 距离下一级还需 774 积分
初级工程师, 积分 2226, 距离下一级还需 774 积分
初级工程师, 积分 2226, 距离下一级还需 774 积分
初级工程师, 积分 2226, 距离下一级还需 774 积分
F28XX系列FLASH搬移到RAM里运行实现方法
资深工程师, 积分 11775, 距离下一级还需 8225 积分
资深工程师, 积分 11775, 距离下一级还需 8225 积分
资深工程师, 积分 11775, 距离下一级还需 8225 积分
资深工程师, 积分 11775, 距离下一级还需 8225 积分
将程序写入RAM中,必须保证不掉电才可以的。
资深工程师, 积分 11775, 距离下一级还需 8225 积分
资深工程师, 积分 11775, 距离下一级还需 8225 积分
资深工程师, 积分 11775, 距离下一级还需 8225 积分
资深工程师, 积分 11775, 距离下一级还需 8225 积分
而写入flash中的程序的掉电后程序也不会丢失的,上电后自动运行的了。
F28XX系列FLASH搬移到RAM里运行实现方法
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
您好,我是DSP学习者,我现在看您的这个将程序从FLASH里搬运到RAM 里挺好的,可是我找不到需要下载的文件,您能告诉我在哪里吗谢谢您
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
实习生, 积分 6, 距离下一级还需 44 积分
您好,我是DSP学习者,我现在看您的这个将程序从FLASH里搬运到RAM 里挺好的,可是我找不到需要下载的文件, ...
您好,我是DSP学习者,我现在看您的这个将程序从FLASH里搬运到RAM 里挺好的,可是我找不到需要下载的文件, ...
工程目录下& &找不到.out吗& &
在debug或release下找找& &
扫描二维码,随时随地手机跟帖
技术领袖奖章
人才类勋章
时间类勋章
坚毅之洋流
发帖类勋章
荣誉元老奖章
等级类勋章
核心会员奖章
等级类勋章
技术导师奖章
人才类勋章
精华达人奖章
等级类勋章
湍急之河流
发帖类勋章
时间类勋章
技术奇才奖章
人才类勋章
欢快之小溪
发帖类勋章
社区建设奖章
等级类勋章
突出贡献奖章
等级类勋章
时间类勋章
技术高手奖章
人才类勋章
时间类勋章
技术新星奖章
人才类勋章
您需要登录后才可以回帖温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
& && && 5)& prepare linux kernel heads& & & & & & && & && make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig&&&&&&&&&&&& 配置内核,记着选arm哦&&&&&&& make ARCH=arm CROSS_COMPILE=arm-linux- & & & & &&&&&&&&&&&&&&&&&&& 随意运行下,就能产生version.h autoconf.h &&&&&& cd&&& linux-2.4.21&&&&&& cp&& -dR include/asm-arm & & $PREFIX/$TARGET/include/asm&&&&&& cp&& -dR include/linux & & & & &&&& $PREFIX/$TARGET/include/linux&&&&& &&&&&& 在$TARGET/PREFIX/目录中建立下面的符号连接:&&&&&&&&&& cd $PREFIX/$TARGET&&&&&&&&&& ln -s include & sys-linux&&&& 相当于configure gcc& --with-heads=&&&&& 在$TARGET_PREFIX/目录中建立下面的符号连接:& & & & && cd& $PREFIX/$TARGET/include/asm&&&&&&&&&& ln&&& -s& arch-s3c2410& arch&&&&& 其实arch 已经建立了 (make了下,建立好了)& & & & && ln& -s& proc-armv proc&&&&&&&& 这个版本没proc这个连接了&&& 6)& build&& glibc&&&&&&&&&&& 搞了半天,原来glibc 2.6.1&&&& 是不支持arm的, 需要打上一系列的补丁&&&&& && & glibc-2.6.1-alpha_ioperm_fix-1.patch&&&&&&&&&&&&glibc-2.6.1-cross_hacks-1.patch&&&&&&&&&&&&glibc-2.6.1-hppa_nptl-1.patch&&&&&&&&&&&&glibc-2.6.1-libgcc_eh-1.patch&&&&&&&&&&&&glibc-2.6.1-localedef_segfault-1.patch&&&&&&&&&&&&glibc-2.6.1-mawk_fix-1.patch&&&&&&&&&&&&glibc-2.6.1-RTLD_SINGLE_THREAD_P-1.patch&&&&&&&&&&&&glibc-2.6.1-sysdep_cancel-1.patch&&& &&&&&&&&&& 推荐补丁下载地址 : http://ftp.osuosl.org/pub/clfs/conglomeration/glibc/& & & & && 推荐文章:& http://blog.chinaunix.net/u/26710/showart_394113.html&&&&&&&& & &&&&&&&& & RTLD_SINGLE_THREAD_P 的fix(上面的patch已经包含了,参考下):& &&&&&&&&&&&&&&&&&&&&&&&&&&&&http://sources.redhat.com/ml/libc-ports/2006-10/msg00070.html &&&&&&&&&& & & & & & & 用 patch -Np1 -i& 猛打把,少了那个都编译不过去 ,详细步骤如下tar xvf glibc-2.6.1.tar.bz2 &cd glibc-2.6.1/&tar xvf ../glibc-ports-2.6.1.tar.bz2 &mv -v glibc-ports-2.6.1 ports&patch -Np1 -i ../glibc-2.6.1-libgcc_eh-1.patch&patch -Np1 -i ../glibc-2.6.1-localedef_segfault-1.patch&patch -Np1 -i ../glibc-2.6.1-cross_hacks-1.patch&patch -Np1 -i ../glibc-2.6.1-RTLD_SINGLE_THREAD_P-1.patch&&&&&&&&&&&& NPTL problem fix: &&&&&&&&&&&& patch for glibc2.4: http://www.devfiles.jlime.com/parted/glibc/nptl-crosscompile.patch &&&&&&&&&&&& The following lines need to be added to config.cache for Glibc to support NPTL:&&&&&&&&&&&&&&&&&&&&echo "libc_cv_forced_unwind=yes" & config.cache&&&&&&&&&&&&&&&&&&& echo "libc_cv_c_cleanup=yes" && config.cache &&&&&&&& 最后使用参数--cache-file=config.cache&&&&&&&&&&&& 还不行,需要把asm-generic copy 到 $PREFIX/$TARGET/include ....&& (为啥经验这么重要呢。。)&&&&&&&&&&&&&
&&&&&&&& $ tar -xvzf glibc-2.2.3.tar.gz&&&&&&&& $ tar -xzvf glibc-linuxthreads-2.2.3.tar.gz --directory=glibc-2.2.3 &&&&&&&& $ cd build-glibc &&&&&&&& $ CC=arm-linux-gcc ../glibc-2.2.3/configure --host=$TARGET& --prefix=/usr \&&&&&&&&&&&&&&&& --with-headers=$PREFIX/$TARGET/include --cache-file=config.cache&&&&&&&&&&&& CC=arm-linux-gcc 把 CC 变量设成你刚编译完的boostrap gcc, 用它来编译你的glibc.&&&&&&&&&&&& --host=$TARGET 告诉该链接库在目标系统上执行, 而非在本地主机.&&&&&&&&&&&& --prefix="/usr" 告诉配置脚本在目标板的根文件系统中glibc的位置.&&&&&&&&&&&& --with-headers 告诉glibc 我们的linux 内核头文件的目录位置.&&&&&&&&&&&& --enable-add-ons 告诉配置脚本使用我们下载的附加包. 已经将glibc-linuxthreads-2.2.3放入了glibc 源码目录中. &&&&&&&&&&&&&&&& 由于我们只添加了一个附加包, 这里--enable-add-ons等价于& --enable-add-ons=linuxthreads. &&&&&&&&&&&&&&&& (如果使用glibc-2.1.x, 需要使用glibc-crypt附加包, 就得使用: --enable-add-ons= linuxthreads, crypt选项). (NPTL 了 )&&&&&&&&&&&
$ make&&&&&& & $ make install_root=$PREFIX/$TARGET& prefix="" install&&&&&&& install_root 指定了安装链接库组件的目录, 将glibc安装到与我们项目相关的目录, 而非/usr目录.如果不指定prefix="", 那么glibc会被安装到$/PREFIX/$TARGET/usr/lib目录中. 指定prefix使glibc被安装到 $TARGET_PREFIX/lib目录.&&&&&&&&& 7.)修改$PREFIX$TARGET/lib目录中的libc.so&&&&$ cd $PREFIX/$TARGET/lib&&&&$ cat libc.solibc.so的内容:/* GNU ld script&& Use the shared library, but some functions are only in&& the static library, so try that secondarily.& */GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a )将/lib/绝对目录去掉, 既将"GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a )"改为: GROUP ( libc.so.6 libc_nonshared.a )8)& completed& GCC& cd build-4.1.2 & ../gcc-4.1.2/configure --target=arm-linux& --prefix=/cross/cross-arm& --enable-languages=c& make& make install (出鬼的顺利,不支持c++,gcc 相关补丁也没有打, 凑合先用吧)9)& simple checkarm-linux-gcc --print-libgcc-file-namearm-linux-gcc -print-search-dirsarm-linux-gcc -o test test.carm-linux-objdump -D test10 build kernel for arm&&& 为了配置方便,copy 一个default config 到linux2.6.24.4 的根目录. 然后就剪辑吧能去的都去掉.嘿嘿.&&&& &&& cp arch/arm/configs/s3c2410_defconfig& .&&& mv s3c2410_defconfig .config&&& &&& menuconfig:&&& make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig& &&& zImage 出来了, download 到s32440 看看吧.& 任意键进入boot menu. 选2 downfrom uart,用DNW下载代码,完成 选4,写入nand flash. (不同系统不一样,看monitor 咋写了)&& 选boot os............. 操蛋,啥都没看到,&& 只是在串口上看到monitor输出如下: Set boot params = root=/dev/ram init=/linuxrc initrd=0xx console=ttyS1,115200 mem=65536K devfs=mount Load Kernel...Load Ramdisk...&& 遇到的问题请继续看下一节...11 调整解压缩参数&&& &&& 到底啥是最重要的啊, 如果连个printf都不能用,运气未免太差. 参数中的ttyS1 (第10节的输出),俺没有注意到(么经验啊). 于是上ADS 的AXD调试:&&&&先 连接上目标板,然后选run, 这样就可以reboot 系统,选5, boot os, 然后用ADX stop,就会看到一段汇编了. 仔细查看发现arm 确实在运行一段程序,经过查询system.map,发现是panic( 我猜想是root fs没有...,但是没有显示内容到我的串口啊,串口接在uart1上). && & && 随意看看那个2440 mon程序, linux的加载方式如下:&&& 将zImage从nand flash copy到 0x 然后就jump过去. 内核参数放在0x.&&& goto_start = 0x;&&& (*goto_start)(0, 193);&&& && 不过对为啥不能启动还是没有线索啊...&& 有几个比较可疑的内核配置选项可能引起问题比如&&&&&&&& boot option-&& & &&&&&&& compressed rom boot loader base address&&&&& #&a&&&&&&&&&&&& default kernel command string&&&&&&&&&&&&&&&&&&&&& #&b&&& 所以俺又试了几个选项, 把 #&a& 的地址改成0x...... 不幸还是不可以, 因为没有信息出现也不知道运行到了哪里,不过根据调试的结果,应该是过了解压缩阶段的.... && 事后俺查上面两个选项的含义( 就是按 ? 了), #&a& 是说ROM able 的zImage, 就是zImage直接在rom中运行时, 才有效所以犯了错误啊. &b& 也不行, 因为如果没有办法传递kernel 的command line时才有效, 而s32440下无效. 帮助里列举有几个平台需要这个选项.& 先把参数地址为啥在0x 和runaddr为啥在0x跳过不谈,为啥没有任何信息? 连解压内核的信息都没有? 看了几遍config, 找到了如下的选项:&&& system type-&& & & && [0] S3C UART to use for low-level messages&&&& &&& 嘿嘿,进去把0改成1, 看看arm的相关启动代码,印证了通过这个选项选择内核解压缩信息的输出端口. 选成1, 再试,果然有内核解压缩信息打印出来,呵呵. 相关代码在内核的位置:decompress_kernel& -& &&& putstr("Uncompressing Linux...");&&& gunzip();&&& putstr(" done, booting the kernel.\n"); -& include/asm-arm/plat-s3c static void putc(int ch){&&& if (uart_rd(S3C2410_UFCON) & S3C2410_UFCON_FIFOMODE) {&&& .....}uart_rd(unsigned int reg){&&& volatile unsigned int *&&& ptr = (volatile unsigned int *)(reg + uart_base);&&& return *}#define uart_base S3C24XX_PA_UART + (0x4000*CONFIG_S3C_LOWLEVEL_UART_PORT)12. 内核控制台&& 就是命令行里的console参数. 这里不打算讨论console到底是啥, 仅指出,俺没有看到内核正常的启动信息和这个选项大大的相关.我们分析下monitor给出的信息:Set boot params = root=/dev/ram init=/linuxrc initrd=0xx console=ttyS1,115200 mem=65536K devfs=mount Load Kernel...Load Ramdisk...& && 这里console设置成了 ttyS1, 而linux2.6.24.4 要求(不知道具体从啥时候开始,2.6?) 名字是ttySAC1,指定串口1. 看monitor的代码就能知道了, monitor需要升级的.& ...走了冤枉路了,明白了monitor和内核这里的一点纠缠.&& 升级monitor之后... 嘿嘿,终于有东西了...呵呵Uncompressing Linux...................................................... done, booting the kernel.Linux version 2.6.24.4 (root@localhost.localdomain) (gcc version 4.1.2) #7 Tue Apr 15 07:50:25 CST 2008CPU: ARM920T [] revision 0 (ARMv4T), cr=c0007177Machine: SMDK2410ATAG_INITRD please update your bootloader.Memory policy: ECC disabled, Data cache writebackCPU S3C2440A (id 0x)S3C244X: core 400.000 MHz, memory 100.000 MHz, peripheral 50.000 MHzS3C24XX Clocks, (c) 2004 Simtec ElectronicsCLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL onCPU0: D VIVT write-back cacheCPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 setsCPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 setsBuilt 1 zonelists in Zone order, mobility grouping on.& Total pages: 16256Kernel command line: root=/dev/ram init=/linuxrc initrd=0xx console=ttySAC1,115200 mem=65536K devfs=mount irq: clearing pending ext status 000dff00irq: clearing pending ext status irq: clearing subpending status 000000bairq: clearing subpending status PID hash table entries: 256 (order: 8, 1024 bytes)timer tcon=, tcnt a2c1, tcfg 00000, usec 00001eb8Console: colour dummy device 80x30console [ttySAC1] enabledDentry cache hash table entries: 8192 (order: 3, 32768 bytes)Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)Memory: 64MB = 64MB totalMemory: 63128KB available (1428K code, 223K data, 92K init)Mount-cache hash table entries: 512CPU: Testing write buffer coherency: okS3C2440: Initialising architectureS3C2440: IRQ SupportS3C2440: Clock Support, DVS offS3C24XX DMA Driver, (c) 06 Simtec ElectronicsDMA channel 0 at c4800000, irq 33DMA channel 1 at c4800040, irq 34DMA channel 2 at c4800080, irq 35DMA channel 3 at c48000c0, irq 36JFFS2 version 2.2. (NAND) 漏
Red Hat, Inc.io scheduler noop registeredio scheduler anticipatory registered (default)io scheduler deadline registeredio scheduler cfq registeredSerial:
driver $Revision: 1.90 $ 4 ports, IRQ sharing enableds3c2440-uart.0: s3c2410_serial0 at MMIO 0x (irq = 70) is a S3C2440s3c2440-uart.1: s3c2410_serial1 at MMIO 0x (irq = 73) is a S3C2440s3c2440-uart.2: s3c2410_serial2 at MMIO 0x (irq = 76) is a S3C2440RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksizeloop: module loadedS3C24XX NAND Driver, (c) 2004 Simtec Electronicss3c2440-nand s3c2440-nand: Tacls=3, 30ns Twrph0=7 70ns, Twrph1=3 30nsNAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bit)Scanning device for bad blocksCreating 8 MTD partitions on "NAND 64MiB 3,3V 8-bit":0xx : "Boot Agent"0xx : "S3C2410 flash partition 1"0xx : "S3C2410 flash partition 2"0xx00a00000 : "S3C2410 flash partition 3"0x00ae00000 : "S3C2410 flash partition 4"0x00e00000 : "S3C2410 flash partition 5"0xx : "S3C2410 flash partition 6"0xx : "S3C2410 flash partition 7"mice: PS/2 mouse device common for all miceS3C24XX RTC, (c)
Simtec Electronicss3c2440-i2c s3c2440-i2c: slave address 0x10s3c2440-i2c s3c2440-i2c: bus frequency set to 390 KHzs3c2440-i2c s3c2440-i2c: i2c-0: S3C I2C adapterS3C2410 Watchdog Timer, (c) 2004 Simtec Electronicss3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq enableddrivers/rtc/hctosys.c: unable to open rtc device (rtc0)List of all partitions:1f00&&&&&&&& 16 mtdblock0 (driver?)1f01&&&&&& 2048 mtdblock1 (driver?)1f02&&&&&& 4096 mtdblock2 (driver?)1f03&&&&&& 2048 mtdblock3 (driver?)1f04&&&&&& 4096 mtdblock4 (driver?)1f05&&&&& 10240 mtdblock5 (driver?)1f06&&&&& 24576 mtdblock6 (driver?)1f07&&&&& 16384 mtdblock7 (driver?)No filesystem could mount root, tried:& cramfs romfsKernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)13. 内核参数的传递方式& & 前边说过monitor吧内核参数放到了地址 0x 这个地址. 这个道理何在呢. 先看内核打印内核命令行的地方: init/main.casmlinkage void __init start_kernel(void)&&&& --&printk(KERN_NOTICE "Kernel command line: %s\n", boot_command_line);&&&& 是个全局变量,搜索下,在arch/arm/kernel/setup.c:void __init setup_arch(char **cmdline_p){&&& char *from = default_command_line; /*.config 中指定的命令行*/&&& ...&&& mdesc = setup_machine(machine_arch_type);& /*从上面串口输出知道是 "Machine: SMDK2410", 由.config决定*/&&&&&&&&&&&&&&& /*里边引用的lookup_machine_type 在arch/arm/kernel/head_common.S*/......&&& if (__atags_pointer)&&& && &tags = phys_to_virt(__atags_pointer);&&& else if (mdesc-&boot_params)&&& && &tags = phys_to_virt(mdesc-&boot_params); && ...&&&& /*&&& &* If we have the old style parameters, convert them to&&& &* a tag list.&&& &*/&&& if (tags-&hdr.tag != ATAG_CORE)&&& && &convert_to_tag_list(tags); /*把boot loader传递的参数, arch/arm/kernel/compat.c struct param_struct { &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ..} 转换成tag list, 其中包括 ATAG_CMDLINE */&&& if (tags-&hdr.tag != ATAG_CORE)&&& && &tags = (struct tag *)&init_&&& if (mdesc-&fixup) /*s3c2410 是NULL*/&&& && &mdesc-&fixup(mdesc, tags, &from, &meminfo);&&& if (tags-&hdr.tag == ATAG_CORE) {&&& && &if (meminfo.nr_banks != 0)&&& && &&& &squash_mem_tags(tags);&&& && &parse_tags(tags); /*ATAG_CMDLINE 的parser 把相应命令行copy 到default_command_line, 也在这个文件内*/ &&& }&&& ....&&& memcpy(boot_command_line, from, COMMAND_LINE_SIZE);&&& boot_command_line[COMMAND_LINE_SIZE-1] = '\0';&&& parse_cmdline(cmdline_p, from);}这里先忽略下mdesc是怎么被找到的,先直接搜索 mdesc的类型,可以找到 #define MACHINE_START(_type,_name) 这个宏,然后console的"SMDK2410"这个宏定义, 可以在arch/arm/mach-s3c2410下找到:MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switch&&& &&& &&& &&& &&& * to SMDK2410 */&&& /* Maintainer: Jonas Dietsche */&&& .phys_io&&& = S3C2410_PA_UART,&&& .io_pg_offst&&& = (((u32)S3C24XX_VA_UART) && 18) & 0xfffc,&&& .boot_params&&& = S3C2410_SDRAM_PA + 0x100,&&& .map_io&&& &&& = smdk2410_map_io,&&& .init_irq&&& = s3c24xx_init_irq,&&& .init_machine&&& = smdk2410_init,&&& .timer&&& &&& = &s3c24xx_timer,MACHINE_END#define S3C2410_SDRAM_PA&&& (S3C2410_CS6)#define S3C2410_CS6 (0x)这下子就知道内核参数传递的方式了: (arm)&& 把 arch/arm/kernel/compat.c 中定义的struct param_struct { } 放到0x 处即可.... 至于去求证 monitor 的 runAddr 和参数地址, 请看 :& (这个是monitor用到的参数,决定了runAddrs)BootParams boot_params = {&&& {"bootpara", 1},&&& //0=boot without parameters,1=boot with parameters&&& {"cpuclk",&& 2},&&& //0=200M, 1=300M, 2=400M, 3=440M&&& {"rundelay", 0},&&& //0 seconds&&& {"serial",&& 1},&&& //0=serial port 0, 1=serial port 1&&& {"baudrate", 115200},&&& {"machine",& 193},&&& {"runAddr",& 0x},&&& {"rootfs",&& 0},&&& {"tty",&&&&& 1},&&& {"initrdA",& 0},&&& {"initrdL",& 0},&&& {"memsize",& 0x},&&& {"devfs",&&& 1},&&& {"ostore",&& 0},&&& //0=nand, 1=nor&&& {"userpara", sizeof(DEFAULT_USER_PARAMS)},&&& DEFAULT_USER_PARAMS};从这个参数加载linux的代码在nand.c LoadRun .14. 内核加载地址和start参数问题&& 从上面的分析, 知道内核被加载到0x处, 这个其实是zImage的加载地址, 就是说内核解压缩程序的运行地址. 还有一个问题,我们的内核一直是little endian 的. arm-linux-objdump下就知道. && 一个问题是Big-endian的内核如何run, 另一个是解压缩程序的运行地址是随意的吗?& 从monitor看, 这个环境一直在little endian运行... (big endian 实验也另作研究吧)& 能否加载到任意合理地址(至少有ram吧,呵呵), 试验一下即可. 结果证明是可以的, 当然应该行,因为zImage已经支持PIC代码,并且可以配置成在纯ROM环境下运行(那就得烧到到固定地址了).& 研究下zImage都包含什么东西,这个先从arch/arm/boot/Makefile看看吧:$(obj)/compressed/vmlinux: $(obj)/Image FORCE&&& $(Q)$(MAKE) $(build)=$(obj)/compressed $@$(obj)/zImage:&&& $(obj)/compressed/vmlinux FORCE& #zImage 包含解压缩头的Image&&& $(call if_changed,objcopy)&&& @echo '& Kernel: $@ is ready'.......$(obj)/uImage:&&& $(obj)/zImage FORCE&&&&& # U-boot image&&& $(call if_changed,uimage)&&& @echo '& Image $@ is ready'$(obj)/bootp/bootp: $(obj)/zImage initrd FORCE& 包含bootp目录的image bootpImage, 如要initrd,这个平台不支持,所以加载&&& & & $(Q)$(MAKE) $(build)=$(obj)/bootp $@&&&&&&&&&&&RamDisk 是monitor的事情了&&& @:$(obj)/bootpImage: $(obj)/bootp/bootp FORCE&& #包含bootp目录的image bootpImage&&& $(call if_changed,objcopy)&&& @echo '& Kernel: $@ is ready'& 内核解压缩和PIC (position independent code)arch/arm/boot/compressed/Makefile## We now have a PIC decompressor implementation.& Decompressors running# from RAM should not define ZTEXTADDR.& Decompressors running directly# from ROM or Flash must define ZTEXTADDR (preferably via the config)# FIXME: Previous assignment to ztextaddr-y is lost here. See SHARKifeq ($(CONFIG_ZBOOT_ROM),y)& #从boot ROM运行时需要配置一个固定地址,还有BSS的地址ZTEXTADDR&&& := $(CONFIG_ZBOOT_ROM_TEXT)ZBSSADDR&&& := $(CONFIG_ZBOOT_ROM_BSS)elseZTEXTADDR&&& := 0&&&&&&&&&&& #一般情况下,就是0, 是pic代码加上'手工'重定位,加载到任意地址ZBSSADDR&&& := ALIGN(4)endifSEDFLAGS&&& = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/&& #把vmlinux.lds.in 中TEXT_START换成配置的地址(主要针对ZBOOT_ROM)targets&&&&&& := vmlinux vmlinux.lds piggy.gz piggy.o font.o font.c \&&& &&& &head.o misc.o $(OBJS)EXTRA_CFLAGS& := -fpic -fno-builtinEXTRA_AFLAGS& :=.............# Don't allow any static data in misc.o, which# would otherwise mess up our GOT tableCFLAGS_misc.o := -Dstatic=$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o \&&& &&&& $(addprefix $(obj)/, $(OBJS)) FORCE&&& $(call if_changed,ld)&&& @:$(obj)/piggy.gz: $(obj)/../Image FORCE& #piggy.gz 是压缩后的内核,见piggy.S&&& $(call if_changed,gzip)$(obj)/piggy.o:& $(obj)/piggy.gz FORCECFLAGS_font.o := -Dstatic=$(obj)/font.c: $(FONTC)&&& $(call cmd,shipped)$(obj)/vmlinux.lds: $(obj)/vmlinux.lds.in arch/arm/boot/Makefile .config&&& @sed "$(SEDFLAGS)" & $& & $@$(obj)/misc.o: $(obj)/misc.c include/asm/arch/uncompress.h lib/inflate.c解压缩的pic技术以后再研究吧,挺多的.这里就是增强下信心吧.& 知道可以加载到任意地址,呵呵. 下面看看decompress的入口函数start的参数问题:arch/arm/boot/compressed/head.S/*&* sort out different calling conventions&*/&&& &&& .alignstart:&&& &&& .type&&& start,#function&&& &&& .rept&&& 8&&& &&& mov&&& r0, r0&&& &&& .endr&&& &&& b&&& 1f&&& &&& .word&&& 0x016f2818&&& &&& @ Magic numbers to help the loader&&& &&& .word&&& start&&& &&& &&& @ absolute load/run zImage address&&& &&& .word&&& _edata&&& &&& &&& @ zImage end address1:&&& &&& mov&&& r7, r1&&& &&& &&& @ save architecture ID&&& &&& mov&&& r8, r2&&& &&& &&& @ save atags pointer从这里看出, r1 存放的是architectureID, r2存放 atags 指针. 寄存器传递参数, 加上没有用的r0, 应该是这样一个函数:void&& start(0, archID, *atags)其实,在arch/arm/kernel/head.S中有关于参数的一段详细的注释,看看就明白了:/*&* Kernel startup entry point.&* ---------------------------&*&* This is normally called from the decompressor code.& The requirements&* are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0,&* r1 = machine nr, r2 = atags pointer.&*&* This code is mostly position independent, so if you link the kernel at&* 0xc0008000, you call this at __pa(0xc0008000).&*&* See linux/arch/arm/tools/mach-types for the complete list of machine&* numbers for r1.&*&* We're trying to ke DO NOT add any machine specific&* crap here - that's what the boot loader (or in extreme, well justified&* circumstances, zImage) is for.&*/找到mach-type是:s3c2440&&& &&& &&& ARCH_S3C2440&&& &&& S3C2440&&& &&& &&& 362不过通过实验, 我们的机器看来是SMDK兼容了,machine 参数必须传递193: SMDK2410 这个才行,而cpu类型则是自动侦测的,呵呵.对应kernel的参数和decompressed一样:void (*theKernel)(int zero, int arch, uint params);另:试了试big endian,发现现在linux kernel对s3c的系统还不支持big模式.make config也无此选项. 15. initrd : initial ram disk load process&&&& 让我们从新审视所得到的内核console的输出(见上文),看看需要做的东西, 先来关注最后几行的输出信息,内核相关代码是:start_kernel-&rest_init-&kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);-&static int __init kernel_init(void * unused){..........&&& /*&&& &* check if there is an early userspace init.& If yes, let it do all&&& &* the work&&& &*/&&& if (!ramdisk_execute_command)& /*由内核命令行参数 rdinit= 来控制,我们没有指定 (搜索就知道是rdinit=来控制了...)*/&&& &&& ramdisk_execute_command = "/init";&&& if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {&&& &&& ramdisk_execute_command = NULL;&&& &&& prepare_namespace();&&& }&.........}内核中有各种__setup宏定义的内核参数, 其前面的字符串是内核命令行, 其后的函数是这个命令行的处理函数,相关的宏定义在init.h中.grep下,很快有结果. 详细讨论先放一放.
void __init prepare_namespace(void){.............&&& if (saved_root_name[0]) {&&& &&& root_device_name = saved_root_name; /*这个就是由 root=/dev/ram传递的内核参数,稍作搜索即知*/&&& &&& if (!strncmp(root_device_name, "mtd", 3)) { /*我们当然不是这个*/&&& &&& & .............&&& &&& }&&& &&& ROOT_DEV = name_to_dev_t(root_device_name); /*/dev/ram 解析出来的设备是 ROOT_DEV= root_RAM0(1,0)*/&&& &&& if (strncmp(root_device_name, "/dev/", 5) == 0)&&& &&& &&& root_device_name += 5; /* root_dev_name = "ram" */&&& }&&& if (initrd_load()) /*& CONFIG_BLK_DEV_INITRD 之后才能使用initrd,我们的.config是有的*/&&& &&&&&& ......&&& mount_root();out:& & sys_mount(".", "/", NULL, MS_MOVE, NULL);& /*& /root 如何成为根, 何以叫mount root,原来并不是加载 "/" */&&& sys_chroot(".");&&& security_sb_post_mountroot();}int __init initrd_load(void){&&& if (mount_initrd) { /*只有配置了内核命令行: noinitrd才为0, 我们当然没有'自杀'了*/&&& &&& create_dev("/dev/ram", Root_RAM0);& /*创建设备先...*/&&& &&& /*&&& &&& &* Load the initrd data into /dev/ram0. Execute it as initrd&&& &&& &* unless /dev/ram0 is supposed to be our actual root device,&&& &&& &* in that case the ram disk is just set up here, and gets&&& &&& &* mounted in the normal path.&&& &&& &*/&&& &&& if (rd_load_image("/initrd.image") && ROOT_DEV != Root_RAM0) { /*下面看看/initrd.image啥时候创建的*/&&& &&& &&& sys_unlink("/initrd.image");&&& &&& &&& handle_initrd();&&& &&& &&& return 1;&&& &&& }&&& }&&& sys_unlink("/initrd.image");&&& return 0;}从我们配置的参数是Root_RAM0, 最后 void __init prepare_namespace(void)会调用mount_root:void __init mount_root(void){#ifdef CONFIG_ROOT_NFS&...#endif#ifdef CONFIG_BLK_DEV_FD&& ....#endif#ifdef CONFIG_BLOCK&&& create_dev("/dev/root", ROOT_DEV);&&& mount_block_root("/dev/root", root_mountflags); /*有默认值 MS_RDONLY | MS_SILENT*/#endif}void __init mount_block_root(char *name, int flags){&&& get_fs_names(fs_names); /*所有已经安装的文件系统的名字列表*/retry:&&& for (p = fs_ *p; p += strlen(p)+1) { /*p代表fs type, 这里name 是/dev/root,就是Root_RAM0*/&&& &&& int err = do_mount_root(name, p, flags, root_mount_data); /*(dev,type,mntflags,(rootflags=,给具体文件系统的参数) )*/&&& &&& .......&&&&&&& /*如果失败了,下面的信息倒是没有显示出来....*/&&& &&& printk("VFS: Cannot open root device \"%s\" or %s\n",&&& &&& &&& &&& root_device_name, b);&&& &&& printk("Please append a correct \"root=\" here are the available partitions:\n");&&& &&& printk_all_partitions();&&& &&& panic("VFS: Unable to mount root fs on %s", b);&&& }&&& printk("List of all partitions:\n");&&& printk_all_partitions();&&& printk("No filesystem could mount root, tried: "); /*列出曾经尝试的文件系统类型*/&&& for (p = fs_ *p; p += strlen(p)+1)&&& &&& printk(" %s", p);&&& printk("\n");.......&&& panic("VFS: Unable to mount root fs on %s", b); /*知名panic*/...}好了上面的函数就是知名的panic. 这个过程就是将文件/initrd.image 拷贝到Root_RAM0设备内, 然后创建设备文件/dev/root(这个个文件就是为了fs的接口函数准备的),然后将 /dev/root 安装到/root, 最后升级/root到文件系统根目录 '/'.遇 到这个panic从代码上看,是do_mount_root在尝试用各种文件系统来解析/dev/root后竭尽失败.无奈之下,panic的.原因可就 多了,比如config的时候没有选上ramdisk支持(设备层), 或者ramdisk中的文件系统内核不支持(文件系统层), 再或者initrd的加载出了问题(无论是boot loader 还是内核创建"/initrd.image", 最后参数传递错误也不成. 经过仔细检查,内核配置和参数传递应该没有啥问题. 这里好多内核的信息没有打印出来,详细的错误也就被隐蔽了. & 为了验证ramdisk是否正确加载, 在rd_load_image("/initrd.image") 里面加了不少调试信息,结果发现, 根本没有/initrd.image这个文件,在这个函数打开这个文件的时候出错了, 这证明这个文件创建失败了. 原因也很多,不过还是先扫一眼这个文件在什么地方创建.一搜,在这个函数里呢:static int __init populate_rootfs(void) 这是一个init函数,内核悄悄的运行了他.... (运行的地方好找,不提).static int __init populate_rootfs(void){&...& /*解压缩先略过不看...*/&&& if (initrd_start) { /*这个就是内核命令行传递进来的值...., 汗...monitor里这个值是0, 显然是不对的啊*/&&&&&&& /* ...创建 initrd.image 这个文件*/&&& && &fd = sys_open("/initrd.image", O_WRONLY|O_CREAT, 0700);&&& & .......}好了一个问题出来了, 改吧, 去monitor的参数里修改一番,也犯了不少错误: 1) 第一个就是initrd的初始地址不能为0..., 2) 再有就是有个地方出错比如我设置initrd初始地址0x1000(随意值), 大小是0x1000(随意值,不设置长度monitor不加载ramdisk,只对此monitor有效). 这个地址有傻问题? 看看输出: Memory policy: ECC disabled, Data cache writebackinitrd (0x - 0x) extends beyond physical memory - disabling initrdCPU S3C2440A (id 0x)这里又跳出个地方和initrd有关, 位置在bootmem初始化中:(ft...)arch/arm/mm/init.cstatic int __init check_initrd(struct meminfo *mi){.......&&& if (phys_initrd_size) {/*最初传递的initrd start 和size都是0, 我ft.... */&&& &&&& for (i = 0; i & mi-&nr_ i++) {&&&&&&&&&&&&&...........&&& &&&& }&&& if (initrd_node == -1) {&&& &&& printk(KERN_ERR "initrd (0x%08lx - 0x%08lx) extends beyond "&&& &&& &&&&&& "physical memory - disabling initrd\n",&&& &&& &&&&&& phys_initrd_start, end);&&& &&& phys_initrd_start = phys_initrd_size = 0;&&& }..........}没 有仔细探究这个bank是个什么意思(估计就是2440cpu里对内存bank的划分吧),但是这个警告信息提醒了我.超出物理内存? 不一定是地址太大,呵呵,因为啊, ram物理地址并不是从0开始的,启动的时候是2440 自己吧nand读到了地址0开始的一段内部ram中.....所以,吧initrdstart地址和size设置成一个在RAM地址范围内的一段地址里. 重启,这下,果然不同了........&&&& 出现的信息还是不能加载root文件系统,但是initrd加载成功了, 即ramdisk已经包含了initrd.image, "/initrd.image"文件也已经创建成功了. 但是出现RAMDISK: image too big! (2078xx/4096) ,相关函数是int __init rd_load_image(char *from) /*从/initrd.image 写入/dev/ram设备*/{......&&&& /*nblocks是从ramdisk image中根据文件系统magic猜测的block数(identify_ramdisk_image),&&&&& *rd_blocks是从/dev/ram设备中读出的数值,ramdisk大小是4096K size ,1024 blocksize,可以配置&&&&& */&&& if (nblocks & rd_blocks) { /*这个信息是发现加载的initrd image大小大于ram disk的大小,加载失败*/&&& &&& printk("RAMDISK: image too big! (%dKiB/%ldKiB)\n",&&& &&& &&&&&& nblocks, rd_blocks);&&& &&&&&& }.... }另外,建议调试阶段把kernel consolelog 设置成verbose,就是在setup_arch的最前端,调用下面函数:&&& console_verbose();这样一些提示性和continue性质的信息能够显示出来方便调试. & 这个原因是什么? 根据调试信息打印出来信息, identify_ramdisk_image:RAMDISK: cramfs filesystem found at block 0显然是发现了一个cramfs,但是不知到是什么原因. 呵呵,秘密是我还没有烧一个initrd进去呢,用的是现有的, 其大小和格式都是未知的.这样当然累了,要知道原因就太难(?), 所以要自己制作一个....16. 制作ramfs为了测试,仅制作文件系统..步骤如下:
RDSIZE=1024
BLKSIZE=1024# 为了测试,越小越好,创建一个1M 的ram disk,这样下载快(现在我只有串口)dd if=/dev/zero of=ramdisk.img bs=$BLKSIZE count=$RDSIZE#在其上制作ext2文件系统/sbin/mke2fs -F -m 0 -b $BLKSIZE ramdisk.img $RDSIZE
强制运行,不管是否是块设备/或者已经安装-m 0
设置预留块数量的百分比, 我们可不能浪费,所以一个都不保留....呵呵.-b 1024
一个block 1k下载,运行,呵呵又出错了:try load ram disk /*这是自己加的调试信息*/RAMDISK: ext2 filesystem found at block 0
/*我们制作的是ext2文件系统,这里也认出了*/RAMDISK: Loading 4000KiB [1 disk] into ram disk... done. /*这里看出initrd真是加载成功了,到了ramdisk0中*/load image ret 1
/*这是自己加的调试信息, mount失败*/
原因很明显,我们根本没有编译ext2文件系统支持, 重新配置编译,运行.呵呵根文件系统安装真的成功了.不过,问题还没有完:VFS: Mounted root (ext2 filesystem).Freeing init memory: 92KWarning: unable to open an initial console.Failed to execute /linuxrc.
Attempting defaults...Kernel panic - not syncing: No init found.
Try passing init= option to kernel.这个嘛,嘿嘿,我们的文件系统上啥都没有, 得搞个什么东西上去才行啊. 16.1 initrd "hello world"
也试了直接编译busybox,可是看起来busybox启动了,但是没有任何输出.查busybox的说明,busybox建议最好自己用cross toolchain搞个hello world试试,看看你能不能运行,不行的话就别搞busybox了,肯定不行啦.
故而,写hello world一个(好久不hello world了):
arm-linux-gcc -static -o test test.c
arm-linux-objcopy -S test test_strip
[这个去掉大部分没有用的段,大大减小bin的大小]
然后用arm-linux-readelf -A test 看看. (aeabi)
在rootfs上(ramdisk.img)建立/dev和必要的设备文件:
mount -t ext2 ramdisk.img /mnt/initrd -o loop&& mkdir dev
cp -a /dev/null dev
cp -a /dev/console dev
cp /cross/src/linux2.6.24.4/test_strip linuxrc
[我们的hello world就是linuxrc,呵呵]&
umount /mnt/initrd
gzip -9 ramdisk.img
下载, 启动.... 没有看到我熟悉的hello worldVFS: Mounted root (ext2 filesystem).Freeing init memory: 92Kselected clock c01adf24 (pclk) quot 26, calc 115740
google下,发现自己几乎犯过了所有的毛病,先是内核并不支持eabi串口无输出,就编译成支持eabi的内核,结果一样不幸.再google,发现float point emulation必须选一,我没选,选上重来. 最终float point终于解决了这个问题.内核中只能使用浮点模拟,运行大部分的 binaries 都需要浮点支持.
最后hello world终于搞定了. (经测试,没有eabi支持的内核照样可以hello world,以后再研究吧]VFS: Mounted root (ext2 filesystem).Freeing init memory: 92Kselected clock c01adf24 (pclk) quot 26, calc 115740hello world
[这就是我们期待的输出...]
阅读(3558)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_085071',
blogTitle:'rootfs 加载
initrd 根文件系统 mount',
blogAbstract:'ARM 920T Samsung2440 从cross-tools到 linux2.6.24.41. 为vmware 添加新的硬盘&&&&& fdisk & & & & & & & & & & & & & & & 用法就算了&&&&& mkfs&-t&ext3&-c&/dev/sdb1& (我看就不用 -c 参数了吧, check bad block 就不用了, 俺的E4500真快阿,郁闷为啥叫sdx了呢)&&&&& df&&&&&&&&&&&&&&&&&&&&&&&&&&&',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:9,
publishTime:0,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'bbm\r\n\r\n',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 修改rootfs 闪退 的文章

 

随机推荐