Linux内核,文件系统移植过程中出现的一些问题与解决办法

1.bootm地址和load address一样
此种情况下,bootm不会对uImage header后的zImage进行memory move的动作,而会直接go到entry point开始执行。因此此时的entry point必须设置为load address + 0x40。如果kernel boot过程没有到uncompressing the kernel,就可能是这里设置不对。
boom address == load address == entry point - 0x40
2. bootm地址和load address不一样(但需要避免出现memory move时出现覆盖导致zImage被破坏的情况)
此种情况下,bootm会把uImage header后的zImage move到load address(见上方代码),然后go到entry point开始执行。 由此知道此时的load address必须等于entry point。
boom address != load address == entry point
这里是第一种情况,
我重启后Load Address:30008000 Entry Point:30008000
很有可能是Load Address: 30008000和Entry Point: 30008000一样导致的。
解决办法:重新编译内核
make zImage;
mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n "linux-2.6.36" -d ./arch/arm/boot/zImage uImage
mkimage给zImage添加一个信息头header,生成uImage
编译内核时候出现如下错误:
make: *** [.tmp_vmlinux1] Error 1
解决方法:修改arch/arm/kernel/vmlinux.lds
[root@localhost linux-2.6.14]$ vi arch/arm/kernel/vmlinux.lds
将文件尾2条的ASSERT注释掉
/* ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support") */
/* ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined") */
然后重新make即可

发现还是不行,哎,该怎么办呢,又要折腾了!!!
无奈,只好自己动手制作内核和根文件系统了.
于是查找了相关资料
内核-编译器-busybox个版本之间的关系
前言:本文主要记录用各个版本的编译器编译出来代码运行结果。
1. (zImage)
Busybox-1.3.2: arm-linux-gcc-3.3.2
Linux-2.6.26.3:arm-linux-gcc-3.4.1
编译结果:正常通过。
运行结果:看到控制台
2. (zImage2)
Busybox-1.3.2: arm-linux-gcc-3.3.2
Linux-2.6.30: arm-linux-gcc-3.4.1
编译结果:正常通过。
运行结果:看到控制台
3.
Busybox-1.3.2: arm-linux-gcc-3.4.1
Linux-2.6.30: arm-linux-gcc-3.4.1
编译结果:Busybox-1.3.2编译不通过
运行结果:XXX
4. (zImage3)
Busybox-1.3.2: arm-linux-gcc-3.3.2
Linux-2.6.30: arm-linux-gcc-4.3.2 行改为
行改为
种情况的分析对内核和文件系统是否支持eabi的搭配做如下总结:
|
内核 (1:支持eabi,0:不支持eabi) |
文件系统 (1:支持eabi,0:不支持eabi) |
结果(1:可以运行,0:不可运行) |
|
0 |
0 |
1 |
|
0 |
1 |
0 |
|
1 |
0 |
1 |
|
1 |
1 |
1 |
我用的工具是这些:arm-none-gnueabi-linux-gcc4.3.2
busybox-1.15.2
mkyaffs2image
在busybox-1.15.2下make的时候出现这个错误:

这是少了静态链接库文件crypt.a和libm.a这两个文件,这两个文件存在于你用来编译这个busybox的编译器中。
但是困扰我的是这个问题究竟怎么解决呢,这两个文件加到哪里去呢,既然是编译的时候出错,说缺少了静态链接库文件,可是这两个文件不是存在于编译器中的吗?怎么会出现这个错误呢?
于是又开始了思考。
编译busybox,动态链接与静态链接的选择
进入解压后的Busybox-1.10.1目录,运行make menuconfig或make gconfig进行配置。
在进行配置时有几项需要注意:
Build Options->
Build BusyBox as a static binary (no shared libs)
Force NOMMU build
Build shared libbusybox
Build with Large File Support (for accessing file>2GB)
如果选择Build BusyBox as a static binary (no shared libs)方式进行编译时,所需的库已经与程序静态地链接在一起,这些程序不需要额外的库就可以单独运行,但是自己编写的程序在文件系统上运行必须采用静态编译,否则会报诸如:bin/sh: hello :not found的错误。
静态编译如:
arm-linux-gcc –static hello.c –o hello
如果选择Build shared libbusybox方式进行编译时,要将交叉编译的动态库或符号链接复制到对应的目录中,否则程序不能运行。同时在配置时应去掉Build shared libbusybox目录下的两项:如下
Build shared libbusybox->
Producebinary for each applet,linked against libbusybox
Produceadditional busybox binary linked against libbusybox
同时去掉
Build with Large File Support (for accessing file>2GB)
否则编译会报错。
一定要勾选上如下配置:
Init Utilities—>
(*) init
(*) Supporting reading an inittab file//支技init进程读取/etc/inittab配置文件。
(*) Supporting running commands with controlling-tty//使busybox在真实的串口设备中运行命令行,不使用可能会报类似与:sh:can’t access tty:job control turned off的错误。
其它基本可按默认配置。
5. 执行
make
编译完成后执行
make install
则在Busybox-1.10.1目录下有_install这个目录,这正是我们想要的。如果正确的话,会生成usr,bin,sbin,linrc这几个文件。
注意:如果你选择的是动态链接,那么在你的nfs下的文件系统目录下的lib目录下应当要有glibc中的动态链接库文件,没有的话,需要复制过去。
最好选择静态链接,其他方式的话有时候会出现意想不到的错误呢
把_install这个目录下的内容拷贝到你的nfs下的文件系统目录下,此外还需
cd ../nfs/文件系统目录/
mkdir dev etc mnt proc root sys tmp
cd dev/
mknod console mtdblock0 mtdblock1 mtdblock2 null ttySAC0 //其实这一步你也可以没有,因为mdev会自动创建设备节点
cd etc/
mkdir init.d
touch fstab inittab
sudo gedit fstab
加上如下内容后保存
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
sudo gedit inittab
加上如下内容后保存
# /etc/inittab
::sysinit:/etc/init.d/rcS
s3c2410_serial0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
cd init.d/
touch rcS
sudo gedit rcS
加上如下内容后保存
ifconfig eth0 192.168.1.110
mount -a
mkdir /dev/pts #使用内存文件系统,减少对flash的读写
mount -t devpts devpts /devpts #/dev/pts用来支持外部网络链接(telnet:远程访问摄像头)的虚拟终端
echo /sbin/mdev > /proc/sys/kernel/hotplug #设置内核,当有设备插拔时调用/bin/mdev程序
mdev -s #在/dev目录下生成内核支持的所有设备的节点
到此文件系统制作好了。
Linux内核,文件系统移植过程中出现的一些问题与解决办法的更多相关文章
- Linux系统在启动过程中启动级别发生错误的解决办法
一.系统启动级别一共有六个: 0:系统停机模式,系统不可以正常启动 1:单用户模式, root权限,用于系统的维护,禁止远程登陆 2:多用户模式,没有NFS网络支持 3:完整的多用户文本模式,有NFS ...
- Win10+Ubuntu16.04双系统安装过程中遇到的一些问题及解决办法
前两天闲来无聊重装了系统,装的是win10 64的系统,后来心血来潮索性再装Ubuntu,搞成win10+Ubuntu双系统. win10系统的镜像文件可以通过MSDN网站获取,MSDN是一个很可靠的 ...
- ubuntu安装过程中遇到的一些问题及解决办法。
由于ubuntu与win10的双系统安装过程百度一下就有很多,在此不再赘述. (其实主要是忘记拍照片了,我一个菜鸡说得肯定也没有那些大佬们好,但网上确实也很多哈,加上有中文引导安装,问题不大.) 此篇 ...
- 安装Bind过程中提示丢失MSVCR110.dll的解决办法
前几天在线安装Visual Studio 2012 Update 3,由于在线安装需要不断下载安装文件,时间很长,后来等不下去,就取消了,不幸的是VS启动不了了,弹出“devenv.exe – 系统错 ...
- Linux系统在启动过程中grub引导文件丢失的解决方法
在/boot/grub2目录下有一个grub.cfg文件:该文件主要是用来自动地引导系统启动内核程序和系统的初始化程序. 问题一:当系统在启动的情况下,我们不小心删除/boot/grub2/grub. ...
- Linux内核分析第三周学习博客——跟踪分析Linux内核的启动过程
Linux内核分析第三周学习博客--跟踪分析Linux内核的启动过程 实验过程截图: 过程分析: 在Linux内核的启动过程中,一共经历了start_kernel,rest_init,kernel_t ...
- Storm编译打包过程中遇到的一些问题及解决方法
作者: 大圆那些事 | 文章可以转载,请以超链接形式标明文章原始出处和作者信息 网址: http://www.cnblogs.com/panfeng412/archive/2013/11/30/som ...
- 跟踪分析Linux内核的启动过程--实验报告 分析 及知识重点
跟踪分析Linux内核的启动过程 攥写人:杨光 学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.stud ...
- 跟踪分析Linux内核的启动过程小解
跟踪分析Linux内核的启动过程 “20135224陈实 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029 ...
随机推荐
- Matlab中sortrows函数解析
一.问题来源 返回检索到的数据(按相关度排序)在原始数据中的索引. 二.问题解析 x = [1 4 3 5; 1 3 2 6]:sortrows(x)其结果是按照row来排列,默认首先排第一列,1和1 ...
- 团体程序设计天梯赛-练习集L1-015. 跟奥巴马一起画方块
L1-015. 跟奥巴马一起画方块 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 美国总统奥巴马不仅呼吁所有人都学习编程,甚至 ...
- IOS xib生成界面和代码生成界面两种方式混合
应用程序代理类 WKAppDelegate.m // // WKAppDelegate.m // HelloWorld // // Created by easy5 on 13-9-18. // Co ...
- gcc,g++,extern “C” :一些编译错误的缘由
正好是我们代码中遇到的问题,之前不求甚解,只用g++编译没有错误就不管了,现在要跨平台到windows下就遇到了问题.全文转载自:http://user.qzone.qq.com/75172588/b ...
- Visual C++ unicode and utf8 转换
ATL宏: USES_CONVERSION; W2A A2W CString StringUtil::UTF8_to_UNICODE(const char *utf8_string, int leng ...
- EntityFreamwork 读写分离
http://www.cnblogs.com/cjw0511/p/4391092.html
- [扫描线]POJ2932 Coneology
题意:有n个圆 依次给了半径和圆心坐标 保证输入的圆不相交(只有 相离 和 内含/外含 的情况) 问 有几个圆 不内含在其他圆中,并分别列出这几个圆的编号(1~n) (n的范围是[1, 4000 ...
- cctype头文件(字符处理库)的使用
C++ 中cctype头文件的使用 头文件cctype(字符处理库)中定义了有关字符判断与处理的库函数,使用前要包含头文件: #include <cctype> using namespa ...
- laravel的解决方案
对form表单批量去掉前后空格trim: $request->merge(array_map('trim', $request->all())); 或 Input::merge(array ...
- git bash中带空格的文件夹以及文件的处理
空格用'\ '表示,输入的时候,是不需要单引号的 total 338drwxr-xr-x 9 Administ Administ 4096 Aug 24 23:53 HDTHelperdrwxr-xr ...