ImageVerifierCode 换一换
格式:DOCX , 页数:40 ,大小:27.41KB ,
资源ID:9886444      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9886444.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第六章 Linux移植.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第六章 Linux移植.docx

1、第六章 Linux移植第六章 Linux移植一、解压Linux内核源代码#cd /work/linux-2.6.20.tar.bz2#tar jxf linux-2.6.20.tar.bz2 等待几分钟,源文件解压完毕。 二、修改Makefile文件 在/work/linux-2.6.20目录下找到 Makefile 文件,把(约在第185行) ARCH ?= $(SUBARCH)CROSS_COMPILE ?= 修改为 ARCH ?= armCROSS_COMPILE ?=/usr/local/arm/3.4.1/bin/arm-linux-说明:ARCH ?= arm这一句指定编译内核的处

2、理器类型。CROSS_COMPILE ?=/usr/local/arm/3.4.1/bin/arm-linux- 这一句指定交叉编译工具所在位置。 三、配置Linux内核 1、配置默认内核 #cd /work/linux-2.6.20#make s3c2410_defconfig#make zImage 等待N长时间后,应该可以看到如下信息: Kernel: arch/arm/boot/zImage is ready说明我们所配置的基本内核已经成功编译通过。说明 如果能够正确编译通过,仅说明交叉工具安装设置正确。如果编译没有通过,仔细检 查前面的步骤,直到编译成功为止。还不行?一百遍啊一百遍!

3、 为什么要用 make zImage 呢?因为实际中发现,直接make uImage出来的镜像文件地址有错误,导致在 UBoot 中无法正确引导。是我的个人原因还是所有的源代码都一样,有待考证。 2、测试默认内核 编译成功了,是不是代表就一定正确呢?不见得! 不相信?那么我们就来测试一下。 把编译好的内核发布到TFTP上 #cp /work/linux-2.6.20/arch/arm/boot/zImage /tftpboot 启动开发板,在UBoot提示符下 CNOS2410 tftp 0x30008000 zImageCNOS2410go 0x30008000# Starting appl

4、ication at 0x30008000 .Uncompressing Linux. done, booting the kernel.Error: unrecognized/unsupported machine ID (r1 = 0x33e07a90).Available machine support:ID (hex) NAME中间省略Please check your kernel config and/or bootloader. 呵呵,出错了。为什么呢? Error: unrecognized/unsupported machine ID 这一句是说内核不支持UBoot传递给它的

5、机器ID。 那么怎么解决呢? Please check your kernel config and/or bootloader. 请检查你的内核配置和(或)UBoot。 UBoot我们已经移植好,能不动它就尽量不动它。那么就修改内核吧。 反正还没有改过呢。 3、修改内核怎么改?对内核不熟悉,不要紧。网络上高手一大把。要学会使用搜索引擎。XX一下,你就知道!果然,发现了高手的踪影。解决方法如下:在/work/linux-2.6.20/arch/arm/kernel/head.S中,在(约第74行) _INIT .type stext, %functionENTRY(stext) 后添加如下语句

6、 /* 修改MACHINE ID */mov r0, #0mov r1, #0xc1ldr r2, =0x30000100/* 修改MACHINE ID */ 原理嘛,就是把SMDK2410的MACHINE ID直接赋值为000000c1。 重新编译内核,再来测试,相信自己,一定能行。 #make zImage#cp /work/linux-2.6.20/arch/arm/boot/zImage /tftpboot 重新启动开发板 CNOS2410 tftp 0x30008000 zImageCNOS2410 go 0x30008000 # Starting application at 0x

7、30008000 .Uncompressing Linux. done, booting the kernel.Linux version 2.6.20 (rootlocalhost.localdomain) (gcc version 3.4.1) #2 Mon Apr 27 19:01:21 CST 2009CPU: ARM920T 41129200 revision 0 (ARMv4T), cr=00007177Machine: SMDK2410Warning: bad configuration page, trying to continueMemory policy: ECC dis

8、abled, Data cache writebackCPU S3C2410A (id 0x32410002)S3C2410: core 202.800 MHz, memory 101.400 MHz, peripheral 50.700 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

9、 lines, 8 setsCPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 setsBuilt 1 zonelists. Total pages: 4064Kernel command line: root=/dev/hda1 ro init=/bin/bash console=ttySAC0irq: clearing subpending status 00000002PID hash table entries: 64 (order: 6, 256 bytes)timer tcon=00500000, tcnt

10、a509, tcfg 00000200,00000000, usec 00001e4cConsole: colour dummy device 80x30Dentry cache hash table entries: 2048 (order: 1, 8192 bytes)Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)Memory: 16MB = 16MB totalMemory: 13104KB available (2692K code, 283K data, 120K init)Mount-cache hash ta

11、ble entries: 512CPU: Testing write buffer coherency: ok中间省略Root-NFS: No NFS server available, giving up.VFS: Unable to mount root fs via NFS, trying floppy.VFS: Cannot open root device hda1 or unknown-block(2,0)Please append a correct root= boot optionKernel panic - not syncing: VFS: Unable to mount

12、 root fs on unknown-block(2,0) 稀里哗啦地出来一大堆东西,是不是很激动?别激动得太早。这里面到底说的是什么呢? 大概是说内核已经功能启动了。但是,但是。告诉你一个不好的消息。它挂了!挂了是什么意思?说得直白一点就是死了。但为什么死在这里了。让我们来解剖一下,看看有什么蛛丝马迹。 Root-NFS: No NFS server available, giving up.这句是说,没有NFS服务,放弃。什么意思呢?因为我们并没有在UBoot中配置NFS信息。 VFS: Unable to mount root fs via NFS, trying floppy.这句是

13、说,不能通过NFS加载根文件系统,尝试从软盘加载。当然也不会有结果。因为根本没软盘。VFS: Cannot open root device hda1 or unknown-block(2,0)这句是说不能打开根设备”hda1”。“hda1“从哪来?看前面。Kernel command line: root=/dev/hda1 ro init=/bin/bash console=ttySAC0这就是Linux内核启动时的命令行参数,它指定Linux内核从哪加载根文件系统。Please append a correct root= boot option这句是说请增加正确的”root=”启动选项

14、。Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)这句是说,Linux内核找了N久都找不到根文件系统,疯了。马上死给你看。4、设置根文件系统那么多问题,怎么解决?找不着头绪?当不了高明的医生,那就做个庸医吧。什么招数?头痛医头,脚痛医脚。可Linux已经死了!怎么办。死马当活马医。看它为什么死的?找不到根文件系统。好办。那就给它一个吧。骗骗它,让它死得瞑目。我们没有根文件系统啊。不要紧,能骗过它就行。随便找一个,只要是它能认识的。你没有?送你一个。在哪?在附件里,K9.img就是了。怎么

15、给呢?当然是从boot选项给了。要重新编译内核?真是太痛苦了。不是说UBoot可以传递命令行参数给Linux内核的吗?有道理。那就设置UBoot参数吧。重新启动开发板:CNOS2410 setenv bootargs root=/dev/ram rw initrd=0x30500000,4M init=/linuxrc console=ttySAC0,115200 mem=64MCNOS2410 saveenv注意:这个UBoot命令用于设置传递给Linux内核的参数,必须写成一行,不得换行。说明:root=/dev/ram rw这个参数是说Linux内核从/dev/ram加载根文件系统。rw

16、 表示可读写。initrd=0x30500000这个参数是说根文件系统所在的内存位置。4M表示根文件系统的大小。init=/linuxrc这个参数是说Linux启动成功后,最先执行的命令。console=ttySAC0,115200这个参数是说输出终端是ttySAC0。 115200表示波特率.mem=64M这个参数是指内存的大小。光给Linux内核说”有根文件系统了”,它会相信吗?当然相信,可是当它找了N久之后发现你骗它。照样会死给你看。还是满足一下它吧。我们说在0x30500000这里有根文件系统,那么就放在这里吧。#cp /work/K9.img /tftpboot重新启动开发板:CNO

17、S2410 tftp 0x30500000 K9.imgCNOS2410 tftp 0x30008000 zImageCNOS2410 go 0x30008000看看效果!Root-NFS: No NFS server available, giving up.VFS: Unable to mount root fs via NFS, trying floppy.VFS: Cannot open root device hda1 or unknown-block(2,0)Please append a correct root= boot optionKernel panic - not sy

18、ncing: VFS: Unable to mount root fs on unknown-block(2,0)晕了,还是挂了。Linux内核还是找不到根文件系统。什么原因?Kernel command line: root=/dev/hda1 ro init=/bin/bash console=ttySAC0原来UBoot的bootargs参数并没有传递给Linux内核。难怪会找不到。注意:uImage用bootm命令来引导,这个命令会做许多事情,包括把启动参数拷贝到合适的位置,在把控制权交给内核的时候用theKernel(arg,arg1,arg2);三个参数会放在r0,r1,r2中,分

19、别为0,machine number,存放bootargs 的地址。 用go命令来引导,只是把pc设为内核入口地址,并不拷贝bootargs ,而且只传递两个参数。原因知道了。是zImage不支持bootargs变量。那么用uImage是不是就能解决问题呢?我们来测试一下。#mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n linux-2.6.20 -d /tftpboot/zImage /tftpboot/uImage 说明: 不使用Linux内核的make uImage来生成uImage.原因见前述部分

20、。 mkimage参数: -A = set architecture to arch 处理器类型:arm-O = set operating system to os 操作系统:linux-T = set image type to type 镜像类型:kernel-C = set compression type comp 压缩类型:none不压缩-a = set load address to addr (hex) 加载地址:0x30008000-e = set entry point to ep (hex) 入口地址:0x30008040-n = set image name to na

21、me 镜像名称:linux-2.6.20-d = use image data from datafile 输入文件名:/tftpboot/zImage 重新启动开发板: CNOS2410 tftp 0x30500000 K9.imgCNOS2410 tftp 0x30008000 uImageCNOS2410 bootm 0x30008000 注意: 启动zImage用go命令,启动uImage用bootm命令。 看看效果。 # Booting image at 30008000 . Image Name: linux-2.6.13 Created: 2009-04-27 11:57:12

22、UTC Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1466160 Bytes = 1.4 MB Load Address: 30008000 Entry Point: 30008040 Verifying Checksum . OK XIP Kernel Image . OKStarting kernel .Uncompressing Linux. done, booting the kernel.Linux version 2.6.20 (rootlocalhost.localdomain) (gcc versi

23、on 3.4.1) #2 Mon Apr 27 19:01:21 CST 2009CPU: ARM920T 41129200 revision 0 (ARMv4T), cr=00007177Machine: SMDK2410Memory policy: ECC disabled, Data cache writebackCPU S3C2410A (id 0x32410002)S3C2410: core 202.800 MHz, memory 101.400 MHz, peripheral 50.700 MHzS3C24XX Clocks, (c) 2004 Simtec Electronics

24、CLOCK: 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. Total pages: 16256Kernel command line: root=/dev/ram rw initrd=0x3

25、0500000,4M mem=64M init=/linuxrc console=ttySAC0,115200irq: clearing subpending status 00000002PID hash table entries: 256 (order: 8, 1024 bytes)timer tcon=00500000, tcnt a509, tcfg 00000200,00000000, usec 00001e4cConsole: colour dummy device 80x30Dentry cache hash table entries: 8192 (order: 3, 327

26、68 bytes)Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)Memory: 64MB = 64MB totalMemory: 57728KB available (2692K code, 283K data, 120K init)Mount-cache hash table entries: 512CPU: Testing write buffer coherency: ok中间省略RAMDISK: ext2 filesystem found at block 0RAMDISK: Loading 4096KiB 1

27、disk into ram disk. done.VFS: Mounted root (ext2 filesystem).Freeing init memory: 120Kroute: SIOCADD|DELRT: No such processroute: SIOCADD|DELRT: Network is unreachable# 开心吧!终于成功了。Linux活了。 在SHELL下,可以输入命令了: # lsbin etc lib lost+found proc usrdev hello linuxrc mnt sbin# ./helloHello World 1 times!Hello

28、 World 2 times!Hello World 3 times!Hello World 4 times!Hello World 5 times!Hello World 6 times!Hello World 7 times!Hello World 8 times!# 看起来是好像是没问题了。根目录下的hello测试程序也可以正常运行。 但是,事情并没有想象中的那么简单。 不相信,PING一下主机: # ping 192.168.1.1PING 192.168.1.1 (192.168.1.1): 56 data bytesping: sendto: Network is unreacha

29、ble# 网络不可到达?没设IP? # ifconfig# 根本没反应。网络出问题了! 我们开发板上的网络芯片是DM9000。看启动信息: dm9000 Ethernet Driver 驱动在内核里已经配置了。是不是UBoot没设置好? 既然如此,那我们就设置好UBoot. 重新启动开发板: CNOS2410 set bootargs root=/dev/ram rw initrd=0x30500000,4M ip=192.168.1.40:192.168.1.20:192.168.1.1:255.255.255.0:cnos2410:eth0:on mem=64M init=/linuxrc console=ttySAC0,115200CNOS2410 save 注意:这个UBoot命令用于设置传递给Linux内核的参数,必须写成一行,不得换行。 说明: bootargs中关于IP的设置格式:ip=开发板IP:主机IP:网关IP:子网掩码:开发板名称:网卡名称

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1