通過增加乙個系統呼叫來了解系統呼叫的實現原理。(增加
int fun(void))1
.在include->unistd.h
中加入#define __nr_fun72
;加入系統函式呼叫宣告『
int fun(void);
2.
在include->linux->sys.h
加入系統函式宣告
extern int sys_ fun ();
在指標陣列
fn_ptr sys_call_table
初試化中加入
sys_ fun項3
.int sys_ fun ()
可在任意檔案中實現。
4.在需要呼叫
int fun(void)
的地方宣告
static inline _syscall0(int, fun)
然後就可以呼叫
fun();
補充:
1.typedefint (*fn_ptr)();
2.sched.c
中的sched_ini
中set_system_gate(0x80,&system_call)
;設定系統呼叫
0x80
中斷。其它的一些中斷設定在
traps.c
中的void trap_init(void)
中。例set_trap_gate(0,÷_error); 3
.c
與彙編(
at&t
)混合程式設計
1)在彙編中定義
c函式。
例如在traps.c
中宣告int nmi(void)
中, set_trap_gate(0,& nmi); 在
a**.s
中實現:
_nmi:
pushl $_do_nmi
jmp no_error_code/
2)
在彙編中呼叫
c函式。先將c
函式需要的引數壓棧,然後
call
、jmp
函式。函式名前面也要_.
pushl %ecx
call _do_signal3)在
c中嵌入彙編
#define _syscall0(type,name) /
type name(void) /
3.在每次系統呼叫處理函式(通過
call _sys_call_table(,%eax,4)
呼叫)執行完後,、
a.檢查當前程序是否就緒,時間片是否用完,否則執行
_schedule
(重新排程)
b.檢查是否有訊號,若有,則呼叫
_do_signal
(將訊號處理函式位址和其他
ax值放到使用者堆疊中),待中斷退出後立即執行訊號處理程式。
Linux 0 11 系統呼叫原理
一 概述 系統呼叫是乙個軟中斷,中斷號是0x80,它是上層應用程式與linux系統核心進行互動通訊的唯一介面。通過int 0x80,就可使用核心資源。不過,通常應用程式都是使用具有標準介面定義的c函式庫間接的使用核心的系統呼叫,即應用程式呼叫c函式庫中的函式,c函式庫中再通過int 0x80進行系統...
Linux0 11學習記錄
最近在學習linux0.11,遇到了一些編譯和執行的問題,好在最終能順利執行,在此作一下記錄,以方便自己和他人參考 我的編譯環境 linux bogon 3.16.0 4 686 pae 1 smp debian 3.16.39 1 deb8u2 2017 03 07 i686 gnu linux ...
Linux0 11學習筆記
目前狀態 中斷程式已設定,第乙個任務 init task已初始化 sched.c main 函式裡通過move to user mode 進入到task 0。目的 手工建立第二個任務 task 1,並和task 0不停切換。做法 在sched.c 建立第二個任務結構,所有值採用第乙個 union t...