Add A System Call On Linux Kernel 2.6.11

這學期因為修了 FullHouse 的演算法在 linux 核心上的應用 ,所以接觸到要怎麼增加一個系統呼叫。以下是我的心得筆記。

硬體: LAB 的 HP NC6000 筆記型電腦
作業系統核心:2.6.11-1.1369_FC4

 STAGE 1:  編譯 Kernel 並新增 system call

1.
先到 www.kernel.org 下載新核心的 Source Code 存放在 /usr/src 這個資料夾下 。
因為我要作的新核心想要使用 2.6.11,因此選擇 linux-2.6.11.tar.bz2 這個檔案。

2.
# tar -zxvf linux-2.6.11.tar.bz2        // 這個步驟是解開壓縮檔,並且建立一個名為 linux-2.6.11 的資料夾
# ln -s linux-2.6.11 linux                   // 建立軟連結,在以後輸入的時候可以比較方便

3. 將要新增的system call 加入 interrupt 的 table 中
# vi /usr/src/linux/arch/i386/kernel/syscall_table.S 

進入到這個檔案會看類似以下的格式 :
.data
ENTRY(sys_call_table)
      .long     sys_ni_call                            /* 0 */

      …..

      在檔案的最後加上想要新增的 system call 名稱,在這裡我使用的是 myservice,可將之替換成任何檔名。

      .long sys_myservice  /*  289  */

      此外稍微記一下這個 system call 的 table entry 的 index,也就是我們在檔案一開始後面看到的/*0*/。不要擔心需要從頭數到最後,系統會每五個 entry 就注解一次。我的系統中,新增的 system call entry 為289。

4. 新增 system call 的 code

# vi  /usr/src/linux/arch/i386/kernel/myservice.c     

   檔案內容如下,功能是可以列印出來*******This is my new system call********這行字串。

#include <linux/linkage.h>
#include <linux/kernel.h>

asmlinkage int sys_myservice(void)
{
printk(“********This is my new system call********\n");
return 0;
}

5. 讓核心在編譯的時候可以把我們新增的 system call 編譯進去

# vi /usr/src/linux/arch/i386/kernel/Makefile   

加入下列這行文字 

obj-y += myservice.o

6. 建立 system call “stub",讓 user program 可以呼叫

# vi /usr/src/linux/include/asm-i386/unistd.h

檔案長的像這樣子:

 #define __NR_io_destroy         246
 #define __NR_io_getevents       247
 #define __NR_io_submit          248
 #define __NR_io_cancel          249
….

在我們剛剛記下的index位置新增上我們的 system call 名稱,entry的index一定要跟這裡的數字一樣,前面加上 #define __NR_

#define __NR_myservice          289

另外最後的 __NR_syscalls 也要加一,因此變成
#define __NR_syscalls     290

7. 因為我使用的是FC4,沒有辦法直接編譯 2.6.11 的 source code,因此需要去 /usr/src/linux/Makefile 修改一下 GCC 的版本。

# vi /usr/src/linux/Makefile

為了修改方便,進去以後我們鍵入 /set nu ,將檔案的行數標示出來。

在第203行改成

HOSTCC =        gcc32

在第320行改成

CC =           $(CROSS_COMPILE)gcc32

8. 接下來就是編譯新核心的步驟啦

# make menuconfig
# make bzImage
#make modules
#make modules_install
#make install

這幾步是一個漫長的過程,如果是第一次編譯的話,因此可以去打個B再回來繼續。但是如果之後修改 system call ,只要在 Makefile 裡面讀的到他的 .o 檔,就只需下 make install 這個指令就好了。

 STAGE 2 : 新增 user program 並呼叫 system call

1. 新增一個 user program 

#vi /test/user-app.c

#include <linux/unistd.h>
#define __NR_myservice        289

_syscall0(int, myservice);

int main ()
{
myservice();
return 0;
}

2.編譯這檔案

# gcc -Wall user-app.c -o user-app.o

3.最後就是緊張刺激的測試時間啦

#./user-app.o

我的螢幕上就會出現 ********This is my new system call********

但是理論上在 /var/log/message 也可以看到以上訊息,他是在檔案的最後出現。

也可以用下面指令

# dmesg | tail -n 5

syscall

如果能看到你在printk裡面寫的訊息,那麼恭喜你,你已經成功新增 system call 了。

———————————————————————————————————————-

References :

1. http://www.im286.com/archiver/tid-1708047.html

2.http://fossil.wpi.edu/docs/howto_add_systemcall.html

廣告

28 thoughts on “Add A System Call On Linux Kernel 2.6.11

  1. 雖然我是個路人,但對於讀資工系的我,這是很有用的一篇喔!

    不過這是我OS的課堂作業。

    提醒大家一下,

    作者的printk(”********This is my new system call********\n”);的是全形的雙引號。

    如果要用複製貼上來實驗時,要記得改成

    printk(“********This is my new system call********\n")

    寫得很詳細,謝謝你啦

  2. 感謝你的文檔~~
    不過你知道為什麼我得到這樣的錯誤嗎???
    mycall.c:5: error: expected declaration specifiers or ‘…’ before ‘mycall’
    問題出在這一行
    _syscall0(int, mycall);
    這行在做甚麼阿???

  3. I think everything said was actually very logical.
    But, think on this, what if you added a little information?
    I mean, I don’t want to tell you how to run your blog, however suppose you added something that grabbed folk’s attention?
    I mean Add A System Call On Linux Kernel 2.6.11 | +++ Pieces of Me +++ is kinda boring.
    You might peek at Yahoo’s home page and note how they write news headlines to get people interested. You might try adding a video or a pic or two to grab readers excited about everything’ve got to say.
    Just my opinion, it would make your posts a little livelier.

  4. The post has confirmed necessary to us. It’s really helpful and you are naturally extremely experienced in this field.
    You have got opened my sight in order to various views on this kind of subject matter
    together with intriquing, notable and strong content material.

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s