學習筆記之Linux內核編譯過程


  1. 准備工作

  • 物理主機:win8(32位)
  • 虛擬機工具:VirtualBox_4.3.16_Win32
  • 虛擬主機:xubuntu-12.04.4
  • 安裝virtualBox功能增強包

  • 設置好虛擬機與主機的共享文件夾
  • 進入內核所在文件夾並解壓,由於內核代碼一般安裝在/usr/src下,因此將內核代碼解壓到/usr/src下

 

  1. 配置內核

2.1 查看gcc信息

  • 在配置內核之前查看系統是否已安裝gcc

 

2.2 使用make gconfig進行配置

2.2.1 錯誤1

  • 然而使用這個配置模式,出現了錯誤:

  • 錯誤提示,缺少所需的包,需要安裝gtk+- 2.0:

sudo apt-get install gnome-devel gnome-devel-docs 一條語句可以完成我們需要的所有的glib,gtk,幫助手冊等資源

 

  • 但是,安裝之后還是出現之前的錯誤。在這個配置模式下不停做了修正之后,還是不能配置成功,於是我決定使用默認的配置方式對內核進行配置

 

2.2.2 刪除make gconfig產生文件

  • 在這之前,需要刪除之前配置產生的垃圾文件

 

2.3 使用make defconfig配置

  • 然后用默認的方式進行配置

 

  1. 編譯內核

  • 完成默認配置后,就可以使用make命令進行編譯

 

3.1 錯誤1:PATH_MAX未聲明

3.1.1 錯誤描述

PATH_MAX未聲明(在此函數內第一次使用)

 

3.1.2 解決方法

發現PATH_MAX在limits.h中定義,在/scripts/mod/sumversion.c中添加#include <limits.h>即可[1]

 

  1. 錯誤2:gcc:錯誤

3.2.1 錯誤描述

elf_i386: 沒有那個文件或目錄

很明顯這是一個gcc引起的錯誤,之前查看過本機中gcc的版本,為4.6.3,而gcc 4.6 不再支持 linker-style 架構

 

3.2.2 解決方案

將 arch/x86/i386/kernel/Makefile 中,-m elf_i386 改為 –m32

參考[2]

  1. 錯誤3

3.3.1 錯誤描述

mutex.c undefined reference to '_ _mutex_lock_slowpath

mutex.c undefined reference to '—mutex_unlock_slowpath

 

3.3.2 解決方案1

很明顯,提示是有兩個變量的定義找不到,先進入muex.c中進行查看

從代碼中看出這兩個變量是定義了的,但編譯提示找不到,可能是有一些宏定義沒有打開導致的。

 

查看代碼,CONFIG_DEGUG_MUTEXES控制了_ _mutex_lock_slowpath

和_ _mutex_unlock_slowpath的定義

從CONFIG_DEBUG_MUTEXES這個名字可以猜測,該宏定義是跟配置相關的,由於在配置的時候,選擇的是默認的配置方式,因此配置方式可能造成了這個問題的產生。

接下來在config文件中查看CONFIG_DEBUG_MUTEXES

可以看到沒有CONFIG_DEBUG_MUTEXS的定義

 

在.config文件中添加CONFIG_DEBUG_MUTEXS的定義

如果直接編譯,還是會出現之前的錯誤,原因是配置文件雖然更改了,但沒有進行更新,應該使用make oldconfig 進行重新配置

 

3.3.3 解決方案2

然而這樣還是沒有解決這個問題,在網上搜索,有一種說法是:

可能原因是編譯器版本與內核版本匹配度的問題。

 

安裝gcc4.4

安裝成功后系統中有兩個版本的gcc

設置gcc4.4為系統默認版本

 

 

 

設置完成后,重新進入內核所在文件,使用make進行編譯

編譯后結果如下:

 

3.4 說明

由於在配置的時候使用的是默認的配置,因此在解決了上述問題之后,編譯內核的時間並不是很長,只有約5min

  1. 安裝內核

4.1 安裝內核模塊

使用命令:make modules_install安裝內核模塊

 

4.2 安裝內核

然后使用make install安裝內核

此時,內核已經編譯完畢。

 

  1. 修改啟動程序配置,運行新的內核

先將生成的bzImage文件和System.map文件拷貝到/boot/目錄下,命令如下:

cp /usr/src/linux-2.6.18/arch/x86/boot/bzImage /boot/

cp /usr/src/linux-2.6.18/System.map /boot/

 

然而輸入該命令后,出現了以下錯誤。即在/usr/src/linux-2.6.18/arch/x86/boot/這個目錄下沒有bzImage文件

 

通過查找,在i386/boot下找到了bzImage文件

 

重新拷貝bzImage

 

拷貝System.map

 

5.1 建立鏡像文件

在終端輸入命令:

mkinitramfs 3.12.6 -o /boot/initrd/img-3.12.6

來建立鏡像文件

這里有錯誤,改正后如下

 

5.2 更新修改系統引導配置

然后輸入命令:

update-initramfs -c -k 2.6.18

 

再輸入命令:

update-grub2

更新修改系統引導配置。

 

 

查看grub.cfg中的配置信息

如查看到以下信息,則我們編譯的內核已經添加到啟動項中了

 

5.3 重啟驗證

命令:/sbin/reboot

由於我用的linux是安裝在虛擬機中的,因此重啟后會直接進入登陸界面,而跳過了grub界面。

 

解決方法是在虛擬機開機時,一直按住shift鍵, 參考[5]

 

 

 

可以看到,Previous Linux version下面包含了我們的2.6.·8版本,選擇該菜單后,得到下面的界面

說明linux-2.6.18已經成功安裝並可以啟動

5.4 說明

可以看到,內核已經成功編譯並安裝到了系統中,但是在grub界面選擇從2.6.18版本啟動時,系統沒有跑起來。在配置內核時,使用make defconfig的方式實際上,按照默認的配置文件arch/i386/defconfig對內核進行配置,生成.config可以用作初始化配置,然后再使用make menuconfig進行定制化配置。也就是說,默認配置只是做了一些初始化的配置,硬件所配置的選項很多都是沒有啟動的,因此系統不能成功。

    由於使用make menuconfig配置的操作步驟與defconfig類似,此次報告中就不再對更改過后的配置過程進行贅述了。

 

  1. 參考資料

[1] 編譯錯誤提示PATH_MAX未聲明

http://blog.csdn.net/armeasy/article/details/6217522

[2] 編譯linux內核並安裝

http://blog.sina.com.cn/s/blog_7e49bf5e0100y4sr.html

[3] 編譯linux內核問題

http://zhidao.baidu.com/link?url=EfW44_9U4Rq8uLVa_7SqSz_a7rLV-eUf_-7Apzj5_m1JaFrXs5vs_NNxOg3EFqDCliriarf6OxI8Uzbm7FdKZa

[4] 編譯linux-2.6.18內核出錯

http://zhidao.baidu.com/link?url=lcqy4WFKHaMO66gCsh_0dPeHifyRREp2xqtDFflYJA9hmFlOci8GzA5raFJKGSdMKgyDuSTq9oioSmpthEN6-GTQuaH3O-5SC9SKzbyfrbq

[5] linux 在虛擬機中開機啟動時如何進入grub界面?

http://zhidao.baidu.com/link?url=ZzTYvaBoiVuOBJKsjWe6aOeWe1-iy_Uf9fQBmsJI7VogsMP8nA1fxMB8THNeKl4IoyoTB8UlaFgt5HndxSmGJq

[6] 各種配置詳解

http://www.51testing.com/html/38/225738-237838.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM