2015年3月27日 星期五

在Raspberry Pi 上面建立編譯 kernel module 環境之懶人包

在 Raspberry Pi 上面學習 Linux 驅動程式開發是件好事情。一切都顯得非常的美好,除了一開始的編譯Kernel 的動作讓初學者痛不欲生。

因此秉著降低這個門檻的想法,讓初學者能夠順利地先從編譯 Hello.ko 開始一步步建立信心開始。所以我打包了一份 Cross-Compile 好的 Raspberry Pi 官方 Kernel Source Code,放在Google 上面讓人下載,大小大約200MB左右 。網址如下:

https://drive.google.com/a/ittraining.com.tw/file/d/0B4hTYt5ZpXOZVHRDeVpwSnZ1dU0/view

相關文章 編譯Kernel 4.0.y with device tree 



下載到 Pi 之後,找個風水好的目錄解壓縮,接下來的步驟就只剩下安裝核心和 module的動作要做了。

要注意的一件事情是,這份 kernel source code 的版本就如同檔名上所示,是3.12.36,然後裡面的核心是給 Pi 用的,不能給最新的 Pi2 用。

(update: 2015/05/07: 增加 Pi2 版本的連結(3.18.12-v7+):

而compile這份 kernel source的時候,用的是 cross-compile gcc 版本是 4.8.3。所以記得先在你的 Pi 系統裡面安裝好 gcc-4.8,然後設定一下,讓系統預設的gcc版本為4.8:

sudo apt-get install gcc-4.8 ##安裝完之後設定gcc-4.8為預設gcc sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 20 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50

當然,安裝核心檔到 /boot/ 底下的時候,記得備份一下你原本的系統,把microSD整張備份下來是最好。至少把原本的 /boot/kernel.img 這個檔備份一下,方便之後如果有需要用的時候。一般來說,我都直接改名字...


sudo mv /boot/kernel.img /boot/kernel.img.backup


1. 安裝核心檔:


編譯好的 source code 目錄底下的 /arch/arm/boot/ 裡面有一個叫 zImage的檔,那個就是編譯好的 kernel image 檔。把它copy到 /boot/ 底下順便改名為 kernel.img

cp <source code 目錄>/arch/arm/boot/zImage /boot/kernel.img

2. 安裝module:


我們先在 source code 目錄的上一層建一個moudles目錄,然後再將已編譯好的一些 kernel moudles 檔安裝在這個目錄裡面。

cd <source code 目錄> cd .. mkdir modules cd <source code 目錄> make modules_install INSTALL_MOD_PATH=../modules/
之後我們再把這些安裝好的kernel modules 檔copy到 系統資料夾 /lib/ 之中:


cd <source code 目錄> cd ../modules/ sudo cp -Rf ./firmware /lib/ sudo cp -Rf ./modules /lib/

之後重新開機,如果可以順利開機的話應該就沒什麼問題了。

可以用 uname -a 或是 cat /proc/version 確認一下版本資訊。

要注意的是要到最後還要到source code的目錄底下執行 make modules_prepare 指令才能開始編譯自己寫的那些hello world的 linux kernel module....


cd <source code 目錄> make modules_prepare 

如果執行這行指令出現下面這個錯誤訊息的話,通常是目前你的 gcc 版本不夠新。

#error Your compiler is too buggy; it is known to miscompile kernels

目前有遇到的狀況是...kernel 是用gcc4.8.3編的,但是 Pi 板 Linux 系統上的是 gcc-4.8.2....。

跟據  https://github.com/notro/rpi-source/wiki ,解決方式就是在你的source list 裡面加一個新的來源站,然後去抓新版的gcc,做法如下。

先到目錄 /etc/apt/sources.list.d/ 底下新增檔案 jessie.list :

sudo nano /etc/apt/sources.list.d/jessie.list

然後裡面加一行內容:

deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi
然後

然後更新套件,並案裝新版gcc

sudo apt-get udpate sudo apt-get install -y gcc-4.8 g++-4.8
當然如果同時有 gcc-4.8 gcc-4.6 版的話要設4.8版的為預設值。
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 20 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 20 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50






沒有留言 :

張貼留言