科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Linux用户和内核空间之间的通信实现 (1)

Linux用户和内核空间之间的通信实现 (1)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

系统调用函数名以“sys_”开头,后面是该系统调用的名字,由此构成了221个形似sys_name()的函数名。

作者:赛迪网技术社区 来源:赛迪网技术社区 2007年10月26日

关键字: 内核 Linux

  • 评论
  • 分享微博
  • 分享邮件
 

系统调用

用户空间和内核空间之间的通信实现

● 与系统调用相关的数据结构和函数

系统调用函数名以“sys_”开头,后面是该系统调用的名字,由此构成了221个形似sys_name()的函数名。include/asm-i386/unistd.h中为每一个系统调用规定了惟一的编号,假设用name来表示系统调用的名称,那么系统调用号与系统调用响应函数的关系是:以系统调用号__NR_name作为下标,可找出系统调用表sys_call_table中对应表项的内容,它也就是该系统调用的响应函数sys_name的入口地址。

● 系统调用具体执行流程

当执行一个系统调用时,处理器跳转到地址 0xc00。

参考代码:

arch/ppc/kernel/head.S 
/* System call */
. = 0xc00
SystemCall:
EXCEPTION_PROLOG
/* EXCEPTION_PROLOG 是一个宏,负责从用户空间到内核空间的切换,并需要保存用户进程的寄存器状态*/
stw r3,ORIG_GPR3(r21)
li r20,MSR_KERNEL
rlwimi r20,r23,0,16,16 /* copy EE bit from saved MSR */
bl transfer_to_handler
.long DoSyscall 
.long ret_from_except

有关DoSyscall,它在文件arch/ppc/kernel/entry.S 中定义。这个函数最终使用系统调用编号将系统调用表的地址和索引加载,操作系统使用系统调用表将系统调用编号翻译为特定的系统调用。

系统调用表名为 sys_call_table,在 arch/ppc/kernel/misc.S 中定义。系统调用表包含有实现每个系统调用的函数的地址。

_GLOBAL(sys_call_table)
.long sys_ni_syscall /* 0 old "setup()" system call */
long sys_getegid /* 50 */
.long sys_acct
.long sys_umount /* recycled never used phys() */
.long sys_ni_syscall /* old lock syscall holder */
.long sys_ioctl /* 54 */
.long sys_fcntl /* 55 */
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章