ARM内核编译以及最小文件系统

编译内核

  • 简介
    • 编译内核
    • 制作最小根文件系统
      • 创建以下的文件
      • 添加rcS文件
      • 添加fstab文件
      • 添加inittab文件
      • 添加设备节点
      • 制作镜像
        • jffs文件系统镜像
  • qemu 运行内核
    • 复制动态库
  • 参考资料

简介

本篇文章展示了编译ARM内核,利用busybox制作最小根文件系统。

编译内核

linux-4.4.205.tar.xz下载

tar -xvf linux-4.4.205.tar.xz
  • 修改Makefile文件
root@iZ2zeha39b7w1ayiu8hv9rZ:~/run_linux/test_linux/linux-4.4.205# sed -n '257,258p' Makefile
ARCH             = arm
CROSS_COMPILE    = arm-linux-gnueabi-

# 写默认配置
root@iZ2zeha39b7w1ayiu8hv9rZ:~/run_linux/test_linux/linux-4.4.205# make vexpress_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
#
# configuration written to .config
#
  • 修改配置
make menuconfig
General setup  --->
    [ ] Initial RAM filesystem and RAM disk (initramfs/initrd) support
# 清空启动时候的命令程序
Boot options  ---> 
	()  Default kernel command string
# 设置内核空间的分布
Kernel Features  --->
	Memory split (3G/1G user/kernel split)  --->
		(X) 3G/1G user/kernel split
# 开始编译
make bzImage -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
Kernel: arch/arm/boot/Image is ready
Kernel: arch/arm/boot/Image is ready
Kernel: arch/arm/boot/zImage is ready
make dtbs  ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-

制作最小根文件系统

  • busybox-1.28.0.tar.bz2
    修改为使用静态的库文件
root@zhou ~/ru/te/busybox-1.28.0#  make menuconfig
Settings  --->
	[*] Build static binary (no shared libs)
  • 开始编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- CONFIG_PREFIX=/root/run_linux/roofs install 

编译成完成以后,可以查看到多出下面几个文件

ls
bin  linuxrc  sbin  usr

创建以下的文件

root@zhou ~/ru/roofs#  mkdir etc 
root@zhou ~/ru/roofs#  mkdir dev 
root@zhou ~/ru/roofs#  mkdir mnt 
root@zhou ~/ru/roofs#  mkdir -p etc/init.d/

添加rcS文件

root@zhou ~/ru/roofs#  cat etc/init.d/rcS 
mkdir -p /proc
mkdir -p /tmp
mkdir -p /sys
mkdir -p /mnt
/bin/mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mount -t 9p -o trans=virtio kmod_mount /mnt
mdev -s

添加执行权限

root@zhou ~/ru/roofs#  chmod +x etc/init.d/rcS

添加fstab文件

root@zhou ~/ru/roofs#  touch etc/fstab
root@zhou ~/ru/roofs#  cat etc/fstab 
#                                    
# device:指定加载的磁盘分区或移动文件系统,除了指定设备文件外,也可以使用UUID、LABEL来指定分区;
# dir:指定挂载点的路径;
# type:指定文件系统的类型,如ext3,ext4等;
# options:指定挂载的选项,默认为defaults,其他可用选项包括acl,noauto,ro等等;
# dump:表示该挂载后的文件系统能否被dump备份命令作用;0表示不能,1表示每天都进行dump备份,2表示不定期进行dump操作。
# pass:表示开机过程中是否校验扇区;0表示不要校验,1表示优先校验(一般为根目录),2表示为在1级别校验完后再进行校验;

#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
var		/dev		tmpfs	defaults		0	0
ramfs		/dev		ramfs	defaults		0	0
debugfs		/sys/kernel/debug	debugfs		defaults	0	0

添加inittab文件

root@zhou ~/ru/roofs#  touch etc/inittab  
root@zhou ~/ru/roofs#  cat etc/inittab 
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r

添加设备节点

root@zhou ~/ru/roofs#  cd dev 
root@zhou ~/ru/ro/dev#  mknod console c 5 1
root@zhou ~/ru/ro/dev#  mknod null c 1 3 

制作镜像

jffs文件系统镜像

  • 制作
  • 挂载
    -Mounting JFFS2 Images on a Linux PC
    由于jffs2 不能直接 使用 loop挂载。因此需要使用其他的方法
  • 首先清楚以前挂载的设备
# cleanup if necessary
umount /dev/mtdblock0 &>/dev/null
modprobe -r mtdram &>/dev/null
modprobe -r mtdblock &>/dev/null
  • 开始制作一个mtd的设备并挂载
modprobe mtdram total_size=32768 erase_size=256 || exit 1
dd if=roofs.jffs of=/dev/mtdblock0

qemu 运行内核

root@zhou ~/run_linux#  apt-get install qemu-system-arm
  • 运行内核
qemu-system-arm -M vexpress-a9 -smp 4 -m 200M -kernel \
	arch/arm/boot/zImage \
	-append "rdinit=/linuxrc console=ttyAMA0 loglevel=9" -dtb \
	arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic 
  • 运行内核以及文件系统
qemu-system-arm -M vexpress-a9 -smp 4 -m 200M -kernel \
	arch/arm/boot/zImage \
	-append "rdinit=/linuxrc console=ttyAMA0 loglevel=9" -dtb \
	arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic 

至于为什么 console=ttyAMA0会是这个值,需要在编译内核的根文件下,查看 .config文件

CONFIG_CMDLINE="console=ttyAMA0"

复制动态库

由于需要跑程序,当然少不了动态库了
随便选择一个标准库

locate libm.so 
/lib/x86_64-linux-gnu/libm.so.6
/lib32/libm.so.6
/libx32/libm.so.6
/usr/arm-linux-gnueabi/lib/libm.so
/usr/arm-linux-gnueabi/lib/libm.so.6
/usr/arm-linux-gnueabihf/libsf/libm.so
/usr/arm-linux-gnueabihf/libsf/libm.so.6
/usr/lib/x86_64-linux-gnu/libm.so
/usr/lib32/libm.so
/usr/libx32/libm.so

确定了对应的编译器对应的库
将其复制到根文件系统lib文件夹下面即可

cp  /usr/arm-linux-gnueabi/lib/*.so* /ptah-to-fs/lib   -d

参考资料

  • 奔跑吧内核资料
  • 从零使用qemu模拟器搭建arm运行环境
  • 实验指导手册 - 奔跑吧Linux内核-v1.3公开版.pdf
  • Mounting JFFS2 Images on a Linux PC

你可能感兴趣的:(linux,u-boot)