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-
由於文件系統是掛載到內核上的,因此須要從新編譯內核。