嵌入式系统
1 嵌入式系统组成
BootLoader、内核、根目录文件系统
2 BootLoader
uboot是嵌入式启动程序BootLoader的业界老大,所以一般都用uboot。
操作之前先make distclean以前的配置项。
2.1 配置uboot
Uboot编译后要告诉映像运行在什么系统体系上。配置要在Makefile文件上进行,vim Makefile打开Makefile,如果是210开发板直接搜索 “/210”,然后通过next查询其他有用信息。查询跟开发板匹配的配置项,比如“tq210”;
配置完成
2.2 编译uboot
make ARCH=arm CROSS_COMPILE=arm-linux-
编译完成后会生成一个uboot.bin 文件,是要烧写到开发板运行的;是一个二进制映像。
2.3 下载并运行
3 内核
3.1 内核配置(X86为例)
为啥配置内核:通过软件需求和硬件需求,选出需要的、去掉不用的。硬件方面:比如是arm体系,x86就没用就不选;软件方面:比如是ipv4,选ipv6就没用。
配置内核的方法:
make config:基于文本模式的交互式配置
make menuconfig:基于文本模式的菜单型配置(用这种方法方便、快捷)
选项菜单:
三种选择方式:<>、<*>、<M>
<>:此次编译不选择该功能;
<M>:module(内核模块)
<*>:
内核映像文件最终运行在内存中,系统启动,BootLoader会将zIMage解压到内存里,在内存里面运行。
配置完成后用:ls –a查看 (a就是all)可以看到隐藏的文件,其中.config就是保存的配置文件。
查看内容:vim .config
CONFIG:固定的标准格式;LOCALVERSION:配置项的名字;y=yes相当于<*>;没有配置的加'#',加'is not set';
如何加载一个已有的配置文件,然后在其上面做修改?
(Linux本身的配置文件在/boot/config-4.15.0-45-generic),找到一个配置文件config-4.15.0-45-generic复制到当前目录下,然后make menuconfig -> load -> '文件路径文件名'(例如当前w文件下的路径就是"./config-4.15.0-45-generic") -> ok;
3.2 编译内核
3.2.1 编译内核生成镜像文件
make zImage:主要用于小于512K
make bzImage:
make bzImage V=1 :查看编译的详细信息
编译好的内核位于arch/<cpu>/boot/目录下
3.2.2 编译内核模块(<M>产生内核模块)
make modules:内核模块散落在各个文件中,.ko文件就是内核模块,查看方式ls *.ko;
make modules_install:要把内核模块放到/lib/modules目录下面。使用操作:make modules_install会把散落的文件移动到/lib/modules目录下。
3.3 制作init ramdisk(即将所有内核模块打包为一个文件)
命令:mkinitrd initrd-$version $version
例子:mkinitrd initrd-2.6.32 2.6.32
initrd-2.6.32 打包成文件的名字
$version 为通过make modules_install移动到一个文件夹的内核模块文件的文件名,可以通过查询/lib/modules下的目录得到。
3.4 安装内核
将映像文件和打包好的modules文件复制到boot目录下,Linux启动的时候BootLoader会到boot目录下找文件。
3.4.1 复制zImage镜像文件到boot中
cp arch/x86/boot/bzImage /boot/vmlinuz-$version 取得名字
3.4.2 复制moduls文件到boot文件中
cp initrd-$version /boot/
3.4.3 修改/etc/grub.conf /*这是启动的配置文件*/
保存后重新启动Linux系统。启动时有一个倒计时的地方,然后立即按下F12(戴尔),可以选择系统要启动内核。
启动完成后:
用 uname –r 命令:查看正在运行的内核版本。
内核运行在内存
文件系统存放在硬盘或者开发板的flash
3.5 清理内核
要清楚编译内核的时候产生了什么。配置时产生了.config文件;编译的时候产生了.o文件,汇总成了bzImage;还产生一些.ko文件
make clean:清理.o文件,没有清除掉.config文件,
ls /drivers/net 可以看到有很多.ko文件
make distclean 可以清除掉配置文件也可以清除掉.o文件
4 嵌入式Linux内核制作
制作嵌入式平台使用的Linux内核,方法和制作PC平台的Linux内核基本一致;
4.1 复制解压一个Linux内核代码
4.2 make distclean 清除以前的配置项
4.3 配置内核:make menuconfig ARCH=arm
4.4 编译内核:make uImage ARCH=arm CROSS_COMPILE=arm-linux-
如果报错:将tools中的mkimage文件复制到bin文件夹,然后在重新编译;
然后将uImage.bin文件复制到根目录下的tftpboot文件夹下。然后通过serial com下载到目标板
编译完成后生成的uImage文件在/arch/arm/boot/中可看到
5 根文件系统的制作
5.1 建立根文件系统目录与文件
5.1.1 创建目录
先创建一个目录然后进入
mkdir rootfs
cd rootfs
然后批量的创建开发板需要的以下目录:
mkdir bin devetc lib proc sbin sys usr mnt tmp var
mkdir usr/bin usr/lib usr/sbin lib/modules
5.1.2 创建设备文件(只能在root模式下创建)
cd rootfs/dev
mknod -m 666 console c 5 1
mknod -m 666 null c 1 3
5.1.3 加入配置文件
将etc.tar.gz中的文件解压后都复制到etc文件中。
5.1.4 添加内核模块
cd …/mini2440 /*进入可以编译内核的文件夹*/ (即mini240的内核制作的文件夹)
make modules ARCH=arm CROSS_COMPILE=arm-linux-
make modules_install ARCH=arm INSTALL_MOD_PATH=…/rootfs
粉色处为路径:home/dongry/rootfs
5.1.5 解压后进入busybox文件并配置、编译、安装busybox:
make menuconfig:进入配置界面
进入Busybox Settings àbuild Options->选中“Build busybox as astatic binary”,静态链接
进入Cross Compiler prefix改为(arm-linux-)
进入Installation Options->选中“Don‘t use /usr”,选中该项可以避免busybox被安装到宿主系统的/usr目录下,破坏宿主系统
进入Busybox Installation Prefix改路径(/xxx/rootfs),该选项表明编译后的busybox的安装位置
编译busybox:make
安装busybox:make install
5.2 挂载根文件系统
根据存储设备的硬件特性、系统需求,不同的文件系统类型有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为RAM和FLASH,常用的基于存储设备的文件系统类型包括:jffs2, yaffs2, ubifs, ramdisk等
5.2.1 initramfs方式
软连接
ln –s ./bin/busybox init /*-s:软链接; init:软连接名字*/
进入内核文件
make menuconfig ARCH=arm
general setup-><*>Initial RAM filesystem and RAM disk (initramfs/initrd) support
然后在Initramfs source file(s)处添加rootfs的路径
配置完成后重新编译内核:make uImage ARCH=arm CROSS_COMPILE=arm-linux-
因为文件系统是挂载到内核上的,所以需要重新编译内核
5.2.2 NFS方式
此种方式的特点:当文件系统需要重新添加一个文件的时候,initarmfs还得需要重新编译内核,而NFS方式是直接通过网络连接的会直接反馈到系统上,不需要重新编译内核。
内核配置:make menuconfig ARCH=arm
取消掉上边方式的配置项,并退出;
进入file system->networking file systems->保证root file system on nfs被选中,退出保存
然后进行内核编译:make uImage ARCH=arm CROSS_COMPILE=arm-linux-
因为文件系统是挂载到内核上的,所以需要重新编译内核。