Chinaunix首页 | 论坛 | 博客
  • 博客访问: 22425
  • 博文数量: 18
  • 博客积分: 810
  • 博客等级: 准尉
  • 技术积分: 205
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-10 21:09
文章分类
文章存档

2009年(15)

2008年(3)

我的朋友

分类: LINUX

2009-04-03 11:29:42

syscalls:

    连接硬件设备和应用程序

         系统调用是用户空间访问内核的唯一手段;除异常和陷入,是内核唯一的合法入口。

         C库或其他语言库封装了系统调用,应用程序只需要调用封装后的API

         通常通过函数进行调用,需要定义一个或多个输入参数,可能会使系统状态发生变化。

         每个系统调用有独一无二的系统调用号。

         系统调用表sys_call_table,在/boot/System.map中。

                       /boot/System.map:表项以32位(4字节)存放。

 

    用户空间的参数通过寄存器传入内核,X86系统用ebxecxedxesiedi存放前5个参数;给用户空间的返回值通过eax寄存器传送(x86中)。

        

系统调用注册过程

         (1) 编写系统调用。放入kernel/sys.c中,或者其他与之功能密切联系的代码中

         (2) 注册入系统调用表entry.S

ENTRY(sys_call_table)
        .long sys_restart_syscall /* 0 -系统调用号*/
        .long sys_exit
        .long sys_fork
        .long sys_read
        .long sys_write
        .long sys_open /* 5 */

...


           (3) 把系统调用号加入

 

/*
 * This file contains the system call numbers.
 */


#define __NR_restart_syscall 0
#define __NR_exit 1
#define __NR_fork 2
#define __NR_read 3
#define __NR_write 4
#define __NR_open 5

...

 

 

直接访问系统调用_syscalln() 

                                       n=06,代表传递给系统调用的参数个数;

                                       每个宏,都有2+2×n个参数;

                                       第一个对应系统调用的返回值类型;

                                       第二个对应系统调用名称;

                                       后面的按照调用参数顺序排列每个参数的类型和名称。

          例如:open()系统调用

                       C库支持:long open(const char *filename, int flags, int mode)

                           直接调用宏:

                       #define __NR_open 5

                           _syscall3(long, open, const char *, filename, int, flags, int, mode)

 

阅读(310) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~