1 系統調用:(SYSTEM CALL)html
操做系統(operating system)內核中有一組實現系統功能的過程,系統調用就是對上述過程的調用。程序員利用系統調用,向OS提出服務請求,由OS代爲完成。
linux
通常狀況下進程是不可以存取系統內核的。它不能存取內核使用的內核段,也不能調用內核函數,CPU的硬件結構保證了這一點。只有系統調用是個例外。程序員
系統調用是用戶態進入內核態的惟一入口。函數
Linux被分爲內核空間和用戶空間;若是想在內核空間實現了某個函數提供給應用程序去使用,好比sys_read()函數;而應用程序的read()實現是來源於sys_read(),這樣就造成一個系統調用。spa
Linux中的系統調用接口:http://www.javashuo.com/article/p-knhkdntd-w.html操作系統
2 系統調用分析:3d
打開entry_common.S;找到其中的ENTRY(vector_swi)code
在這個函數中獲得調用標號htm
根據標號找到一個調用表blog
而後找到進入表
打開calls.S文件,會獲得一張系統調用列表(部分圖示)
3 系統調用實例:
實現功能:系統調用打印字符串
3.1 編寫系統調用函數(/mini2440/kernel/printk.c)
添加一個新的系統調用(/mini2440/arch/arm/kernel/calls.S)
添加到頭文件(/mini2440/arch/arm/include/asm/unistd.h)
3.2 make clean系統,從新編譯make uImage ARCH=arm CROSS_COMPILE=arm-linux- 並從新安裝到開發板上
cp arch/arm/boot/uImage /tftpboot
3.3 編寫應用程序syscall.c
void pk() { __asm__( "ldr r7,=365\n" "swi \n" : : :"memory" ); } int main() { pk(); return 0; }
編譯:arm-linux-gcc -static syscall.c -o syscall
燒寫到開發板運行: