Linux下的系統呼叫的原理

2021-06-16 20:52:11 字數 1291 閱讀 4408

應用程式首先用適當的值填充到暫存器中,然後呼叫乙個特殊的指令跳轉到核心的固定的位置,核心根據應用程式填充的固定的值來找到相應的函式執行。

比如像如下程式:

1)適當的值

在include/asm/unistd.h

中為每個系統呼叫規定了乙個唯一的編號,這個編號就是為系統呼叫號

#define __nr_restart_syscall(__nr_syscall_base+0)

#define __nr_exit(__nr_syscall_base+1)

#define __nr_fork(__nr_syscall_base+2)

#define __nr_read(__nr_syscall_base+3)

#define __nr_write(__nr_syscall_base+4)

#define __nr_open(__nr_syscall_base+5)

#define __nr_close(__nr_syscall_base+6)

/* 7 was sys_waitpid */

#define __nr_creat(__nr_syscall_base+8)

2)特殊的指令a)在

inter cpu

中,這個指令由中斷

0x80

實現b)

在arm

中,這個指令是

swi

3)固定的位置

在arm

體系中,應用程式跳轉到的固定核心位置是

entry(vector_swi) 4)

相應的函式

核心根據應用程式傳遞來的系統呼叫號,從系統呼叫表

sys_call_table

找相應的核心函式。

call

(sys_exit

)我們現在知道了其工作原理,下面我們就來新增乙個我們自己的的系統

api

1)新增新的核心函式(

kernel\sys.c

)asmlinkage int sys_add(int a,int b)

// asmlinkage:

使用堆疊傳遞引數

2)更新標頭檔案

unistd.h

,新增我們的系統呼叫號

#define __nr_add(__nr_syscall_base+361)

3)跟新系統呼叫表(

kernel/call.s

)call(sys_add)

測試程式:

#include

#include

int main()

Linux系統呼叫原理

rootfs 使用者空間 kernel 核心空間 檔案系統 裝置驅動 網路協議棧 程序管理 記憶體管理 平台 系統呼叫 七大子系統 uboot 硬體linux系統分為使用者空間和核心空間 使用者空間的特性 包含了應用軟體,c庫,對應的cpu的工作模式為usr模式 不能直接訪問硬體裝置 如果進行記憶體...

Linux 系統呼叫原理

unistd.h檔案記錄著系統呼叫中斷號的資訊。syscall nr kill,sys kill security keys keyctl.c define nr add key 217 syscall nr add key,sys add key syscall define5 add key,c...

Linux系統呼叫原理

對於linux系統開發,系統呼叫是平常開發工作中算是用的比較多,那什麼是系統呼叫呢?顧名思義,系統呼叫就是由核心抽象出的一些介面 用層呼叫,從而達到應用層訪問得以訪問核心層資源,之所以需要這麼麻煩,是因為linux系統中分為核心態和使用者態,這裡簡單可以認為不同的記憶體位址所具有的許可權不一樣,核心...