本篇文章展示了编译ARM内核,利用busybox制作最小根文件系统。
linux-4.4.205.tar.xz下载
tar -xvf linux-4.4.205.tar.xz
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-
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/
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
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
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
# cleanup if necessary
umount /dev/mtdblock0 &>/dev/null
modprobe -r mtdram &>/dev/null
modprobe -r mtdblock &>/dev/null
modprobe mtdram total_size=32768 erase_size=256 || exit 1
dd if=roofs.jffs of=/dev/mtdblock0
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