手把手教你Linux內(nèi)核編譯(三天吐血經(jīng)歷)
一、實驗前的準(zhǔn)備:
Vmware + ubuntu10.10 (32位)+ linux-2.6.32.71.tar.xz
安裝虛擬機(jī)教程:http://jingyan.baidu.com/article/90895e0f95a07564ec6b0bc7.html
說明:ubuntu 10.10是我試驗的最后一個,也是最后成功的那個。當(dāng)然,更推薦ubuntu 10.04,因為這個支持sudo apt-update 少了一些麻煩。 而由于10.10不支持更新,故我另外新下了linux 2.6.32.71 先將這個文件拖入虛擬機(jī)桌面。
附: ubuntu10.10百度網(wǎng)盤分享:鏈接:http://pan.baidu.com/s/1bnNr8dD?密碼:ybg3
linux-2.6.32.71.tar.xz 百度網(wǎng)盤分享:鏈接:http://pan.baidu.com/s/1c1cOOtq?密碼:epu9(可能已經(jīng)失效,大家可以去某度上面進(jìn)行下載。網(wǎng)上資源很多,造成的不便,很抱歉~)
2022年嵌入式開發(fā)想進(jìn)互聯(lián)網(wǎng)大廠,你技術(shù)過硬嗎?
騰訊T6-9首發(fā)“Linux內(nèi)核源碼嵌入式開發(fā)進(jìn)階筆記”,差距不止一點點哦
二、解壓內(nèi)核
1、先打開安裝好的ubuntu 進(jìn)入終端 :在桌面按ctrl+alt+T
2、輸入sudo su 獲取root權(quán)限:(會出現(xiàn)一個輸入密碼的一個命令行,在終端輸入密碼時,是不顯示星號的。你只管把密碼輸入回車就行了!用慣了window的小伙伴可能會有些不適應(yīng))最后如圖:
3、先把下載好的內(nèi)核復(fù)制到 /usr/src 文件夾中 :
終端輸入 cd Desktop(定位到桌面) 回車 ; cp linux-2.6.32.71.tar.xz /usr/src 回車
4、解壓內(nèi)核 依次輸入以下命令回車執(zhí)行
cd /usr/src ;
xz -d linux-2.6.32.71.tar.xz
tar xvf linux-2.6.32.71.tar
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【865977150】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。?/blockquote>Linux內(nèi)核源碼技術(shù)學(xué)習(xí)路線+視頻教程代碼資料docs.qq.com/doc/DTkZRWXRFcWx1bWVx
三、增加系統(tǒng)調(diào)用
1、打開sys.c文件。
gedit /usr/src/linux-2.6.32.71/kernel/sys.c
2、在文件末尾增加系統(tǒng)調(diào)用。
asmlinkage intsys_mycall(int number){ printk("My Student No. is XXXXX,and My Name is XXXXX*** !"); return number;}
注:printk就是系統(tǒng)調(diào)用輸出一行文字,你可以自定義里面內(nèi)容,便于最終檢驗。
3、注冊系統(tǒng)調(diào)用:
gedit /usr/src/linux-2.6.32.71/arch/x86/kernel/syscall_table_32.S
在.long 類型文件末尾添加:.longsys_mycall并且按照順序記住它屬于第幾個系統(tǒng)調(diào)用,在本機(jī)中為337。
4、gedit /usr/src/linux-2.6.32.71/arch/x86/include/asm/unistd_32.h
在一系列#define __NR_之后添加:# define __NR_mycall 337
在這里就需要用到之前記住的數(shù)字了。
四、編譯內(nèi)核
ps:深吸一口氣,前面做的只是準(zhǔn)備工作!下面才是真正的開始!打好精神,真正的挑戰(zhàn)在下面!
下面的記得一定要一步一步都要做!不要漏掉一步?。。?!
進(jìn)入解壓目錄:
cd /usr/src/linux-2.6.32.71
make mrproper
make clean
make oldconfig
make bzImage (這個過程和下面的過程非常非常非常長,親測,建議泡杯茶,或是看個電影,沒有兩個小時不行)
make modules
make modules_install
五、拷貝內(nèi)核
經(jīng)過了漫長的等待,我們終于到了這一步。
先檢驗一下我們的結(jié)果:
首先查看一下編譯好的內(nèi)核版本,以便命名 打開 /lib/modules 里面應(yīng)該多了一個 純數(shù)字不帶"generic"的文件夾,那就是新內(nèi)核版本號,我們的是2.62.32.71 如下所示:
有了這個就代表前面的沒有什么錯誤了。
接著,就在終端輸入:
cp /usr/src/linux-2.6.32.71/arch/i386/boot/bzImage /boot/vmlinuz-2.6.32.71-mykernel
六、創(chuàng)建initrd文件
mkinitramfs-o /boot/initrd.img-2.6.32.71
七、更新grub引導(dǎo)表
進(jìn)行到這一步,也許你感覺到自己差不多了,畢竟都這么久了,你也許有些困了,有些疲憊, 但是, 我告訴你,最難最容易出錯的,就在當(dāng)前這一步!建議你先休息一下,下面需要你投入百分之百的注意力去做,若是出錯,你可是要全部重新開始的!
1.gedit /boot/grub/grub.cfg
2.在打開的文件中找到類似如下的字段,并復(fù)制并粘貼在前面:
但必須在同一個
### BEGIN /etc/grub.d/10_linux ###
……
### END /etc/grub.d/10_linux ###
里面:
字段如下:
menuentry 'Ubuntu, with Linux 2.6.35-22-generic' --class ubuntu --class gnu-linux --class gnu --class os {recordfailinsmod part_msdosinsmod ext2set root='(hd0,msdos1)'search --no-floppy --fs-uuid --set 0efd72ba-ba85-470f-8c21-ab68730ca8c9linux /boot/vmlinuz-2.6.35-22-generic root=UUID=0efd72ba-ba85-470f-8c21-ab68730ca8c9 ro ? quiet splashinitrd ?/boot/initrd.img-2.6.35-22-generic}menuentry 'Ubuntu, with Linux 2.6.35-22-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {recordfailinsmod part_msdosinsmod ext2set root='(hd0,msdos1)'search --no-floppy --fs-uuid --set 0efd72ba-ba85-470f-8c21-ab68730ca8c9echo 'Loading Linux 2.6.35-22-generic ...'linux /boot/vmlinuz-2.6.35-22-generic root=UUID=0efd72ba-ba85-470f-8c21-ab68730ca8c9 ro single echo 'Loading initial ramdisk ...'initrd ?/boot/initrd.img-2.6.35-22-generic}
將粘貼后字段里面的
linux /boot/vmlinuz-2.6.35-22-generic initrd /boot/initrd.img-2.6.35-22-generic 改成你的內(nèi)核文件地址和initrd 地址:
linux /boot/vmlinuz-2.6.32.71-mykernel initrd /boot/ initrd.img-2.6.32.71
這一步特別無聊但又必須認(rèn)認(rèn)真真做,要不然你就前功盡棄,別問我怎么知道的,我要是牢記這句話,不會到四點才睡覺 ( ╯□╰ )??! 建議全部改完之后,檢查幾遍。筆者以及室友們都在這步出錯,以至于不得不重新開始。全部完成如圖所示:
紅框是改過之后的,籃框里面的是你需要復(fù)制的內(nèi)容 可以看到 ,兩者在同一個###BEGIN /etc/**** 里面 黃色下劃線部分
八、收尾工作
好了,你若已經(jīng)檢查完畢上面的一切工作,那么,掃尾工作就開始了,這時候,也莫要放松 一步一步來,喝點開水,長呼口氣,一步一步來,下面的一步一步落實:
cd /boot
cp initrd.img-2.6.32.71 initrd-2.6.32.71.old
depmod–a
update-initramfs-k 2.6.32.71 –c
cd /tmp
gzip-dc /boot/initrd.img-2.6.32.71| cpio –id
touch lib/modules/2.6.32.71/modules.dep
find./ | cpio -H newc -o > /boot/initrd.img-2.6.32.71.new
gzip /boot/initrd.img-2.6.32.71.new
cd /boot
mvinitrd.img-2.6.32.71.new.gz initrd.img-2.6.32.71
九、重啟
終于到了驗證結(jié)果的一步了,此時你要克制一下自己的激動心情,在終端鍵入 reboot 點擊回車。慢慢等待一會,若是你重啟成功,那么恭喜你,你已經(jīng)要看到勝利的曙光啦!
重新進(jìn)入終端,獲取權(quán)限,過程前面有講,不再重復(fù)。在終端鍵入 uname -a 回車
此時若是看到
linux-2.6.32.71,說明已經(jīng)成功!
如下:
若是看到這個,你就可以大叫一聲慶祝一下了,你已經(jīng)成功啦?。。?!
十、測試自定義系統(tǒng)調(diào)用
打開終端,鍵入gedit,打開gedit工具,繼續(xù)鍵入如下代碼:
#include<stdio.h>int main(){ ? ? ? syscall(337, 1); ? ? ? return 0;}
保存為mytest.c
再繼續(xù)在終端中鍵入
gcc-o mytest mytest.c(編譯C程序)
之后 ./mytest 。
點擊運行編譯出來的程序,此時并不會顯示出效果,在終端中鍵入dmesg –c查看系統(tǒng)調(diào)用信息。
此時,你可以看到
說明之前寫的sys_mycall調(diào)用成功!
到這一步,算是全部成功啦?。c祝一下,去裝個逼吧~~~~
標(biāo)簽: