總體流程:kill() -> kill.s -> swi陷入核心態 -> 從sys_call_table檢視到sys_kill -> ret_fast_syscall -> 回到使用者態執行kill()下一行**。
詳細過程概述
使用者程式在使用者空間通過軟中斷swi指令切入核心臺,執行vector_swi處指令——這個指令產生軟體中斷,vector_swi指令在檔案/kenel/arch/arm/kernel/entry-common.s中定義。
跟異常處理程式一樣,首先保護現場(保護產生中斷的使用者空間現場),緊接著獲取系統呼叫的系統呼叫號(這個過程在使用者空間執行),以殺程序的kill()函式為例,使用者空間kill()定義位於kill.s,當呼叫kill時,系統先儲存r7內容,然後將_nr_kill值放入r7,再執行swi軟體中斷指令切換進核心態。
使用者空間kill的系統呼叫號為_nr_kill,使用者空間的系統呼叫號定義於/bionic/libc/kernel/uapi/asm-generic/unistd.h 。
(其中__nr_syscall_base=0,也就是__nr_kill系統呼叫號=37。)
在linux核心中,每個syscall都有唯一的系統呼叫號對應。在核心中有與系統呼叫號對應的系統呼叫表,定義在檔案/kernel/arch/arm/kernel/calls.s
(到這裡可知37號系統呼叫對應sys_kill(),該方法所對應的函式宣告在syscalls.**件)
sys_kill()為核心空間的對應系統呼叫,對應執行過程的函式宣告在syscalls.**件
asmlinkage是gcc標籤,代表函式讀取的引數來自於棧中,而非暫存器。
sys_kill()定義在核心原始碼找不到直接定義,而是通過syscalls.**件中的syscall_define巨集定義。
總結:核心空間
1.系統呼叫的函式原型的指標:位於檔案/kernel/arch/arm/kernel/calls.s,格式為call(sys_***),定義了核心空間系統呼叫的目標函式入口
2.系統呼叫號的巨集定義:位於檔案/kernel/arch/arm/include/uapi/asm/unistd.h,記錄著核心空間的系統呼叫號,格式為#define__nr_*** (__nr_syscall_base+[num])
3.系統呼叫的函式宣告:位於檔案/kernel/include/linux/syscalls.h,格式為asmlinkage long sys_***(args …);
4.系統呼叫的函式實現:不同函式位於不同檔案,比如kill()位於/kernel/kernel/signal.c檔案,格式為syscall_definex(x, sname, …)
使用者空間
1.系統呼叫號的巨集定義:位於檔案/bionic/libc/kernel/uapi/asm-arm/asm/unistd.h,記錄著使用者空間的系統呼叫號,格式為#define__nr_*** (__nr_syscall_base+[num])。這個檔案就是由核心空間同名的標頭檔案自動生成的,所以該檔案與核心空間的系統呼叫號是完全一致。
2彙編定義相關函式的中斷呼叫過程:位於檔案/bionic/libc/arch-arm/syscalls/***.s,比如kill()位於kill.s,在使用者空間也有函式宣告,格式為:
先儲存,再內陷,發生系統呼叫。
其他:新新增系統呼叫:除了上面的過程,還需要新增系統呼叫號還需要修改syscalls總個數,但強烈不建議自己新增系統呼叫號,盡量保持與linux kernel主線一致,相容性更好。
linux系統中使用者空間訪問核心的手段:系統呼叫(一般通過中斷的方式),異常,陷入。系統呼叫是使用者空間訪問核心的唯一合法手段。
中斷:乙個硬體或者軟體請求,要求cpu暫停當前的工作,去處理更重要的事情。例子:在x86及其上可以通過int指令進行軟體中斷,而在磁碟完成讀寫操作後會向cpu發起硬體中斷。
中斷有兩個重要的屬性,中斷號和中斷處理程式。中斷號用來標識不同的中斷,不同的中斷具有不同的中斷處理程式。在作業系統核心中維護著乙個中斷向量表(interrupt vector table),這個陣列儲存了所有中斷處理程式的位址,而中斷號就是相應中斷在中斷向量表中的偏移量。
Linux clk子系統 3 系統呼叫流程
目錄 1.clk的分類 2.系統呼叫入口 3.leo clk初始化入口 4.of leo clocks init函式leo的clk系統自定義函式 5.of clk init 根據clk的特點,clock framework將clock分為fixed rate gate devider mux fix...
03 系統呼叫 核心處理流程
核心版本 v2.6.38 體系架構 arm 參考 檔名說明 系統呼叫介面宣告 系統呼叫號定義 arch arm kernel calls.s系統呼叫表內容 arch arm kernel entry common.s系統呼叫表定義 系統呼叫入口定義 異常向量表 arch arm kernel ent...
springmvc呼叫流程
1 客戶端發出乙個http請求給web伺服器,web伺服器對http請求進行解析,如果匹配dispatcherservlet的請求對映路徑 在web.xml中指定 web容器將請求轉交給dispatcherservlet.5 handler對資料處理完成以後將返回乙個modelandview 物件給...