系統調用:原理及實現
1. 什么是系統調用
在計算機中,系統調用(英語:system call),又稱為系統呼叫,指運行在使用者空間的程序向操作系統內核請求需要更高權限運行的服務。系統調用提供了用戶程序與操作系統之間的接口(即系統調用是用戶程序和內核交互的接口)。
操作系統中的狀態分為管態(核心態)和目態(用戶態)。大多數系統交互式操作需求在內核態執行。如設備IO操作或者進程間通信。特權指令:一類只能在核心態下運行而不能在用戶態下運行的特殊指令。不同的操作系統特權指令會有所差異,但是一般來說主要是和硬件相關的一些指令。用戶程序只在用戶態下運行,有時需要訪問系統核心功能,這時通過系統調用接口使用系統調用。
翻來覆去也就是這幾句話:
應用程序有時會需要一些危險的、權限很高的指令,如果把這些權限放心地交給用戶程序是很危險的(比如一個進程可能修改另一個進程的內存區,導致其不能運行),但是又不能完全不給這些權限。於是有了系統調用,危險的指令被包裝成系統調用,用戶程序只能調用而無權自己運行那些危險的指令。另外,計算機硬件的資源是有限的,為了更好的管理這些資源,所有的資源都由操作系統控制,進程只能向操作系統請求這些資源。操作系統是這些資源的唯一入口,這個入口就是系統調用。
2. 系統調用實現方法概述
在Xv6中增加系統調用的方法為:
1) 在 sysproc.c 文件中,添加要增加的系統調用的實現函數;
2) 在 syscall.h 文件中,定義指向實現函數的系統調用向量(system call vector)的位置;
3) 在 user.h 文件中,定義可以在 shell 中調用的函數;
4) 在 syscall.c 文件中,外部定義(external define)一個鏈接內核和 shell 的函數,使用“步驟2)”中的位置將此函數添加到系統調用向量;
5) 在 usys.S 文件中,使用 macro 連接 用戶的調用請求 和 實現函數;
6) 在 defs.h 文件中,為自己添加的系統調用增加一個前台聲明。
3. 實際操作
為Xv6增加系統調用“halt”,以完成關機功能。
a. 在 sysproc.c 文件中,添加要增加的系統調用的實現函數,添加代碼如下:
int sys_halt(void) { char *p = "Shutdown"; for( ; *p; p++) outb(0x8900, *p); return 0; }
b. 在 syscall.h 文件中,定義指向實現函數的系統調用向量(system call vector)的位置,添加代碼如下:
#define SYS_halt 22
c. 在 user.h 文件中,定義可以在 shell 中調用的函數;
int halt(void);
d. 在 syscall.c 文件中,添加如下代碼:
extern int sys_halt(void);
並在static int (*syscalls [])(void)中,添加如下內容:
[SYS_halt] sys_halt,
e. 在usys.S中添加:
SYSCALL(halt)
完成。
注:
本文參考了以下地址,如有興趣可訪問原地址。
參考博客:http://yalongyang.com/2012/10/xv6-add-system-call/
參考博客:http://www.ithao123.cn/content-6299692.html
參考回答:http://stackoverflow.com/questions/8021774/how-do-i-add-a-system-call-utility-in-xv6