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
[[email protected] 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 (linux编译的时候不选上eabi)

编译结果:linux编译不通过,要把Linux-2.6.30目录下的Makefile的194行改为

194 CROSS_COMPILE  
?=arm-none-linux-gnueabi-

编译才通过

运行结果:看到控制台

5.
(zImage4)

Busybox-1.3.2: arm-linux-gcc-3.3.2

Linux-2.6.30:     
arm-linux-gcc-4.3.2 (linux编译的时候选上eabi)

编译结果:linux编译不通过,要把Linux-2.6.30目录下的Makefile的194行改为

194 CROSS_COMPILE  
?=arm-none-linux-gnueabi-

编译才通过

运行结果:看到控制台

6.
(***)

Busybox-1.3.2: arm-linux-gcc-4.3.2

Linux-2.6.30:     
arm-linux-gcc-4.3.2 (linux编译的时候选上eabi)

编译结果:Busybox-1.3.2编译不通过

运行结果:XXX

7.
(zImage4)

Busybox-1.15.2(这个版本的文件系统是支持eabi的):
arm-linux-gcc-4.3.2

Linux-2.6.30:     
arm-linux-gcc-4.3.2 (linux编译的时候选上eabi)

编译结果:正常通过

运行结果:运行正常 (难能可贵的是在secureCRT终端下TAB键、四个箭头键、delete键、退格键都能够正常使用)

8.
(zImage3)

Busybox-1.15.2(这个版本的文件系统是支持eabi的):
arm-linux-gcc-4.3.2

Linux-2.6.30:     
arm-linux-gcc-4.3.2 (linux编译的时候不选上eabi)

编译结果:正常通过

运行结果:一大堆错误

9.(
zImage2)

Busybox-1.15.2(这个版本的文件系统是支持eabi的):
arm-linux-gcc-4.3.2

Linux-2.6.30:     
arm-linux-gcc-3.4.1 (linux编译的时候不选上eabi)

编译结果:正常通过

运行结果:一大堆错误(同 8.
中的错误)

10.(
zImage)

Busybox-1.15.2(这个版本的文件系统是支持eabi的):
arm-linux-gcc-4.3.2

Linux-2.6.26.3:   
arm-linux-gcc-3.4.1 (linux编译的时候不选上eabi)

编译结果:正常通过

运行结果:有几行错误

11.下面情况编译都是不通过的

Busybox-1.15.2: arm-linux-gcc-3.4.1或arm-linux-3.3.2

Linux-2.6.30(选上支持eabi):    
arm-linux-gcc-3.4.1或arm-linux-3.3.2

12.通过以上11种情况的分析对内核和文件系统是否支持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

加上如下内容后保存

#!/bin/sh
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内核,文件系统移植过程中出现的一些问题与解决办法,布布扣,bubuko.com

时间: 2024-10-20 08:54:28

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

Linux系统在启动过程中启动级别发生错误的解决办法

一.系统启动级别一共有六个: 0:系统停机模式,系统不可以正常启动 1:单用户模式, root权限,用于系统的维护,禁止远程登陆 2:多用户模式,没有NFS网络支持 3:完整的多用户文本模式,有NFS,登陆后进入控制台命令行模式 4:系统未使用,作为保留一般不用 5:图形化模式,登陆后进入GUI模式 6:重启模式,默认级别不能为6,否则不能正常启动 示例:若我们设置默认模式为poweroff.target,则在开机的时候会出现启动关机死循环状态 使用reboot命令后,会出现如下情况:(停在该位

20170514002Oracle 11g R2安装过程中遇到的报错及解决办法

Oracle 11g R2安装过程中遇到的报错及解决办法 1.提示Check if the DISPLAYvariable is set.    Failed<<<< 解决方案: #xhost +  //切换到root用户输入 #su – Oracle  //切换到oracle用户 $./runInstaller  //执行安装程序 xhost 是用来控制X server访问权限的. 通常当你从hostA登陆到hostB上运行hostB上的应用程序时, 做为应用程序来说,hostA

repo使用过程中遇到的一些问题及解决办法

作为新入职的菜鸟,过去的这半个月忙的是焦头烂额的,碰到了许多问题,但都没时间好好记下来.趁着今天这点时间,记录一下有关repo使用过程中碰到的一些问题及解决办法吧! 一.repo sync时出现 error: .repo/manifests/: contains uncommitted changes 这样的错误提示.从字面意思上看是代码有改动但是没有commit.但好几次我查看了代码,把改动通过 git reset --hard  <commit id>命令进行了还原,但还是会提示这样的错误

Linux下安装MyEclipse和Tomcat服务器详解,以及我安装过程中所出现的问题以及解决办法,并实现一个web小程序

1.首先,先要去MyEclipse和Tomcat的官网去下载Linux版的压缩文件,而MyEclipse的中文官网是需要登录并有可能要付钱,大家可以去网上下载,还有就是Tomcat的linux版,这个直接上官网就可以下载了,下载后我还是通通把它们放在我E盘下的as目录底下,如果大家还没配置好jdk,即Java环境的话,可看我这篇文章:http://blog.csdn.net/u012561176/article/details/45119047 这里我就直接进行操作了! 我E盘下的as文件夹

seo优化过程中常见的heimao技术及解决办法

很多seo人员很喜欢heimao技术啊,毕竟那是快速排名的方.但是小编在这里告诫大家:如果你不是专业的heike,你还是放弃这种想法吧,因为那不是一般人能玩的转的.那么今天小编就来分享一下那些常见的heimao技术的手法和解决办法,分享的目的希望大家明白别有事没事痴人做梦,想通过去学习heimao来快速做站,然后被忽悠了都不知道:同时也希望站长在做站的时候,多多关注安全方面的问题,别被真正的高手黑了网站才后悔. 第一.蜘蛛劫持 大家在网上经常看到一个网站被黑了,我们能看见的东西就是快照被挂上了*

Linux+Sublime 开发C/C++ 中无法读取cin/scanf 的解决办法

Q:sublime在Ubuntu环境下配置好,能使用gcc编译运行程序后,发现cin,scanf 这样的命令不执行 A:sublime自带的控制台不支持这样的输入操作,解决办法就是调用Linux本地终端,在终端上执行程序,  网上关于windows下调用cmd的例子已经好多了,可是却很少找到Linux环境下的配置方法, 以下是我自己总结的方法,自己感觉很好用,希望可以帮到需要的朋友. 1.Sublime界面-->Tools-->Build System-->New Build Syste

ruby on rails 的使用过程中,遇到的错误及解决办法

1./data/drolay11/lcb_saas/tmp/build-147274463612855/vendor/bundle/ruby/2.1.0/bin/rake: symbol lookup error: /data/drolay11/lcb_saas/tmp/build-147274463612855/vendor/bundle/ruby/2.1.0/gems/mysql2-0.3.17/lib/mysql2/mysql2.so: undefined symbol: mysql_ge

zblogasp中出现ytcms未知错误的解决办法

zblogasp确实是...出现了报错居然是“未知错误”.完全不知道怎么去找到问题并修复好吧. 不过遇到的问题多了也就大概能猜到大概是什么错误了,这也许就是所谓的经验吧.本文为大家讲下zblogasp在使用过程中出现ytcms未知错误的解决办法. 出现这种错误一般是主题使用了cms调用模式.先打开后台主题配置,看有没有调用栏目ID的选项.如果有,那么问题就解决了大半,出现未知错误的原因就是主题所需要调用的栏目根本不存在造成的. 這样说可能并不是很好懂,来图片说明: 如下图,后台主题配置说明里面写

用uboot 烧写uboot linux内核 文件系统到nandflash的 过程以及bootm go命令启动与区别

原文:http://blog.sina.com.cn/s/blog_6b94d5680100nd48.html 文章结构结构顺序有变化-1:烧写uboot0: bootargs bootcmd 命令参数的设置1:制作yaffs2的过程2:烧写yaffs2的过程3:制作uimage 的过程4: 烧写uiamge的过程5:uimage zimage vmlinux 的区别6: uboot传递给内核的参数结构 tag7:bootm go 的 启动过程 以及区别8:加载地址 入口地址 等 ///////