一、编译Linux内核
下载Linux内核
推荐使用国内的镜像网站下载
下载完成后解压
修改Makefile
搜索CROSS_COMPILE交叉编译
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabi-
进入/arch/arm/查看官方支持的开发板
找到有我们的开发板
进入configs 这里面保存着对不同板子的config
编译
先生成.config
make vexpress_defconfig
当前内核的配置文件
make zImage -j4 4线程编译
编译完成
编译内核模块
make modules -j4
编译dts文件
make dtbs
进入/arch/arm/boot
dts文件夹中存放了各种开发板的dts文件
运行内核
qemu-system-arm -M vexpress-a9 \
-m 512m \
-kernel arch/arm/boot/zImage \
-dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-nographic \
-append "console=ttyAMA0"
说明编译成功,没有根文件系统
如何关闭
打开另外一个中断
ps -a
kill qemu的PID
便捷的方式,建立一个boot.sh的脚本
然后chmod a+x boot.sh
每次要启动时./boot.sh即可
二、使用busybox制作根文件系统
文件系统
对存储设备上的数据进行组织的机制
为什么要使用文件系统
Linux的哲学:一切皆文件
用户与操作系统进行交互的主要工具:文件系统调用
用户和底层存储的接口
根文件系统
Linux内核启动后第一个挂载的文件系统
主要由基本的shell命令、各种库、字符设备、配置脚本组成
提供了根目录/
RFS可以放在:nor/nand flash、SD卡、磁盘、网络空间上
什么是busybox
一个集成100多个Linux常用命令和工具的软件
一个适合制作嵌入式文件系统的软件工具
编译安装
下载
去官网下载
修改Makefile
找CROSS_COMPILE
CROSS_COMPILE ?= arm-linux-gnueabi-
找ARCH
ARCH ?= arm
配置
先make defconfig
进行图形化配置:make menuconfig
注意设置:Setting-》Build Options-》[*] Build static binary (no shared libs)
编译为一个静态的库
编译
make -j4
安装
make install
查看./_install 目录
进入bin
是我们一些常用的命令
进入sbin
root用户的命令
进入usr
命令及命令的软链接
关于linuxrc
这是一个启动脚本
制作根文件系统
mkdir rootfs ; cd rootfs
mkdir lib
cp -r busybox-1.30.1/_install/* rootfs/
cp -p /usr/arm-linux-gnueabi/lib/* rootfs/lib/
创建一个名为rootfs,然后在文件夹下创建lib文件夹,将刚才busybox的_install目录全复制到rootfs下,再将交叉编译库复制到/rootfs/lib
再创建一个存放设备的dev文件夹
cd rootfs/ ; mkdir dev ; cd dev
创建串口节点
mknod -m 666 tty1 c 4 1
mknod -m 666 tty2 c 4 2
mknod -m 666 tty3 c 4 3
mknod -m 666 tty4 c 4 4
创建控制台节点
mknod -m 666 console c 5 1
创建null节点
mknod -m 666 null c 1 3
制作SD卡文件系统镜像
生成镜像
dd if=/dev/zero of=rootfs.ext3 bs=1M count=32
我们就可以把rootfs.ext3看做是SD卡
格式化为ext3文件系统
mkfs.ext3 rootfs.ext3
将各种文件拷贝到文件系统镜像中
先挂载
mount -t ext3 rootfs.ext3 /mnt/ -o loop
拷贝
cp -r rootfs/* /mnt/
卸载
umount /mnt/
启动内核,挂载rootfs
修改启动脚本
qemu-system-arm \
-M vexpress-a9 \
-m 512m \
-kernel linux-4.4.76/arch/arm/boot/zImage \
-dtb linux-4.4.76/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-nographic \
-append "root=/dev/mmcblk0 rw console=ttyAMA0" \
-sd rootfs.ext3
运行脚本
解决此问题
原因:一个根文件系统由许多文件组成,比如/etc /var /home等等,我们这是一个最简单的根文件系统
解决:创建一个这个脚本
mkdir etc ; cd /etc ; mkdir init.d ; cd init.d ; touch rcS
chmod a+x rcS
vi rcS
重启
可以通过修改rootfs文件夹然重新拷贝到SD卡