有点繁琐,整理一下,系统环境centos6.6,虚拟机以及实际系统中测试通过。

一、交叉编译器的下载与安装
1、下载地址:

下载其中的解压版。

2、然后解压缩


tar jxvf arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2



 

3、添加环境变量,假定压缩包所在目录为/home,解压后目录为arm-2014.05。



vim /etc/profile



 

在最下面添加



export PATH=$PATH:/home/arm-2014.05/bin



 然后更新



source /etc/profile



 

4、测试是否安装成功



arm-none-linux-gnueabi-gcc -v



 

二、qemu的安装

参考网站



wget https://download.qemu.org/qemu-2.11.0.tar.xz

tar xvJf qemu-2.11.0.tar.xz

cd qemu-2.11.0

./configure

make -j8

make install



 

说明:
$./configure --enable-kvm --enable-debug --enable-vnc --enable-werror  --target-list=arm-softmmu --audio-drv-list=
configure脚本用于生成Makefile,其选项可以用./configure --help查看。这里使用到的选项含义如下:
--enable-kvm:编译KVM模块,使QEMU可以利用KVM来访问硬件提供的虚拟化服务。
--enable-vnc:启用VNC。
--enalbe-werror:编译时,将所有的警告当作错误处理。
--target-list:选择目标机器的架构。默认是将所有的架构都编译,但为了更快的完成编译,指定需要的架构即可。


三、uboot安装

参考网站

1、源文件下载http://ftp.denx.de/pub/u-boot/

2、解压源文件 



tar jvxf u-boot-2018.01.tar.bz2 -C xxxx  (xxx为需要解压的目录)



 

3. 进入U-Boot 源文件目录,然后执行:
               



export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make vexpress_ca9x4_defconfig
make



编译完成后,如果目录下生成 u-boot 文件,则说明编译成功。

 

4. 在U-Boot源码目录下编写脚本 run.sh
               



qemu-system-arm \
                -M vexpress-a9 \
                    -nographic \
                    -m 512M \
                    -kernel u-boot



 

然后 chmod +x run.sh 增加文件执行权限。

5. 最后执行  ./run.sh,可以看到启动了bootloader,但是会提示没有映像文件

四、内核编译

参考博文

内核源码下载地址:https://www.kernel.org/pub/linux/kernel/v4.x/

1、从arch/arm/configs下找到需要编译内核的配置文件vexpress_defconfig,复制到源码根目录下

2、执行命令      



export ARCH=arm
                export CROSS_COMPILE=arm-none-linux-gnueabi-
                make vexpress_defconfig
                make zImage
                make modules
                make dtbs



 

3、编译后生成 在 arch/arm/boot 目录下生成 zImage 文件,则说明编译成功。

五、编译busybox,目的是制作根文件系统

1、从https://busybox.net/downloads/下载busybox

2、进入 Busybox 源文件目录下执行 make menuconfig,如果报错,则yum list *ncurses*,然后安装列出来的东西
 



Busybox Settings  --->  
            [*] Build BusyBox as a static binary (no shared libs)  
            (arm-none-linux-gnueabi-) Cross Compiler prefix



 

3、编译
 



make
make install




_install 目录下生成 需要的文件 bin linuxrc sbin usr 。

六、根文件系统制作

1、创建一个空白文件,32M
 



dd if=/dev/zero of=a9rootfs.ext3  bs=1M  count=32



 

2、格式化
  



mkfs.ext3 a9rootfs.ext3



 

3、创建根文件系统目录
  



mkdir rootfs



 

4、拷贝busybox下的文件
 



cp busybox-1.20.2/_install/* -r  rootfs/



 

5、拷贝交叉编译器的lib
  



mkdir rootfs/lib/
   cp -P /xxx/arm-none-linux-gnueabi/lib/* rootfs/lib/



 

6、创建终端设备
  



mkdir rootfs/dev/
   mknod rootfs/dev/tty1  c 4  1
   mknod rootfs/dev/tty2  c 4  2
   mknod rootfs/dev/tty3 c 4 3
   mknod rootfs/dev/tty4 c 4 4
   mknod rootfs/dev/console c 5 1
   mknod rootfs/dev/null c 1 3



 

7、创建必要目录
  



mkdir -p rootfs/proc/
   mkdir -p rootfs/sys/
   mkdir -p rootfs/tmp/
   mkdir -p rootfs/root/
   mkdir -p rootfs/var/
   mkdir -p rootfs/mnt/



 

8、创建临时目录并与空白文件映射,目的是将根文件系统拷贝进去
  



mkdir tmpfs
   mount  -t ext3  a9rootfs.ext3  tmpfs/ -o  loop
   rootfs/* tmpfs/  -r
   umount tmpfs



 

建立一个目录,将zImage,vexpress-v2p-ca9.dtb,_install目录拷贝在一个目录下

vim mkrootfs.sh



1 rm -rf rootfs
 2 rm -rf tmpfs
 3 rm -f a9rootfs.ext3
 4 
 5 mkdir rootfs
 6 cp ./_install/* rootfs/ -raf
 7 mkdir -p rootfs/proc/
 8 mkdir -p rootfs/sys/
 9 mkdir -p rootfs/tmp/
10 mkdir -p rootfs/root/
11 mkdir -p rootfs/var/
12 mkdir -p rootfs/mnt/
13 
14 cp -arf /home/yuanlj/arm-2014.05/arm-none-linux-gnueabi/lib rootfs/
15 rm rootfs/lib/*.a
16 arm-none-linux-gnueabi-strip rootfs/lib/*
17 
18 mkdir -p rootfs/dev/
19 mknod rootfs/dev/tty1  c 4  1
20 mknod rootfs/dev/tty2  c 4  2
21 mknod rootfs/dev/tty3 c 4 3
22 mknod rootfs/dev/tty4 c 4 4
23 mknod rootfs/dev/console c 5 1
24 mknod rootfs/dev/null c 1 3
25 
26 dd if=/dev/zero of=a9rootfs.ext3  bs=1M  count=32
27 mkfs.ext3 a9rootfs.ext3
28 
29 mkdir -p tmpfs
30 mount  -t ext3  a9rootfs.ext3  tmpfs/ -o  loop
31 cp -r rootfs/*  tmpfs/
32 umount tmpfs



 

七、启动



qemu-system-arm  -nographic -sd a9rootfs.ext3 -M vexpress-a9 -m 512M -kernel zImage -dtb vexpress-v2p-ca9.dtb -append "init=/linuxrc root=/dev/mmcblk0 rw rootwait earlyprintk console=ttyAMA0"  
qemu-system-arm  -serial stdio -sd a9rootfs.ext3 -M vexpress-a9 -m 512M -kernel zImage -dtb vexpress-v2p-ca9.dtb -append "init=/linuxrc root=/dev/mmcblk0 rw rootwait earlyprintk console=ttyAMA0"



 

注意:
1、以上在编译前请确保export ARCH=arm ;export CROSS_COMPILE=arm-none-linux-gnueabi-

2、若报错,一般是某些库没有包含,自行百度或google