概述
linux初学-内核编译以及文件系统2
前面介绍了内核的编译。最后生成的内核镜象有两种zImage以及uImage。其中zImage下载到目标板中后,可以直接用uboot的命令go来进行直接跳转。这时候内核直接解压启动。但是无法挂载文件系统,因为go命令没有将内核需要的相关的启动参数传递给内核。传递启动参数我们必须使用命令bootm来进行跳转。Bootm命令跳转只处理uImage的镜象。
uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件。
mkimage在制作映象文件的时候,是在原来的可执行映象文件的前面加上一个0x40字节的头,记录参数所指定的信息,这样uboot才能识别这个映象是针对哪个CPU体系结构的,哪个OS的,哪种类型,加载内存中的哪个位置, 入口点在内存的那个位置以及映象名是什么
用法如下:
./mkimage -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image
-A ==> set architecture to 'arch'
-O ==> set operating system to 'os'
-T ==> set image type to 'type'
-C ==> set compression type 'comp'
-a ==> set load address to 'addr' (hex)
-e ==> set entry point to 'ep' (hex)
-n ==> set image name to 'name'
-d ==> use image data from 'datafile'
-x ==> set XIP (execute in place)
参数说明:
-A 指定CPU的体系结构:
取值 表示的体系结构
alpha Alpha
arm A RM
x86 Intel x86
ia64 IA64
mips MIPS
mips64 MIPS 64 Bit
ppc PowerPC
s390 IBM S390
sh SuperH
sparc SPARC
sparc64 SPARC 64 Bit
m68k MC68000
-O 指定操作系统类型,可以取以下值:
openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos
-T 指定映象类型,可以取以下值:
standalone、kernel、ramdisk、multi、firmware、script、filesystem
-C 指定映象压缩方式,可以取以下值:
none 不压缩
gzip 用gzip的压缩方式
bzip2 用bzip2的压缩方式
-a 指定映象在内存中的加载地址,映象下载到内存中时,要按照用mkimage制作映象时,这个参数所指定的地址值来下载
-e 指定映象运行的入口点地址,这个地址就是-a参数指定的值加上0x40(因为前面有个mkimage添加的0x40个字节的头)
-n 指定映象名
-d 指定制作映象的源文件
我在编译时用到的命令如下:
# make zImage //生成zImage镜象
#/usr/local/arm/k9uboot/tools/mkimage -n 'Linux 2.4.27 ' -A arm -O linux -T
kernel -C none -a 0x20007fc0 -e 0x20008000 -d zImage uImage
内核镜象已经准备好了,这个时候我们就要来准备文件系统了。由于时间缘故,本人暂时采用的是其他人已经好的文件系统k9.img.gz。这个时候我们要做的是,自己写一个简单hello.c的程序,编译通过后加入到该文件系统中,然后下载到目标板中运行。
先编写hello.c;
编译:
#/usr/local/arm/2.95.3/bin/arm-linux-gcc –o start-hello hello.c
编译后生成可执行文件start-hello
下面我们就必须把该执行文件加入到文件系统中去,步骤如下:
#gunzip k9.img.gz //解压缩
#mount –o loop k9.img /mnt/new_disk //挂载
#cp start-hello /mnt/new_disk //将文件拷贝到文件系统中
#cd /mnt/new_disk
#umount /mnt/new_disk //卸载
#gzip –c –v9 k9.img > k9.img.gz //压缩 生成最终的文件系统
下面我们就要下载内核以及准备好文件系统了,这边先说明我的内存分配情况如下:
Flash:
0x10000000 ――― 0x10020000 boot
0x10020000 ――― 0x10040000 uboot
0x10040000 ――― 0x10060000 uboot env
0x10060000 ――― 0x10200000 kernel
0x10200000 ――― 0x11000000 ramdisk
Sdram:
0x20007fc0 ――― 0x 20a 00000 kernel
0x 20a 00000 ――― ramdisk
Loadb 通过串口下载数据到ram中
cp.b 拷贝ram中的数据到flash中。
将kernel以及文件系统ramdisk下载完毕之后,我们还需要设置uboot的环境变量,这样uboot才能够在上电启动的时候启动内核等操作。环境变量设置如下:
Set cpfltoram cp.b 10200000 20a 00000 18ffff //拷贝文件系统到ram中
Set boot bootm 20007fc0 //启动kernel
Set bootcmd run cpfltoker/;run cpfltoram/;run boot //uboot复位的执行指令
Set cpfltoker cp.b 10060000 20007fc 0 f 4fff //拷贝内核到ram中
Set bootargs root=/dev/ram rw initrd=0x 20a 00000, 4M init=/linuxrc console=ttyS0,11520
0,mem= 32m //uboot传递给内核的启动参数
设置完毕后,saveenv把环境变量存储起来。
随后就可以上电复位目标板了。Kernel启动成功:
## Booting image at 20007fc0 ...
Image Name: Linux 2.6.20
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 974124 Bytes = 951.3 kB
Load Address: 20007fc0
Entry Point: 20008000
Verifying Checksum ... OK
XIP Kernel Image ... OK
Starting kernel ...
Uncompressing Linux.............................................................
.. done, booting the kernel.
Linux version 2.6.20 (root@dengdl) (gcc version 3.4.1) #2 Tue Apr 3 01:35:56 CST
2007
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
Machine: Atmel AT91RM9200-DK
Memory policy: ECC disabled, Data cache writeback
Clocks: CPU 179 MHz, master 59 MHz, main 18.432 MHz
CPU0: D VIVT write-back cache
CPU0: I cache: 16384 bytes, associativity 64, 32 byte l
CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
Built 1 zonelists. Total pages: 4064
Kernel command line: root=/dev/ram rw initrd=0x 20a 00000, 4M init=/linuxrc console
=ttyS0,115200,mem= 32m
AT91: 128 gpio irqs in 4 banks
PID hash table entries: 64 (order: 6, 256 bytes)
Console: colour dummy device 80x30
Dentry cache hash table entries: 2048 (order: 1, 8192 bytes)
Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)
Memory: 16MB = 16MB total
Memory: 10100KB available (1708K code, 193K data, 96K init)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
NET: Registered protocol family 16
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 1024 (order: 0, 4096 bytes)
TCP bind hash table entries: 512 (order: -1, 2048 bytes)
TCP: Hash tables configured (established 1024 bind 512)
TCP reno registered
checking if image is initramfs... it isn't (no cpio magic); looks like an initrdted Vendor Command Set found
K9
Freeing initrd memory: 4096K0020
physm
NetWinder Floating Point Emulator V0.97 (double precision)200000 20a 00000 18ffff
io scheduler noop registered
at91_c
io scheduler anticipatory registered (default)
X
boot=bootm 20007fc0OT
at91_spi: Baud rate set to 5990400le
AT91 SPI driver loaded1_ohci at91_ohci: AT91
e
eth0: Link down.g random host et
eth0: AT91 ethernet at 0xfefbc000 int=24 10-HalfDuplex (00:15:f2:9d:66:80)oot> loadb
usb0: Ethernet Gadget, version: May Day 2005
eth0: Davicom 9161 PHY (Copper)
i 2c /dev en
physmap platform flash device: 00200000 at 10000000dc, OUT ep 2 IN ep1 STATUS ep4
physmap-flash.0: Found 1 x16 devices at 0x 0 in 16-bit banka cache writebackMay
at91_cf: irqs det #64, io #0lt 1 zonelists. Total pages
usbmon: debugfs is not available
VFS: Mounted root (ext 2 f
at91_ohci at91_ohci: AT91 OHCI
usb usb1: Manufacturer: Linux 2.6.20 ohci_hcd
usb usb1: SerialNumber: at91
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 ports detected
udc: at91_udc version 3 May 2006
ether gadget: using random self ethernet address
ether gadget: using random host ethernet address
usb0: Ethernet Gadget, version: May Day 2005
usb0: using at91_udc, OUT ep 2 IN ep1 STATUS ep4
usb0: MAC 02:51: 7f :9d:de:e9
usb0: HOST MAC be:fc:84: 2f :85:64
usb0: RNDIS ready
mice: PS/2 mouse device common for all mice
at91_rtc at91_rtc: rtc core: registered at91_rtc as rtc0
AT91 Real Time Clock driver.
i 2c /dev entries driver
at91_i 2c at91_i 2c : AT91 i 2c bus driver.
TCP cubic registered
NET: Registered protocol family 1
NET: Registered protocol family 17
at91_rtc at91_rtc: setting the system clock to 1998-01-01 00:00:22 (883612822)
RAMDISK: Compressed image found at block 0
VFS: Mounted root (ext2 filesystem).
Freeing init memory: 96K
route: SIOC[ADD|DEL]RT: No such process
route: SIOC[ADD|DEL]RT: Network is unreachable
# usb 1-2: new low speed USB device using at91_ohci and address 2
usb 1-2: device descriptor read/64, error -62
usb 1-2: device descriptor read/64, error -62
usb 1-2: new low speed USB device using at91_ohci and address 3
usb 1-2: device descriptor read/64, error -62
usb 1-2: device descriptor read/64, error -62
usb 1-2: new low speed USB device using at91_ohci and address 4
usb 1-2: device not accepting address 4, error -62
usb 1-2: new low speed USB device using at91_ohci and address 5
usb 1-2: device not accepting address 5, error -62
上面红字标记的错误是由于我们采用的是QFP封装的9200,所以相对于BGA封装的9200来说在usb host上有区别,只有1个host。这必须在9200的配置文件中进行相应的修改。本人尚未搞通,后续将继续。
最后
以上就是尊敬棒球为你收集整理的linux初学-内核编译以及文件系统2的全部内容,希望文章能够帮你解决linux初学-内核编译以及文件系统2所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复