操作系統開發技術(Linux內核編譯)-新系統調用設計實驗

操作系統開發技術(Linux內核編譯)-新系統調用設計實驗

這確實是一個讓人頭疼的實驗。好不容易在網絡上找到一篇博客,寫的非常好,我參照這篇博客進項操作,很成功。

首先把博客的地址分享出來:
http://blog.csdn.net/qq_34247099/article/details/50949720
接下來我進行一些簡單的梳理與補充。


一、文件準備
ubuntu10.10 (32位)+ linux-2.6.32.71.tar.xz
原博客中分享了下載地址,爲尊重版權,此處不再粘貼。
然後在Vmware中,新近ubuntu32位虛擬機,安裝此係統。
建議安裝Vmware Tools,方便將源碼文件複製到虛擬機中。
放到桌面吧。


二、解壓內核
cd desktop
注:中文版的執行:cd 桌面

xz -d linux-2.6.32.71.tar.xz
注:ubuntu10.10默認沒有xz工具,請先在高版本的Linux虛擬機中將源碼解壓出來,然後將linux-2.6.32.71.tar複製進去。

tar -xvf  linux-2.6.32.71.tar
注:沒有-z,只有xvf這3個參數。

sudo su
注:/usr目錄的訪問需要管理員權限,之後的一些操作,也是需要管理員權限的。

mv linux-2.6.32.71 /usr/src
注:將源碼移動到/usr/src目錄下,其實,只有make modules_install這一步是需要在/usr/src下的,爲了方便就都在此目錄下操作了。


三、增加系統調用
注:以下操作需要root權限。
1、打開sys.c文件。
gedit /usr/src/linux-2.6.32.71/kernel/sys.c
2、在文件末尾增加系統調用。
asmlinkage intsys_mycall(int number)
{
 printk("My Student No. is XXXXX,and My Name is XXXXX*** !");
 return number+1;
}
注:printk就是系統調用輸出一行文字,你可以自定義裏面內容,便於最終檢驗。number+1看效果比較容易。
另注:asmlinkage是一個已經存在的宏。
3、註冊系統調用:
gedit /usr/src/linux-2.6.32.71/arch/x86/kernel/syscall_table_32.S
在.long 類型文件末尾添加:
.long sys_mycall
並且按照順序記住它屬於第幾個系統調用,在本機中爲337。
4、添加調用編號:
gedit /usr/src/linux-2.6.32.71/arch/x86/include/asm/unistd_32.h
在一系列#define __NR_之後添加:
# define __NR_mycall 337
在這裏就需要用到之前記住的數字了。


四、編譯內核
cd /usr/src/linux-2.6.32.71
make mrproper
make clean
make oldconfig
注:一路回車。它問的問題,直接按回車使用默認選項即可。

注:以下兩步非常耗時,建議插好電源,然後看個電影。
make bzImage
make modules

注:上面的操作都是針對源碼的,下面這一步纔開始影響到現在運行的系統。害怕出問題的話,可以提前備份了。這一步會在系統的/lib/modules下創建安裝文件。現在可以先打開這個目錄看看,運行完後再看看多了什麼。
make modules_install

注:實際真正需要的,就是這個生成的bzImage文件,和上一步的modules。
cp /usr/src/linux-2.6.32.71/arch/i386/boot/bzImage /boot/vmlinuz-2.6.32.71-mykernel


五、更新開機引導
1.創建initrd文件
mkinitramfs -o /boot/initrd.img-2.6.32.71

2.更新grub引導表
gedit /boot/grub/grub.cfg
找到下面字段:
### BEGIN /etc/grub.d/10_linux ### 
       ……  
### END /etc/grub.d/10_linux ###
修改
linux /boot/vmlinuz-2.6.35-22-generic
initrd /boot/initrd.img-2.6.35-22-generic
爲我們的內核與引導文件:
linux /boot/vmlinuz-2.6.32.71-mykernel
initrd /boot/initrd.img-2.6.32.71
這段文字中一共有2處,都修改。

3.修改initrd文件
cd /boot
cp initrd.img-2.6.32.71 initrd-2.6.32.71.old
depmod –a
注:depmod –a用於列舉所有模塊。
update-initramfs -k 2.6.32.71 –c

注:update-initramfs是一個單詞。中共建的2.6.32.71就是make modules_install時,/lib/modules下新生成那個目錄的名字。


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
mv initrd.img-2.6.32.71.new.gz initrd.img-2.6.32.71


六、重啓
重啓之前,看一下自己的系統版本:uname -a
重啓:reboot
重啓之後,再看一次:uname -a
成功的話,兩次是不一樣的。


七、測試
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int a=syscall(337, 1);
printf("%d",a);
    return 0;
}

怎麼編譯運行就不用講了,看到打印結果:2
就說明我們成功添加了系統調用。
再不放心的話,執行:dmesg –c
查看系統調用信息,會看到我們的printk那句話。

完成。
此處僅僅是拋磚引玉,實驗指導書後面的更加複雜的要求,期待大家的探索。


--------------------------------------------------------------------------------


參考文章出處:

http://blog.csdn.net/qq_34247099/article/details/50949720



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章