Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101961
  • 博文数量: 19
  • 博客积分: 840
  • 博客等级: 准尉
  • 技术积分: 235
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-02 21:25
文章分类

全部博文(19)

文章存档

2011年(1)

2010年(5)

2009年(13)

我的朋友

分类: 嵌入式

2009-10-08 22:04:20

参考资料:《嵌入式软件开发及C语言实现——MiniGUI剖析》魏永明
涉及知识:交叉编译,2.4内核编译,利用busybox基本制作文件系统
                    tempfs,romfs文件系统
在fdora11上完成,运行结果:

实际步骤:
一、安装Skyeye
安装Skyeye-1.2.7-rc1.tar.gz,安装前看INSTALL文本的步骤说明,skeyey-1.2.4-安装不成功(修改网友说明的几个地方也不成功)安装目录 /opt/embedded/skyeye-1.2.7
注意在安装中出现下面类似错误的话:
make[2]: Leaving directory `/pusr/Project/Skyeye/skyeye-1.2.7/device'
In function ‘open’,
make[1]: Leaving directory `/pusr/Project/Skyeye/skyeye-1.2.7'
    inlined from ‘nandflash_sb_setup’ at nandflash/
nandflash_smallblock.c:519:
/usr/include/bits/fcntl2.h:51: error: call to ‘__open_missing_mode’
declared with attribute error: open with O_CREAT in second argument
needs 3 arguments
>>原因出在:nandflash/nandflash_smallblock.c文件第519行调用的 open 函数,在此函数后添加第三个参数 “0666”,即可通过编译。
修改为:       if ((nf->fdump= open(dev->dump, FILE_FLAG,0666)) < 0)
 
二、安装交叉编译工具链
arm-linux-cross-2.95.3有现成的,下载地址:???
,这个用于2.4内核的编译
解压压缩包到/usr/local即可,加入环境变量修改~/.bashrc  加上export PATH=/usr/local/arm/2.95.3/bin:$PATH
小提示:为root更改显示符: 在~/.bashrc里面增加一行:export PS1="[\u \w]#"(\w即为当前目录全路径,方便哈)
 
三、配置、编译和运行内核
    a.解压linux-2.4.13-patched-for-EP7312.tar.gz
 (该版本是针对ARM EP7312开发板的linux内核版本,来自

    b.make menuconfig配置内核选项
        这里要根据目标机仔细选择,对于嵌入式比较重要的如下:
        Code maturity level options
              Loadable module support
              General setup
              Memory technology devices
              Block devices
              Network device support
              Character devices
              Filesystems
              Console drives
              将不要的功能去掉哈
       
        在这里对于开发板ep7312我们修改这些
        System type :CLPS711X/EP721X Implementations ->EDB7312();(这个已经默认了)
              Block devise: RAM disk support 和Initial RAM disk support(这个要选)
              File System:ROM file system support(我们要使用ROMFS文件系统类型)
             
        c.编译内核映像:
 make dep(2.6内核的不必这步);
 make zImage;    
               (zimage是binary image格式的带自解压功能的压缩的linux内核)
        (这里的Makefile已经配置了:ARM:=arm;指示目标体系架构的名字;
         CROSS_COMPILE=arm-linux- ;指定要使用的编译器为第5步安装的交叉编译工具arm-linux-gcc)
        效果和这个一样:make ARCH=arm CROSS_COMPILE=arm-linux-   menuconfg
        提示:make menufonfig 提供了一个图形化的配置菜单,非常方便,要是用命令行make config的话就不是一般的麻烦了,推荐make menuconfig
         d.上一步中生成的映像
       压缩格式在:linux-2.4.13/arch/arm/boot/compressed/vmlinux
       未压缩的映像为内核根目录下的vmlinux文件: opt/embedded/arm/linux-2.4.13/vmlinux
            
8.在目录/opt/embedded/armlinux下建立一个用于保存运行时程序和数据的工作目录ep7312
mkdri   /opt/embedded/armlinux/ep7312
并把未压缩的内核文件vopt/embedded/arm/linux-2.4.13/vmlinux
拷贝到这个目录下;s
9.在运行Skyeye之前还需要一个针对EP7312的Skyeye配置文件skyeye.conf
参考《EP73xx User's Guide》文档和ARM Linux内核文件/arch/arm/mach-clps711x/clep7312.c等内容
在/opt/embedded/armlinux/ep7312下新建文件skyeye.conf,编辑如下
#skyeye config file for ep7312
cpu: arm720t
mach: ep7312
mem_bank: map=I, type=RW, addr=0x80000000, size=0x00010000
mem_bank: map=M, type=RW, addr=0xc0000000, size=0x00200000
mem_bank: map=M, type=R, addr=0xc0000, size=0x340000
mem_bank: map=M, type=RW, addr=0xc0600000, size=0x00c00000
提示:
cpu: arm720t  表示一个代表cpu名字的字符串
mach: ep7312 代表基于特定CPU的开发板名字的字符串
mem_bank内存组配置选项(参考IBM DeveloperWorks上的文件SkyEye硬件模拟平台,第二部分: 安装与使用)
一个内存组内的地址是连续的,类型分为RAM SPACE, ROM SPACE, mapped IO SPACE
格式为:
mem_bank: map=M|I, type=RW|R, addr=0xXXXXXXXX, size=0xXXXXXXXX,file=imagefilename,boot=yes|no
map=M 表示 RAM/ROM SPACE, map=I 表示 mapped IO SPACE。
type=RW ,且如果map=M则表示RAM SPACE, type=R,且如果map=M则表示ROM SPACE。
addr=0xXXXXXX 表示内存组的起始物理地址(32bit,16进制)。
size =0xXXXXXX 表示内存组的大小(32bit,16进制) 。
file =imagefilename
file的值imagefilename是一个字符串,实际上表示了一个文件,一般是一个可以执行的binary image格式的可执行程序或OS内核文件或是一个binary image格式的根文件系统。如果存在这个文件,SkyEye会把文件的内容直接写到对应的模拟内存组地址空间中。
boot=yes/no,如果boot=yes,则SkyEye会把模拟硬件启动后的第一条指令的地址定位到对应的内存组的起始地址。
例如:
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=./boot.rom
mem_bank: map=M, type=RW, addr=0x10000000, size=0x00000800, file=./loader.bin,boot=yes
我们的配置文件中没有file字段。
10.运行内核
在目录 /opt/embedded/armlinux/ep7312下
skyeye -e vmlinux
(vmlinux 是elf格式的liux内核, zimage是binary image格式的带自解压功能的压缩的linux内核)
出现如下信息:
Your elf file is little little endian.
arch: arm
cpu info: armv4, arm920t, 41009200, ff00fff0, 2
mach info: name s3c2410x, mach_init addr 0x80664c0
ethmod num=1, mac addr=0:4:3:2:1:f, hostip=10.0.0.1
lcd_mod:1
最后提示: kernel panic: VFS: Unable to mount root fs on 1f:00
内核挂载文件系统失败
 
四、构建根文件系统
a.在/opt/embedded/armlinux/ep7321下新建目录rootfs,作为文件系统的准备文件
b.解压busybox-1.1.3.tar.bz2到该新目录下;
下载最新版本
c.make menconfig 对busybox配置
      BusyBox Setting: ->Build option选择静态编译
 (简单点,也可以选择动态编译,那样的话则需要在文件系统/lib目录下添加需要的交叉编译的glibc库文件,需要libc-2.1.3.so和ld-2.1.3,建立相应符号连接libc.so.6,ld-linux.so.6)
     更改交叉编译工具位置为/usr/local/arm/2.95.3/bin/arm-linux-;相当于指定编译器为arm-linux-gcc
    Coreutils里的所有程序都可以选;
    Init Utilities菜单里的int等程序,这样就可以利用BusyBox程序来完成内核引导之后的init程序执行;
    Shell菜单选择ash作为默认的shell程序,一定注意要指定默认的shell
    Networking Utilities菜单中的hostname,ping等命令
    Linux System Utiltities菜单中的mount和umount;
d.完成配置后编译
    make dep
    make CROSS_CFLAGS=-I/opt/embedded/armlinux/linux-2.4.13/include/;
        利用内核2.4.13的头文件指定编译BusyBox所需要的内核头文件所在的位置
       
     如果在编译busybox-1.1.3 , 出现如下问题:
/opt/busybox-1.1.3/util-linux/util-linux.a(mount.o)(.text+0x5fc): In function `singlemount':
: undefined reference to `del_loop'
collect2: ld returned 1 exit status
make[1]: *** [busybox_unstripped] 错误 1
make: *** [all] 错误 2
   
    注释掉util-linux/mount.c里的这一段
351:
352// If mount failed, clean up loop file (if any).
     if (rc && loopFile) {
      if (ENABLE_FEATURE_MOUNT_LOOP && rc && loopFile) {
        del_loop(mp->mnt_fsname);
      if (ENABLE_FEATURE_CLEAN_UP) {
    free(loopFile);
e.编译无误的话,再确认生成的busybox的可执行文件版本
file busybox
出现类似:
busybox: ELF 32-bit LSB executable, ARM, version 1, for GNU/Linux 2.0.0, statically linked, stripped
说明它是ARM版本的程序
  
f.安装BusyBox 工具程序到指定的目标根文件系统目录下
make PREFIX=/opt/embedded/armlinux/ep7312/rootfs install
(所PREFIX变量就是指定安装目录)
这时候rootfs/bin下面应该有这些符号连接(除了busybox为可执行文件,当然不同配置不一样的)
ash      chgrp  cp    df     hostname  mkdir  mv    printenv  rmdir  stat  touch   uname
busybox  chmod  date  echo   ln        mknod  nice  pwd       sh     stty  true    usleep
cat      chown  dd    false  ls        mount  ping  rm        sleep  sync  umount  watch
g.创建设备节点文件
(利用mknod,我们也可以用这个命令创建named pipe:mknod  pipeuser p)
如mknod mem c 1 1
最方便的就是从宿主机直接拷贝过来
[/opt/embedded/armlinux/ep7312/rootfs/dev]#cp /dev/console . -a
[/opt/embedded/armlinux/ep7312/rootfs/dev]#cp /dev/kmem . -a
[/opt/embedded/armlinux/ep7312/rootfs/dev]#cp /dev/mem . -a
[/opt/embedded/armlinux/ep7312/rootfs/dev]#cp /dev/null . -a
[/opt/embedded/armlinux/ep7312/rootfs/dev]#cp /dev/ram0 . -a
[/opt/embedded/armlinux/ep7312/rootfs/dev]#cp /dev/random . -a
[/opt/embedded/armlinux/ep7312/rootfs/dev]#cp /dev/tty . -a
[/opt/embedded/armlinux/ep7312/rootfs/dev]#cp /dev/tty0 . -a
[/opt/embedded/armlinux/ep7312/rootfs/dev]#cp /dev/tty1 . -a
[/opt/embedded/armlinux/ep7312/rootfs/dev]#cp /dev/zero . -a
其中-a选项的作用:禁止cp命令试图打开设备文件并从中读取数据
h.增加系统需要的一些配置文件inittab,fstab,init.d/rcS
 这里直接使用BusyBox提供的示例inittab文件即可
 cp /opt/embedded/armlinux/busybox-1.1.3/examples/inittab \
  /opt/embedded/armlinux/ep7312/rootfs/etc   
 从inittab文件中,可以看到init程序自动启动/etc/init.d/rcS脚本,那么我们需要因此创建一个
 mkdir  init.d;
 cd init.d
 vi rcS;
 chmod +x rcS;
rcS脚本内容如下:
 #!/bin/sh
 hostname ARMLinux#设置主机名字
 mount -t proc proc /proc#挂载proc文件系统
 cat /etc/motd#显示欢迎信息
i.其他准备
 1.随便在/etc目录下创建一个motd文件(message of today)如
#####################################################
Welcome to
    ARMLinux linux-2.4.13 -patched for ep7312)
        ARMLinux for skyey
     

####################################################

 2.[/rootfs]mkdir proc lib var var/tmp;
    [/rootfs]ln -s /var/tmp tmp
 3.文件系统的配置文件/etc/fstab
内容如下
 proc /proc proc defaults 0 0
 
 五、生成romfs类型的目标根文件系统映像
genromfs工具下载

用法:
$sudo genromfs -d rootfs -f rd.romfs
 
六、运行带romfs文件系统的内核
a.更改skyeye.conf配置文件
 
 #skyeye config file for ep7312
cpu: arm720t
mach: ep7312
mem_bank: map=I, type=RW, addr=0x80000000, size=0x00010000
mem_bank: map=M, type=RW, addr=0xc0000000, size=0x00200000
mem_bank: map=M, type=R, addr=0xc0000, size=0x340000,file=./rd.romfs
mem_bank: map=M, type=RW, addr=0xc0600000, size=0x00c00000
k.再次运行skyeye
 skyeye -e vmlinux;(-e:表示运行elf格式的镜像)
# [qkshan /opt/embedded/armlinux/ep7312]$skyeye -e vmlinux
Your elf file is little endian.
arch: arm
cpu info: armv4, arm720t, 41807200, ffffff00, 1
mach info: name ep7312, mach_init addr 0x80683c0
uart_mod:0, desc_in:, desc_out:, converter:
SKYEYE: use arm7100 mmu ops
Loaded ROM   ./rd.romfs
exec file "vmlinux"'s format is elf32-little.
load section .init: addr = 0xc0028000  size = 0x0000e000.
load section .text: addr = 0xc0036000  size = 0x001095e8.
load section __ex_table: addr = 0xc013f5f0  size = 0x000007c0.
not load section __ksymtab: addr = 0xc013fdb0  size = 0x00000000 .
load section .data: addr = 0xc0140000  size = 0x0000a6fb.
not load section .bss: addr = 0xc014a700  size = 0x0002a994 .
not load section .stab: addr = 0x00000000  size = 0x0035d9e4 .
not load section .stabstr: addr = 0x00000000  size = 0x000f35ba .
not load section .comment: addr = 0x00000000  size = 0x000027ee .
call ARMul_InitSymTable,kernel filename is vmlinux.
start addr is set to 0xc0028000 by exec file.
Linux version 2.4.13-ac4-rmk1 (
) (gcc version 2.95.3 20010315 (release)) #5 Tue Mar 24 14:56:59 CST 2009
Processor: ARM ARM720T revision 0
Architecture: Cirrus Logic EDB7312 (EP7312 evaluation board)
Warning: bad configuration page, trying to continue
On node 0 totalpages: 4096
zone(0): 4096 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line:
Calibrating delay loop... 26.00 BogoMIPS
Memory: 16MB = 16MB total
Memory: 14608KB available (1061K code, 214K data, 56K init)
Dentry-cache hash table entries: 2048 (order: 2, 16384 bytes)
Inode-cache hash table entries: 1024 (order: 1, 8192 bytes)
Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 4096 (order: 2, 16384 bytes)
POSIX conformance testing by UNIFIX
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Starting kswapd v1.8
pty: 256 Unix98 ptys configured
block: queued sectors max/low 9616kB/3205kB, 64 slots per queue
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
cs89x0:cs89x0_probe(0x0)
Bus write error, can not find corresponding bank for addr 0x2000000a,pc=0xc0030bd4
Bus read error, can not find corresponding bank for addr 0x2000000a,pc=0xc0030bd8
PP_addr=0x80550bc
Bus read error, can not find corresponding bank for addr 0x2000000c,pc=0xc0030be8
Bus read error, can not find corresponding bank for addr 0x2000000c,pc=0xc0030bf8
eth0: incorrect signature 0xc0030bf0
cs89x0: no cs8900 or cs8920 detected.  Be sure to disable PnP with SETUP
Blkmem copyright 1998,1999 D. Jeff Dionne
Blkmem copyright 1998 Kenneth Albanowski
Blkmem 1 disk images:
0: FB0C0000-FB2E23FF [VIRTUAL FB0C0000-FB2E23FF] (RO)
Can't allocate major number 31 for Memory Technology Devices.
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 1024 bind 1024)
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
NetWinder Floating Point Emulator V0.95 (c) 1998-1999 Rebel.com
VFS: Mounted root (romfs filesystem).
Freeing init memory: 56K
init started:  BusyBox v1.1.3 (2009.03.24-10:19+0000) multi-call binary
Starting pid 10, console /dev/console: '/etc/init.d/rcS'
#####################################################
Welcome to
    ARMLinux linux-2.4.13 -patched for ep7312)
        ARMLinux for skyey
####################################################
Please press Enter to activate this console.
Starting pid 14, console /dev/console: '/bin/sh'

BusyBox v1.1.3 (2009.03.24-10:19+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.
-sh: can't access tty; job control turned off
# ls
bin       etc       linuxrc   rd.romfs  tmp       var
dev       lib       proc      sbin      usr

[END]
至此,我们已经构建了一个可以在SkyEye EP7312模拟器上正确运行的ARM linux内核和ROMFS根文件系统;当然这只是个简单的系统,根据需要还需对内核和文件系统内容做适当修改。
阅读(2247) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~