1 系統調用:(SYSTEM CALL)
操作系統(operating system)內核中有一組實現系統功能的過程,系統調用就是對上述過程的調用。程序員利用系統調用,向OS提出服務請求,由OS代為完成。
一般情況下進程是不能夠存取系統內核的。它不能存取內核使用的內核段,也不能調用內核函數,CPU的硬件結構保證了這一點。只有系統調用是個例外。
系統調用是用戶態進入內核態的唯一入口。
Linux被分為內核空間和用戶空間;如果想在內核空間實現了某個函數提供給應用程序去使用,比如sys_read()函數;而應用程序的read()實現是來源於sys_read(),這樣就形成一個系統調用。
Linux中的系統調用接口:https://www.cnblogs.com/dongry/p/10650620.html
2 系統調用分析:
打開entry_common.S;找到其中的ENTRY(vector_swi)
在這個函數中得到調用標號
根據標號找到一個調用表
然后找到進入表
打開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
燒寫到開發板運行: