最近想學習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