Linux驅動開發之環境搭建----Ubuntu 12.4 編譯內核

Linux驅動開發之環境搭建----Ubuntu 12.4 編譯內核

要想編寫驅動,建立內核目錄樹是必須的.也即是在PC Linux上編譯內核,加入到PC Linux中,以這個內核作爲PC Linux的內核啓動.

 

1. 我的系統是Ubuntu 12.4,先查看一下原先的內核版本:

cody@cody-linux:/$ uname -a
Linux cody-linux 3.2.0-29-generic-pae #46-Ubuntu SMP Fri Jul 27 17:25:43 UTC 2012 i686 i686 i386 GNU/Linux

原來是3.2.0-29,還挺新的,起碼到目前爲止是這樣的

2. 安裝必要的軟件包:

cody@cody-linux:/$ sudo  apt-get install build-essential kernel-package  libncurses5-dev

 

3. 去https://www.kernel.org/pub/linux/kernel/選擇一個合適的版本下載.因爲我的開發板使用的內核是2.6.29.4,所以我選擇"linux-2.6.29.4.tar.bz2”, 下載完成後放到一個合適的位置,我的是:/home/cody/kernel/,然後右鍵選擇解壓在這裏(讓命令去S吧,點擊二下就可以做的事,我幹嘛還要去命終端打一堆的命令來解壓呢?)

 

4. 打開終端,進入到剛剛解壓出來的目錄:

cody@cody-linux:/$ cd ~/k*/l*
cody@cody-linux:~/kernel/linux-2.6.29.4$

看到了吧,使用通配符*,快速進入到目標目錄,因爲在我的主目錄下以k開關的只有kernel這個目錄,而kernel目錄下以l開關的也只有linux-2.6.29.4這個目錄,如果還有一些目錄是以l開頭,可能進入的不是你想要的目錄,多打幾個前面的字母,直到能區別爲止即可.

 

5. 先配置一下. 我使用的是默認的配置,因爲我不懂行那麼多配置到底代表什麼意思.是否可行有待時間驗證

sudo make-kpkg clean #如果之前已經make過,最好clean一下
sudo make menuconfig #會打開一下圖形界面的配置,我直接Exit,問我是否保存,我選擇Yes
sudo make-kpkg --initrd --append-to-version=-fordevkernel kernel-image kernel-headers

其中字符串”fordevkernel”可以換成你想要的.--append-to-version的解釋是這樣的(來源):

--append-to-version= you can write any string that helps you identify the kernel, but it must begin with a minus (-) and must not contain whitespace

 

6. 根據make要很久才能跑玩,可是我的跑了大概2分鐘的時候,出現一個錯誤:

gcc: 錯誤: elf_i386:沒有那個文件或目錄
make[2]: *** [arch/x86/vdso/vdso32-int80.so.dbg] 錯誤 1
make[1]: *** [arch/x86/vdso] 錯誤 2
make: *** [sub-make] 錯誤 2

解決辦法:

原因是 gcc 4.6 不再支持 linker-style 架構。講 arch/x86/vdso/Makefile 中, 將以 VDSO_LDFLAGS_vdso.lds 開頭所在行的 "-m elf_x86_64" 替換爲 "-m64"。 將以 VDSO_LDFLAGS_vdso32.lds 開頭所在行的 "-m elf_x86" 替換爲 "-m32"

 

7. 又跑了半小時左右,出現如下錯誤:

複製代碼
include/linux/kvm.h:241:9: 錯誤: 重複的成員‘padding’
arch/x86/kvm/svm.c: 在函數‘io_interception’中:
arch/x86/kvm/svm.c:1099:30: 警告: 變量‘rep’被設定但未被使用 [-Wunused-but-set-variable]
arch/x86/kvm/svm.c:1099:12: 警告: 變量‘down’被設定但未被使用 [-Wunused-but-set-variable]
make[2]: *** [arch/x86/kvm/svm.o] 錯誤 1
make[1]: *** [arch/x86/kvm] 錯誤 2
make[1]:正在離開目錄 `/home/cody/kernel/linux-2.6.29.4'
make: *** [debian/stamp/build/kernel] 錯誤 2
複製代碼

百度,Google,Bing…. 沒有找到直接使用的信息,有的說是配置錯誤.好吧,重新make menuconfig, 從出錯信息來看,應該是kvm相關的.因爲沒有用到kvm,爲何不乾脆關掉這個選項呢?ok,就這樣!

找到Virtualization選擇,把勾選去掉.如下例如所示.

image

繼續make, 還有一個錯誤,重複的定義'codec’,解決辦法是找到 include/sound/soc-dai.h,可以看到裏面定義了一個struct和一個union類型的codec, 我註釋掉struct的那個,不知道這樣做會不會有問題. 反正我的是編譯過了.

 

6. 等了好久好久,終於編譯過了, 內牛滿面!! 生成的安裝文件在上層目錄中, 返回上層目錄(~/kernel),可以看到生成了二個deb文件,一個linux-image-開頭的內核文件和一個lnux-headers-開頭的頭文件.

7. 使用dpkg –i 安裝上述二個文件.

 

8. 查看一下啓動菜單文件裏有沒有進加入的內核的啓動選項

vi /boot/grub/grub.cfg

 

9. 啓動試試,哈哈,因爲我在vmware裏運行的,默認沒有打開啓動菜單顯示的,所以重新啓動之後看不到啓動菜單,還是進入原來的內核系統

10. 修改/etc/default/grub文件中

GRUB_HIDDEN_TIMEOUT=1
GRUB_TIMEOUT=10   #10表示等待的時間,可以修改成你喜歡的時間

還有一些地方要修改,打開/etc/grub.d/30_os-prober,按如下修改(來源)

複製代碼
if [ "x\${timeout}" != "x-1" ]; then
  if keystatus; then
    if keystatus --shift; then
      set timeout=-1
    else
      set timeout=10  # 修改這裏 1/3
    fi
  else
    if sleep$verbose --interruptible 3 ; then
      set timeout=10 # 修改這裏 2/3
    fi
  fi
fi
EOF
      else
    cat << EOF
if [ "x\${timeout}" != "x-1" ]; then
  if sleep$verbose --interruptible ${GRUB_HIDDEN_TIMEOUT} ; then
    set timeout=10  # 修改這裏 3/3
  fi
fi
複製代碼

修改之後不要忘了更新grub

sudo update-grub

 

11. 重新啓動,這時應該可以選擇內核了.

12. 選擇新編譯的內核啓動之後, 會提示一些錯誤. 但還算可以用. 先這樣吧.

發佈了5 篇原創文章 · 獲贊 0 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章