通常,系统调用靠C库支持。用户程序通过包含标准头文件并和C库链接,就可以使用系统调用(或者调用库函数,再由库函数实际调用)。但如果你仅仅写出系统调用,glibc库恐怕并不提供支持。值得庆幸的是,Linux本身提供了一组宏,用于直接对系统调用进行访问。它会设置好寄存器并调用陷人指令。这些宏是_syscalln(),其中n的范围从0到6。代表需要传递给系统调用的参数个数,这是由于该宏必须了解到底有多少参数按照什么次序压入寄存器。举个例子,open()系统调用的定义是:

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

而不靠库支持,直接调用此系统调用的宏的形式为:

#define NR_ open 5
syscall3(long, open, const char*,filename, int, flags, int, mode)

这样,应用程序就可以直接使用open()
对于每个宏来说,都有2+ n个参数。
第一个参数对应着系统调用的返回值类型。
第二个参数是系统调用的名称。再以后是按照系统调用参数的顺序排列的每个参数的类型和名称。
_NR_ open在<asm/unistd.h>中定义,是系统调用号。该宏会被扩展成为内嵌汇编的C函数。由汇编语言执行前一节所讨论的步骤,将系统调用号和参数压入寄存器并触发软中断来陷入内核。调用open()系统调用直接把上面的宏放置在应用程序中就可以了。

让我们写一个宏来使用前面编写的foo()系统调用,然后再写出测试代码炫耀一下我们所做的努力。

#define NR foo 283
_sysca110(long, foo)
int main()
{
long stack size;
stack_ size=foo();
printf("The kernel stack
size is 81d/n",stack_ size);
return;
}

从用户空间直接访问系统调用相关推荐

  1. linux用户空间寄存器,在Linux用户空间中访问硬件寄存器

    我想写Linux用户空间中OMAP3530上的硬件寄存器.请找到下面的代码. Mmap返回错误: 内存映射失败.错误-1 mmap:权限被拒绝 #include #include #include # ...

  2. linux包含绝对路径头文件,linux-kernel - 访问用户空间内存访问函数(如access_ok(),get_from_user())需要包含的头文件的确切路径。 - 堆栈内存溢出...

    我在linux-headers-3.2.0-49中搜索了用户内存访问功能. 它在uaccess.h头文件中定义,但是uaccess.h文件太多. 下面是我在linux-headers-3.2.0-49 ...

  3. Linux内核访问用户空间文件:get_fs()/set_fs()的使用

    测试环境:Ubuntu 14.04+Kernel 4.4.0-31 关键词:KERNEL_DS.USER_DS.get_fs().set_fs().addr_limit.access_ok. 参考代码 ...

  4. 用户空间访问I2C设备驱动

    2012-01-11 15:33:43 标签:Linux I2C 字符设备 设备驱动 用户空间 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. ...

  5. AndroidM 内核空间到用户空间接口类型

    Android系统中, 驱动程序因商业需求分为运行在用户空间的hardware层以及运行在内核空间的驱动程序, 大多情况下内核驱动都需要提供用户空间访问的接口. Linux内核空间到用户空间的接口有主 ...

  6. I/O流(包括操作系统与内核,用户空间),I/O工作原理,Java I/O流的设计及Java IO系统

    文章目录 一.操作系统与内核 1.1操作系统 1.2内核 1.3 关系图 二.内核空间和用户空间 2.1:目的: 2.2.内核空间(Kernel-space): 2.3.用户空间(User-space ...

  7. linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间

    linux驱动程序一般工作在内核空间,但也可以工作在用户空间.下面我们将详细解析,什么是内核空间,什么是用户空间,以及如何判断他们. Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,L ...

  8. linux之用户空间和内核空间

    linux驱动程序一般工作在内核空间,但也可以工作在用户空间.下面我们将详细解析,什么是内核空间,什么是用户空间,以及如何判断他们. Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,L ...

  9. linux 内核将两个设备相关联,linux用户空间和内核空间交换数据

    转载地址:http://www.poluoluo.com/server/201107/138420.html 在研究dahdi驱动的时候,见到了一些get_user,put_user的函数,不知道其来 ...

最新文章

  1. python中的切片和join的妙用
  2. 爱之箭发射(las)
  3. 对Spring的一些个人理解
  4. 与毒”共舞30年!清华美女研究生为何放弃高薪,选择特招入伍?背后的原因令人泪崩......
  5. Java Spring 异常处理
  6. VM 虚拟机 centos7 安装redis
  7. java-如何反编译
  8. CSS揭秘--笔记--滚动提示
  9. 仪电电子“结盟”复旦大数据学院
  10. 甘教课标版小学生计算机课,测评:《第6课 制作简单的表格教案》小学信息技术甘教课标版五年级上册教案4696(2)...
  11. 快递管理系统JavaI(连接数据库)
  12. 本地搭建私有云盘:虚拟机安装群晖NAS 1/5
  13. SharedPreferences 使用方法详解
  14. Day66 Web开发7 旅游详情页面
  15. qqwry.dat的数据结构解释
  16. 洛谷P1080 [NOIP2012 提高组] 国王游戏(贪心,高精度)
  17. HBase、Phoenix
  18. 单片机复试面试(一)
  19. 为什么要基于模型设计?
  20. HTML中img标签的src属性为绝对路径时,在IE中图片可显示,在firefox中不行

热门文章

  1. 【X264系列】之不同强度的printf
  2. makefile编译脚本
  3. matlab中的lsqcurvefit使用
  4. HEVC测试序列网址和账号
  5. c++ java setobjectarrayelement_java中jni的使用:C/C++操作java中的数组
  6. 华为路由器ws5200虚拟服务器,想处理垃圾路由吗?那就先入手这款华为WS5200路由器吧...
  7. 服务器和硬盘如何区分,服务器硬盘和普通硬盘区别介绍
  8. 定值保险计算举例_农村养老保险管理系统(在线查询)https://www.chashebao.com/yanglaobaoxian/17556.h...
  9. jq post 表单提交文件_Power Query 中使用POST方法进行网络抓取的尝试
  10. 技术胖Flutter第四季-19导航父子页面的跳转返回