1 嵌入式系统组成linux
BootLoader、内核、根目录文件系统vim
2 BootLoader网络
uboot是嵌入式启动程序BootLoader的业界老大,因此通常都用uboot。ui
操做以前先make distclean之前的配置项。spa
2.1 配置uboot3d
Uboot编译后要告诉映像运行在什么系统体系上。配置要在Makefile文件上进行,vim Makefile打开Makefile,若是是210开发板直接搜索 “/210”,而后经过next查询其余有用信息。查询跟开发板匹配的配置项,好比“tq210”;blog
配置完成ip
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-
由于文件系统是挂载到内核上的,因此须要从新编译内核。