Linux 系統呼叫原理

2021-08-20 20:33:03 字數 2935 閱讀 5108

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, const char __user *, _type,

const char __user *, _description,

const void __user *, _payload,

size_t, plen,

key_serial_t, ringid)

\static

inline

long sysc##name(__map(x,__sc_decl,__va_args__))

sys_kill

(__map(2,__sc_decl,__va_args__)) \ __attribute__

((alias(__stringify(sys_kill)))); \

static inline long

sysc_kill

(__map(2,__sc_decl,__va_args__)); \

asmlinkage long

sys_kill

(__map(2,__sc_long,__va_args__)); \

asmlinkage long

sys_kill

(__map(2,__sc_long,__va_args__)) \  \

static inline long

sysc_kill

(__map(2,__sc_decl,__va_args__))

#define __map1(m,t,a) m(t,a)

#define __map2(m,t,a,...) m(t,a), __map1(m,__va_args__)

#define __map3(m,t,a,...) m(t,a), __map2(m,__va_args__)

#define __map4(m,t,a,...) m(t,a), __map3(m,__va_args__)

#define __map5(m,t,a,...) m(t,a), __map4(m,__va_args__)

#define __map6(m,t,a,...) m(t,a), __map5(m,__va_args__)

#define __map(n,...) __map##n(__va_args__)

#define __sc_long(t, a) __typeof(__builtin_choose_expr(__type_is_ll(t), 0ll, 0l)) a

#define __sc_cast(t, a) (t) a

#define __sc_args(t, a) a

#define __sc_test(t, a) (void)build_bug_on_zero(!__type_is_ll(t) && sizeof(t) > sizeof(long))

__map(2,__sc_long,__va_args__) //等價於 long pid, long sig

__map(2,__sc_cast,__va_args__) //等價於 (pid_t) pid, (int)sig

__map(2,__sc_args,__va_args__) //等價於 pid, sig

asmlinkage long sys_kill(pid_t pid, int sig) __attribute__((alias(__stringify(sys_kill))));

static

inline

long sysc_kill(pid_t pid, int sig);

//函式宣告sys_kill()

asmlinkage long sys_kill(long pid, long sig);

asmlinkage long sys_kill(long pid, long sig)

static

inline

long sysc_kill(pid_t pid, int sig)

定義sysc_kill()函式和sys_kill()函式;

sys_kill,通過別名機制等同於sys_kill().

系統呼叫號的巨集定義:位於檔案/kernel/arch/arm/include/uapi/asm/unistd.h,記錄著核心空間的系統呼叫號,格式為#define__nr_*** (__nr_syscall_base+[num])系統呼叫的函式宣告:位於檔案/kernel/include/linux/syscalls.h,格式為asmlinkage long sys_***(args ...);系統呼叫的函式實現:不同函式位於不同檔案,比如kill()位於/kernel/kernel/signal.c檔案,格式為syscall_definex(x, sname, ...)

彙編定義相關函式的中斷呼叫過程:位於檔案/bionic/libc/arch-arm/syscalls/***.s,比如kill()位於kill.s,格式為:

entry(***)

mov ip, r7

ldr r7, =__nr_***

swi #0

mov r7, ip

cmn r0, #(max_errno + 1)

bxls lr

neg r0, r0

b __set_errno_internal

end(***)

Linux系統呼叫原理

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

Linux系統呼叫原理

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

Linux系統呼叫 syscall 原理

linux體系結構 核心空間與使用者空間是程式執行的兩種不同狀態,通過系統呼叫和硬體中斷能夠完成從使用者空間到核心空間的轉移。如下圖所示 linux 體系結構圖 從上圖得知,linux由使用者空間和核心空間 一般情況下,使用者程序是不能訪問核心的。它既不能訪問核心所在的記憶體空間,也不能呼叫核心中的...