Linux中自定義系統調用

一. 實驗目的

系統調用是內核提供給用戶應用程序使用的內核函數名,這些函數提供了內核爲用戶應用程序所提供的系統服務功能。這些函數在用戶應用程序中的書寫格式與用戶自定義函數形式上沒有什麼不同,但這些函數的編寫和調用過程卻與自定義函數有着很大的不同。它們需要事先在內核中安排好入口和函數體,當調用時會引發系統軟中斷根據對應的存根函數查中斷表進入請求的內核函數。

二. 實驗問題

1、實現一個系統調用,獲取系統時間

2、編寫一個測試該系統調用的用戶程序

三.實驗內容

1.下載內核linux-2.6.36.1,並解壓在/usr/src裏面。

2.添加用戶自定義系統調用入口。

  (1)在/usr/src/linux-2.6.36.1/arch/x86/kernel/syscall_table32.S中,添加新的系統調用函數名,要求聲明的格式爲:

       .long sys_系統調用函數名

       例如:

.long sys_mySyscall

 

  (2)在/usr/src/linux_2.6.36.1/arch/x86/include/asm/unistd中在其中添加新的系統調用號的宏定義,要求聲明的格式爲:

         #define _NR_ 系統調用函數名 系統調用最後一個編號

例如:

#define _NR_mySyscall 333

 

3)在usr/src/linux_2.6.36.1/kernel/sys.中添加自己的系統調用函數代碼,如下:

     

#include<stdio.h>
#include<sys/time.h>
asmlinkage void mysyscall(void )
{
    struct Rtc_time now;
    __get_rtc_time(&now);
    printk(“%d/%d/%d,%d:%d:%d\n”,now.tm_year+1900,now.tm_mon+1,now.tm_mday,now.tm_hour,now.tm_min,now.tm_sec);
    //printk並不是在終端輸出,而是在buffers裏寫入信息,在顯示時要先dmesg –c清除buffers裏的信息,在運行後輸入dmesg指令才能顯示函數的內容
}

3 .接下來就是對內核進行編譯安裝,首先在終端打開/usr/src/linux-2.6.36.1,輸入命令make localmodconfig命令,配置內核,選項默認即可。

4. 接着輸入make對內核進行編譯,這要費一段時間。

5. 再輸入make modules_install安裝內核模塊。

6. 最後make install 安裝內核,安裝好後,重啓進入安裝後的內核。

7. 編寫測試程序進行測試。

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