ARM學習筆記之驅動程序篇六----系統調用

1.9 系統調用

1.9.1 系統調用概述

計算機系統的各種硬件資源是有限的,在現代多任務操作系統上同時運行的多個進程都需要訪問這些資源,爲了更好的管理這些資源進程是不允許直接操作的,所有對這些資源的訪問都必須有操作系統控制。也就是說操作系統是使用這些資源的唯一入口,而這個入口就是操作系統提供的系統調用(System Call)。在linux中系統調用是用戶空間訪問內核的唯一手段,除異常和陷入外,他們是內核唯一的合法入口。

一般情況下應用程序通過應用編程接口API,而不是直接通過系統調用來編程。在Unix世界,最流行的API是基於POSIX標準的。

操作系統一般是通過中斷從用戶態切換到內核態。中斷就是一個硬件或軟件請求,要求CPU暫停當前的工作,去處理更重要的事情。比如,在x86機器上可以通過int指令進行軟件中斷,而在磁盤完成讀寫操作後會向CPU發起硬件中斷。

中斷有兩個重要的屬性,中斷號和中斷處理程序。中斷號用來標識不同的中斷,不同的中斷具有不同的中斷處理程序。在操作系統內核中維護着一箇中斷向量表(Interrupt Vector Table),這個數組存儲了所有中斷處理程序的地址,而中斷號就是相應中斷在中斷向量表中的偏移量。

一般地,系統調用都是通過軟件中斷實現的,x86系統上的軟件中斷由int 0x80指令產生,而128號異常處理程序就是系統調用處理程序system_call(),它與硬件體系有關,在entry.S中用匯編寫。接下來就來看一下Linux下系統調用具體的實現過程。

1.9.2 系統調用實現

在ARM系統上,通過swi(軟中斷指令)指令進行系統調用,系統調用有很多,通過系統調用編號來區分,進行系統調用之前,須將編號寫入r7寄存器。

1,使用printk打印一條信息

   在./kernel/printk.c中添加函數sys_pk()。

/*
*創建一個新的系統調用sys_pk
*/
void sys_pk()
{
	printk("This is a new sys call!\n");
}

2,在./arch/arm/kernel/calls.S添加系統調用入口

CALL(sys_pk)

注意:不要打亂前邊的順序,將新添加的系統調用放到最後。

3 ,給系統編號

./arch/arm/include/asm/unistd.h中最後添加宏,在原有系統調用的基礎上依次加1。

#define __NR_pk			(__NR_SYSCALL_BASE+370)

4,編寫測試程序

void pk()
{
    __asm__ (
    "ldr r7,=363 \n"
    "swi \n"
    :
    :
    :"memory");
}
void main()
{
    pk();	
}

注意:編譯時使用靜態編譯,因爲開發板上運行的linux系統沒有所需的庫。 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章