System call 的分析

来源:互联网 发布:名片设计软件 编辑:程序博客网 时间:2024/06/09 22:50
0. sysfs_write_file@kernel/fs/sysfs/file.c
1. vfs_write@kernel/fs/read_write.c
2. sys_write@kernel/fs/read_write.c有SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,    size_t, count)定义, SYSCALL_DEFINEx的定义在 kernel/include/linux/syscalls.h, 经过转换就变成了sys_write(...)
3. ret_fast_syscall(asm)@kernel/arch/arm/kernel/entry-common.S中(entry_armv.s)
4. 所有的system call函数都是以 sys_???开头的
5. kernel/arch/arm/include/asm/unistd.h 中定义了system call number, 系统调用的调用号规则,
    #define __NR_write    (__NR_SYSCALL_BASE+  4)
6. kernle/arch/arm/kernel/calls.S声明了系统调用函数 CALL(sys_write) 为于第4个
7. kernel/arch/arm/kernel/entry-common.S,中有sys_syscall的定义,还有vector_swi的定义,用于软中断的进入,也就是最终会执行例程vector_swi来完成对系统调用的处理。
8. kernel/arch/avr32/kernel/syscall_table.S,中有sys_call_table(系统调用系统call)的定义
9. kernel/arch/arm/kernel/entry-armv.S和entry-header.S,中有 ARM Linux的异常向量表
    __vectors_start:
     ARM(    swi    SYS_ERROR0    )
     THUMB(    svc    #0        )
     THUMB(    nop            )
        W(ldr)    pc, .LCvswi + stubs_offset//另外有定义.LCvswi: .word    vector_swi;所以最终执行到了vector_swi
        W(b)    vector_irq + stubs_offset//定义在vector_stub    irq, IRQ_MODE, 4; 是Interrupt dispatcher
    __vectors_end:    
10. 总而言之,system call是用户空间程序用系统软中断(0x80)模拟出现异常,然后进入内核空间的异常处理handler,-->vector_swi-->读取相关寄存器获取系统调用号(4)->参照sys_call_table对应到sys_XXX(sys_write)->进入vfs_write-->???
11. system all最多可传7个参数保存在(R0--R6),R7->syscall number, R8->syscall table pointer&linux syscall, R9->Current thread_info,这些在kernel/arch/arm/kernel/entry-header.S中有说明
原创粉丝点击