arm linux 系統調用

操作系統爲在用戶態運行的進程與硬件設備進行交互,提供操作系統的系統服務,提供了一組接口。在應用程序和硬件之間,提供內核的系統-服務設置一個額外層具有很多最優點。

首先,這使得編程更加容易,把用戶從學習硬件設備的低級編程特性中解放出來。

其次,這極大地提高了系統的安全性,因爲內核在試圖滿足某個請求之前在接口級就可以檢查這種請求的正確性。

最後,更重要的是這些接口使得程序具有可移植性,因爲只要內核所提供的一組接口相同,那麼在任一內核之上就可以正確地編譯和執行程序。

1.libc庫調用swi指令後,首先彙編指令執行如下:

swi #val發生了什麼呢?
ENTRY(vector_swi)
/*1.保存現場。r0-r12,cpsr*/
	sub	sp, sp, #S_FRAME_SIZE
	stmia	sp, {r0 - r12}			@ Calling r0 - r12
	add	r8, sp, #S_PC
	stmdb	r8, {sp, lr}^			@ Calling sp, lr
	mrs	r8, spsr			@ called from non-FIQ mode, so ok.
	str	lr, [sp, #S_PC]			@ Save calling PC
	str	r8, [sp, #S_PSR]		@ Save CPSR
	str	r0, [sp, #S_OLD_R0]		@ Save OLD_R0
	zero_fp
/*2.檢測swi指令是否符合規範(見下圖)scno爲sw指令機器碼*/
    ldr	scno, [lr, #-4]			@ get SWI instruction
  A710(	and	ip, scno, #0x0f000000		@ check for SWI		)
  A710(	teq	ip, #0x0f000000						)
  A710(	bne	.Larm710bug	
/*3.找到存放swi 函數指針數組*/
	enable_irq
	get_thread_info tsk
	adr	tbl, sys_call_table		@ load syscall table pointer
	ldr	ip, [tsk, #TI_FLAGS]		@ check for syscall tracing
/*4.獲取數組#val(清除高8位)*/
	bic	scno, scno, #0xff000000		@ mask off SWI op-code
	eor	scno, scno, #__NR_SYSCALL_BASE	@ check OS number
/*5.根據scno和table找到table[scno]對應的函數指針*/
	cmp	scno, #NR_syscalls		@ check upper syscall limit
	adr	lr, ret_fast_syscall		@ return address
	ldrcc	pc, [tbl, scno, lsl #2]		@ call sys_* routine

swi指令規範:

2.數組列表

call.S中:

	.type	sys_call_table, #object
ENTRY(sys_call_table)
#include "calls.S"
#undef ABI
#undef OBSOLETE
/**********************************************************/
/* 0 */		CALL(sys_restart_syscall)
		CALL(sys_exit)
		CALL(sys_fork_wrapper)
		CALL(sys_read)
		CALL(sys_write)
/* 5 */		CALL(sys_open)

3.找到對應函數指針:

asmlinkage ssize_t sys_write(unsigned int fd, const char __user * buf, size_t count)

進行調用

 

參考

http://blog.chinaunix.net/uid-28236237-id-3404140.html

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