再戰樹莓派內核編譯

最近想學習ARM9,板子還沒到,先拿樹莓派體驗一下,之前看教程編譯過一次,這一次想寫的更加詳細一點。html

我不是技術的生產者,我只是技術的搬運工。linux

如下全部知識均來至網絡上的高手分享的。git

全部連接以下:github

 

 

感謝前輩們的無私分享。網絡

 

說一下用到的全部軟硬件。工具

操做系統:Ubuntu15.04(64) win7(64)學習

樹莓派:B+,Raspbian測試

FileZillaes5

 

 

開始:先看看樹莓派IPspa

先看一下樹莓派上要作的:

先燒好系統,把配置文件 複製到 /home/pi 路徑下,順便看看內核版本。

uname -a

sudo cp /proc/config.gz .

樹莓派上要作的就這些,

看下Ubuntu 要作的 (用的最新版本 15.04 因此有些問題要解決)

先下載 樹莓派 的 源碼、工具和固件。

如下操做均在 root 權限下進行 注意 路徑!!

在 /home/你的用戶名 建立文件夾 名稱自定

mkdir rpi

cd rpi

git clone git://github.com/raspberrypi/firmware.git PRiFirmware 固件

git clone git://github.com/raspberrypi/tools.git RpiTools 工具

wget https://github.com/raspberrypi/linux/archive/rpi-3.18.y.tar.gz

源碼 剛纔咱們看到咱們燒寫的鏡像也是3.18的 因此這裏也下載3.18的

 

全部的工具源碼下載完畢後,解壓下載的源碼

tarxvfz rpi-3.18.y.tar.gz

順便換個名字

mv rpi-3.6.y RpiLinux

接下來把剛纔備份的 配置文件 config.gz 複製到 Ubuntu上來

192.168.1.31 是個人樹莓派IP

scp -p pi@192.168.1.31:config.gz /home/liu/rpi/RpiLinux

下載後解壓一下

zcat config.gz > .config

至此準備工做就差很少了

 

下面還要配置或者安裝一下 編譯必須的 庫 由於Ubuntu是64位的

先安裝一下 32位的 一些庫

用來解決

arm-bcm2708hardfp-linux-gnueabi- menuconfig 找不到命令的錯誤

 

sudo apt-get install lib32z1 lib32ncurses5

 

而後解決 curses.h:No such file or directory 問題

安裝 Ncurses

 

sudo apt-get install libncurses5-dev

 

 

全部準備工做完畢 能夠編譯內核了

先看看配置是否是正確

 

make ARCH=arm CROSS_COMPILE=../RpiTools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- menuconfig

 

 

 

 

 

 

 

 

 

編譯的時候 順便 添加一內核調用,然並卵 我也不知道具體操做可是體驗一把 仍是很必要的

/*****************************************************************************/

不須要的 跳過 這些

在RpiLinux/arch/arm/kernel/目錄下新建mysyscall.c文件,輸入如下內容

/arch/arm/kernel/calls.S中添加新的系統調用,

這裏我替換的是本來爲sys_ni_syscall的0×900000+223號系統調用,

這是由於223號是內核默認未使用的(/*Demo_liu*/)

 

 

修改arch/arm/kernel/目錄下的Makefile文件,在obj-y後面添加mysyscall.o,

 

不須要的 跳過這些

/*****************************************************************************/

 

 

下面內核編譯開始

 

make ARCH=arm CROSS_COMPILE=../RpiTools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- -j4

 

-j4 開啓線程編譯 加快編譯速度

大概 30分鐘

 

編譯結束

查看一下

zImage 就是咱們所編譯得到的文件。zImage 是 Compressed kernel image 文件,要轉換爲 kernel.img 還須要進一步處理。

 

cd ../RpiTools/mkimage/

./imagetool-uncompressed.py ../../RpiLinux/arch/arm/boot/zImage

 

能夠看到當前目錄中多了kenrel.img文件

 

新的Kernel要正確運行,還須要編譯所需的module,主要對應"/lib"目錄下的內容。編譯時,使用"INSTALL_MOD_PATH"參數指定目標路徑。

 

cd ../..

mkdir modules

cd RpiLinux/

make modules_install ARCH=arm CROSS_COMPILE=../RpiTools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/arm-bcm2708hardfp-linux-gnueabi- INSTALL_MOD_PATH=../modules

 

 

 

樹莓派斷電 把內存卡 插到Ubuntu 的電腦上

掛載 SD卡

先看一下 文件系統

df –h

 

sudo mkdir /media/agu/SD

sudo mount /dev/sdb2 /media/agu/SD/

sudo umount /media/agu/SD

 

 

 

 

 

備份 Firmware

升級RPi的kernel、Firmware、lib

 

cd ..

mkdir backup

sudo mount /dev/sdb1 /media/agu/SD/

cd /media/agu/SD/

mv *.elf *.bin /home/liu/rpi/backup/

 

 

sudo cp /home/liu/rpi/RpiTools/mkimage/kernel.img kernel_new.img

cd /home/liu/rpi/RPiFirameware/boot

cp bootcode.bin fixup.dat fixup_cd.dat start.elf /media/agu/SD/

cd ../hardfp/opt/

sudo umount /media/agu/SD

sudo mount /dev/sdb2 /media/agu/SD/

將掛載點換成SD卡的第2分區,即"/"分區。

 

sudo cp -r vc/ /media/agu/SD/opt/

將新的vc庫複製到SD卡,由於以前選用的工具鏈是hardfp(硬浮點),因此如今所選用的vc庫也是硬浮點的版本(RPiFramware/hardfp/opt/vc)。

 

cd ../../..

sudo cp -r modules/lib /media/agu/SD/

 

 

 

 

 

 

下面修改一下 kernel_new. 的 文件名 替換一下

 

插到樹莓派 運行 看看 內核 版本

自此內核編譯成功。

下面咱們看一下 剛纔插入的 調用

編寫測試程序調用新的系統調用:

 

 

看到調用成功 我測試了兩次 因此有兩個

 

 

順便在Ubuntu 上 編譯個模塊 試試

寫一個最簡單的內核模塊 hello.c, 這個內核只會在加載的時候輸出 helo,word,移除時輸出goodbye

在樹梅派上找個地方新建一個目錄,建立文件hello.c:

 

建立Makefile文件:

 

編譯:

傳到樹莓派

 

運行:

 

 

結束 END

相關文章
相關標籤/搜索