岁月联盟 · 中国技术网 本站主页 | 安全认证 | 用户服务 | 技术论坛
新闻快报 | 新手学堂 | 黑客特区 | 程序语言 | 数 据 库 | 防 火 墙 | 路由交换 | 系统集成 | 服 务 器 | 存储备份 | 考试认证
Windows | Linux | Java | 协议分析 | 问题解答 | 进程大全 | 网页设计 | 多 媒 体 | 图库资料 | 软件下载 | 站内下载
  您现在的位置: 岁月联盟 >> Linux频道 >> 系统管理 >> 内核技术 >> Linux频道正文
使用 Linux 系统调用的内核命令
作者:未知 文章来源:本站整理 点击数: 更新时间:2007-12-18 17:31:50
类型),可以使用 get_userput_user 轻松地实现。这两个宏都包含一个值以及一个指向变量的指针。get_user 函数将用户空间地址(ptr)指定的值移动到所指定的内核变量(var)中。 put_user 函数则将内核变量(var)指定的值移动到用户空间地址(ptr)。 如果成功,这两个函数都返回 0:

int get_user( var, ptr );

int put_user( var, ptr );


    要移动更大的对象,例如结构或数组,您可以使用 copy_from_usercopy_to_user 函数。这些函数将在用户空间和内核之间移动完整的数据块。 copy_from_user 函数会将一块数据从用户空间移动到内核空间,copy_to_user 则会将一块数据从内核空间移动到用户空间:

unsigned long copy_from_user( void *to, const void __user *from, unsigned long n );

unsigned long copy_to_user( void *to, const void __user *from, unsigned long n );


     最后,您可以使用 strncpy_from_user 函数将一个以 NULL 结尾的字符串从用户空间移动到内核空间中。在调用这个函数之前,您可以通过调用 strlen_user 宏来获得用户空间字符串的大小:

long strncpy_from_user( char *dst, const char __user *src, long count );

strlen_user( str );


    这些函数为内核和用户空间之间的内存移动提供了基本功能。实际上还可以使用另外一些函数(例如减少执行检查数量的函数)。您可以在 uaccess.h 中找到这些函数。

 

上一页  [1] [2] [3] [4] 下一页  

使用系统调用

    现在内核已经使用新系统调用完成更新了,接下来看一下从用户空间应用程序中使用这些系统调用需要执行的操作。使用新的内核系统调用有两种方法。第一种方法非常方便(但是在产品代码中您可能并不希望使用),第二种方法是传统方法,需要多做一些工作。

    使用第一种方法,您可以通过 syscall 函数调用由其索引所标识的新函数。使用 syscall 函数,您可以通过指定它的调用索引和一组参数来调用系统调用。例如,清单 5 显示的简单应用程序就使用其索引调用了 sys_getjiffies


清单 5. 使用 syscall 调用系统调用

                

#include <linux/unistd.h>

#include <sys/syscall.h>



#define __NR_getjiffies		320



int main()

{

  long jiffies;



  jiffies = syscall( __NR_getjiffies );



  printf( "Current jiffies is %lx\n", jiffies );



  return 0;

}


    正如您所见,syscall 函数使用了系统调用表中使用的索引作为第一个参数。如果还有其他参数需要传递,可以加在调用索引之后。大部分系统调用都包括了一个 SYS_ 符号常量来指定自己到 __NR_ 索引的映射。例如,使用 syscall 调用 __NR_getpid 索引:

                syscall( SYS_getpid )


   syscall 函数特定于架构,使用一种机制将控制权交给内核。其参数是基于 __NR 索引与 /usr/include/bits/syscall.h 提供的 SYS_ 符号之间的映射(在编译 libc 时定义)。永远都不要直接引用这个文件;而是要使用 /usr/include/sys/syscall.h 文件。

    传统的方法要求我们创建函数调用,这些函数调用必须匹配内核中的系统调用索引(这样就可以调用正确的内核服务),而且参数也必须匹配。Linux 提供了一组宏来提供这种功能。_syscallN 宏是在 /usr/include/linux/unistd.h 中定义的,格式如下:

                _syscall0( ret-type, func-name )

_syscall1( ret-type, func-name, arg1-type, arg1-name )

_syscall2( ret-type, func-name, arg1-type, arg1-name, arg2-type, arg2-name )


上一页  [1] [2] [3] [4] 下一页


  • 上一个Linux频道:
  • 下一个Linux频道:
  •  
    热门文章
    推荐文章
    关于我们 | 发展历程 | 网站地图 | 广告服务 | 招贤纳士 | 战略合作 | 友情链接 | 著作声明 | 联系我们
    Copyright © 2002-2007 SYUE All rights reserved.
    E_mail:Admin@Syue.Com 皖ICP备05004589号
    未经授权禁止转载、摘编、复制或建立镜像.如有违反,追究法律责任.
    天龙八部私服 传世私服 传奇世界私服 传奇私服 bet365 天龙八部私服 热血江湖私服 英雄合击传奇私服 热血江湖私服 bet365 bet365