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由使用者空間和核心空間 一般情況下,使用者程序是不能訪問核心的。它既不能訪問核心所在的記憶體空間,也不能呼叫核心中的...