配置树莓派linux的内核和编译并将镜像拷贝至树莓派
驅動代碼的編寫需要一個提前編譯好的內核,編譯內核就必須配置,配置的最終目標會生成.config文件,該文件指導makefile去把有用的東西組織成內核。
如何生成.config文件:
第一種方式:
廠家配linux內核源碼,比如說買了樹莓派,現在要研發樹莓派的底層,廠家會提供樹莓派linux內核源碼,直接cp ?? 廠家.config ?? .config
第二種方式:
make menuconfig 一項項配置,通常是基于廠家的config來配置的。
第三種方式:
完全自己來
如何配置樹莓派linux的內核:
1、配置config
linux源碼中有很多工程:
樹莓派1的工程是bcmrpi_defconfig;
樹莓派2、3的工程是bcm2709_defconfig。
1.1、獲取當前樹莓派的config
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig //ARCH是指定是arm架構 //CROSS_COMPILE指定編譯器是arm-linux-gnueabihf-(不同架構用不同的編譯器) //KERNEL是樹莓派里特別指定的 //用的config是bcm2709_defconfig運行結果如下圖:
feng@ubuntu:~/SYSTEM/linux-rpi-4.14.y$ ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfigHOSTCC scripts/basic/fixdepHOSTCC scripts/kconfig/conf.oSHIPPED scripts/kconfig/zconf.tab.cSHIPPED scripts/kconfig/zconf.lex.cHOSTCC scripts/kconfig/zconf.tab.oHOSTLD scripts/kconfig/conf # # configuration written to .config//將廠家的config變成了.config #此命令功能是獲取bcm2709_defconfig的配置到 .config里。
我們可以直接用工程里的配置,但這樣的話可能會丟失原來使用的樹莓派的配置,這里提供一個方法可以獲取當前正在使用的樹莓派的config。
出現上圖內核配置已完成!下一步內核的編譯。
編譯:
安裝必要的庫:
1、執行menuconfig
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig如果沒什么改的就不用執行這一步。
2、編譯
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs //-j4指定用多少電腦資源來編譯,4是4進程。 //zImage是生成內核鏡像 //modules要生成驅動模塊 //dtbs是生成配置文件以n進程編譯。不指明幾進程的話則默認以單進程編譯,編譯成功后,看到源碼樹多了vmlinux(沒有壓縮的linux),失敗則無此文件,成功后目標文件zImage鏡像在arch/arm/boot底下。
3、打包zImage文件成樹莓派可用的xxx.img
直接用linux源碼包里的工具:
在本目錄生成一個kernel_new.img文件,這個文件就是要放到sd卡中的文件。
注:網上很多地方說的用 tools/mkimage/imagetool-uncompressd.py 的方法不行!!
鏡像的拷貝:
一、掛載樹莓派sd卡,并安裝編譯出的DIRECTLY 到sd卡
把樹莓派的sd卡插入ubuntu系統電腦,樹莓派的sd卡有兩個分區:
一個fat分區,是boot相關的內容,kernel的img文件就放在這個分區里;
一個是ext4分區,也就是系統的根目錄分區。
我們生成的文件涉及到這兩個分區的內容,一般插入ubuntu后會自動掛載,fat分區可以不用root權限操作,ext4分區需要root權限操作。
兩個分區具體掛載在什么地方可以自己決定,以下用[fat]表示boot掛載的路徑,[ext4]表示ext4掛載的路徑。
二、掛載
插入sd卡輸入dmesg去查看內核的信息,如有設備接入,內核會打印一些驅動方面的信息,如圖:會看到兩個分區,sdb1和sdb2
數據拷貝:
mkdir data1 mkdir data2 //創建兩個文件夾,對應stb1和stb2掛載U盤:
sudo mount /dev/sdb1 data1 一個是fat分區,是boot相關的內容,kernel的img sudo mount /dev/sdb2 data2 一個是ext4分區,也就是系統的根目錄分區 //將dev下的sdb1和sdb2分別掛載到data1和data2如圖,可以看到sd卡中的文件以掛載到data1和data2:
三、開始拷貝
1、安裝modules(也是編譯生成的,主要是設備驅動文件,比如:hdmi,usb,wifi…)
安裝后如圖:
2、可以考慮先備份(防止拷貝失敗,樹莓派不能開機)如圖:
然后更新 kernel.img 文件,再將新生成的鏡像文件拷貝到data1,其名為kernel7.img,將原來的(kernel7.img)覆蓋掉,前面已經用 mkknlimg 工具打包了kernel_new.img文件了,把它復制到boot分區并配置使用即可:
cp kernel_new.img [fat]/3、復制其他相關文件(這些是配置文件,為了能夠加載驅動等)
cp arch/arm/boot/dts/.*dtb* [fat]/ cp arch/arm/boot/dts/overlays/.*dtb* [fat]/overlays/ cp arch/arm/boot/dts/overlays/README [fat]/overlays/ //*dtb*中的*是通配符就是以.開頭以dtb在中間這種形式的文件,.和dtb之間的東西不管,dtb后有什么字符也不管。更新完成后插回樹莓派即可開機,可以通過串口開機(可以看操作系統是否起來了),開機后可以用 uname -a 命令查看kernel信息已經改變。
驅動加載的兩種方式:
- *??編譯內核 ????zImage包含了驅動
- M??模塊方式生成驅動文件xxx.ko????系統啟動后,通過命令inmosd??xxx.ko加載
指令補充:
dmesg //查看硬件底層的一些連接數據 feng@ubuntu:~/SYSTEM/linux-rpi-4.14.y$ du kernel_new.img 4828 kernel_new.img feng@ubuntu:~/SYSTEM/linux-rpi-4.14.y$ du kernel_new.img -h 4.8M kernel_new.img feng@ubuntu:~/SYSTEM/linux-rpi-4.14.y$ md5sum kernel_new.img 6350420d173bddfe02f4d8f81791e91f kernel_new.img feng@ubuntu:~/SYSTEM/linux-rpi-4.14.y$ md5sum /home/feng/data1/kernel7.img 6350420d173bddfe02f4d8f81791e91f /home/feng/data1/kernel7.img feng@ubuntu:~/SYSTEM/linux-rpi-4.14.y$ //du指令查看文件的大小,-h是以兆為單位顯示 //每個文件都有它唯一的的編碼號就是md5sum的值,在拷貝時若發生損壞則md5sum的值會發生改變,可以用其驗證是否烤壞。參考博文:https://blog.csdn.net/nicekwell/article/details/78482833
總結
以上是生活随笔為你收集整理的配置树莓派linux的内核和编译并将镜像拷贝至树莓派的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java学习(145):file常用方法
- 下一篇: NTSD详解