增加系統呼叫

2021-06-16 00:40:40 字數 2143 閱讀 1995

增加系統呼叫

在實際程式設計中,尤其是當我們需要增加或完善系統功能的時候,我們經常會用到系統呼叫函式。系統呼叫函式通常由使用者程序在使用者態下呼叫,核心通過system_call 函式響應系統呼叫產生的軟中斷,在正確訪問核心棧、系統呼叫開關表之後陷入到作業系統核心中進行處理。

系統呼叫是使用者程序由使用者態切換到核心態的一種常見方式。利用編寫系統呼叫函式來直接呼叫了部分作業系統核心**,也是linux核心程式設計者必修之功。下面筆者以在linux中建立乙個名為print_info的系統呼叫函式為例,來說明如何為核心增加系統呼叫。

需要以下幾個基本步驟:

1、編寫系統呼叫函式

# cd /usr/src/linux/kernel

# vi sys.c

在檔案的最後增加乙個系統呼叫函式:

asmlinkage int sys_print_info(int testflag)

該函式有乙個int型入口引數testflag,並返回整數0。

2、修改與系統呼叫號相關的檔案

# cd /usr/src/linux/arch/i386/kernel

# vi entry.s

arch/i386/kernel/entry.s中的最後幾行源**修改前為:

......

.long symbol_name(sys_sendfile)

.long symbol_name(sys_ni_syscall) /* streams1 */

.long symbol_name(sys_ni_syscall) /* streams2 */

.long symbol_name(sys_vfork) /* 190 */

rept nr_syscalls-190

.long symbol_name(sys_ni_syscall)

.endr

修改後為:

......

.long symbol_name(sys_sendfile)

.long symbol_name(sys_ni_syscall) /* streams1 */

.long symbol_name(sys_ni_syscall) /* streams2 */

.long symbol_name(sys_vfork) /* 190 */

.long symbol_name(sys_print_info) /* added by i */

.rept nr_syscalls-191

.endr

修改相應的標頭檔案:

# cd /usr/src/linux/include/asm

# vi unistd.h

把增加的sys_call_table表項所對應的向量,在include/asm/unistd.h中進行必要申明,以供使用者程序和其他系統程序查詢或呼叫。

#define __nr_putpmsg 189

#define __nr_vfork 190

#define __nr_print_info 191 /* added by i */

3、編譯核心,再重啟動

4、測試

編寫使用者測試程式(test.c):

# vi test.c

#include

#include

extern int errno;

_syscall1(int,print_info,int,testflag)

main()

如果要在使用者程式中使用系統呼叫函式,那麼在主函式main前必須申明呼叫_syscall,其中1 表示該系統呼叫只有乙個入口引數,第乙個int 表示系統呼叫的返回值為整型,print_info為系統呼叫函式名,第二個int 表示入口引數的型別為整型,testflag為入口引數名。

編譯測試程式:

# gcc -o test test.c

執行測試程式:

# ./test

its my syscall function!

i=0, syscall success!

ok!!!增加系統呼叫函式成功!

以上步驟在pentium ⅲ/64m/20g、red hat linux 6.0(2.2.5-15)機上測試通過。 

增加系統呼叫

增加系統呼叫socket2 1.增加系統呼叫號 在source net socket.c增加syscall define3 socket2.syscall define3 socket2,int,family,int,type,int,protocol 2.source arch x86 sysca...

增加系統呼叫

1 修改sys.c 命令 sudo gedit usr src linux 2.6.38.8 kernel sys.c 新增如下內容 include asmlinkage long sys rt read unsigned int ipointnr,64 time,struct data packa...

Linux增加系統呼叫

本次實驗以linux 2.6.35版本的unbutu系統為基礎,在核心上增加乙個helloworld程式的系統呼叫。一 重新安裝配置核心 linux增加系統呼叫 本次實驗以linux 2.6.35版本的unbutu系統為基礎,在核心上增加乙個helloworld程式的系統呼叫。一 重新安裝配置核心 ...