zoukankan      html  css  js  c++  java
  • linux syscall 从2.6.18开始变化不用_syscallN

    最近在做Android,其中一个任务是写一个能在Linux命令行运行的测试AP,运行这个AP就能关闭设备电源,即Power Off。
     
    在 Linux内核中已经找到了关闭电源的函数kernel_power_off(),然后也知道了在sys_reboot()函数中调用  kernel_power_off()的,但是linux的应用程序怎么调用sys_reboot()呢? 经过1天的研究,终于搞明白了
     
    这样的函数属于linux的系统调用函数(System call),需要用system call的方式调用,一共有下面3中途径:
     
    一、使用标准C库函数
     
        例如我们使用open(), read(), write()等标准C函数时,实际上是经过C库包装了的sys_open(),sys_read(),sys_write()等函数,这个包装过程不用我们操心。这应该是属于隐性调用system call。
     
    二、在Linux 2.6.18以前版本
     
        include/asm-arm/unistd.h文件中定义了7个_syscall宏,分别是:
     
    _syscall0(type, name)  
    _syscall1(type, name,type1,arg1)  
    _syscall2(type, name,type1,arg1,type2,arg2)  
    _syscall3(type, name,type1,arg1,type2,arg2,type3,arg3)  
    _syscall4(type, name,type1,arg1,type2,arg2,type3, arg3,type4,arg4)  
    _syscall5(type, name,type1,arg1,type2,arg2,type3, arg3,type4,arg4,type5,arg5)  
    _syscall6(type, name,type1,arg1,type2,arg2,type3, arg3,type4,arg4,type5,arg5,type6,arg6)
     
           这7个宏是用来产生系统调用的函数名的,其中type表示系统调用的返回值类型,name表示该系统调用的名称,typeN、argN分别表示第N个参数的类型和名称,它们的数目和_syscall后面的数字一样大。
     
           另外,include/linux/syscalls.h文件中定义有所用系统调用函数的原型,例如:
     
    asmlinkage int sysinfo(struct sysinfo * info);
     
           在需要系统调用的时候,先找到要调用的函数的声明,看有多少个参数,然后用上面7个宏中的对应的一个,产生函数名,还是以sysinfo为例:
     
    _syscall1(int, sysinfo, struct sysinfo *, info);
     
          然后在调用的地方直接用sysinfo()函数就可以了:
     
    struct sysinfo s_info;  
    int error;  
     
    error = sysinfo(&s_info);  
     
     
    三、在Linux 2.6.19之后的版本
     
          上面的7个宏明显有问题:不近麻烦,而且最多只有6个参数,在2.6.19以后的linux中,废除了_syscallx这7和宏,而使用syscall()函数,这个函数定义在syscall.h中:
     
    int syscall(int number, ...); 
     
          有一个新的概念:系统调用号,就是所用系统调用对应的编号,它们定义在include/asm-arm/unistd.h中。
     
          当需要系统调用时,直接用这个函数,参数number就是需要的函数的系统调用号,例如上面的例子就变成:
     
    struct sysinfo s_info;  
    syscall(__NR_sysinfo, &s_info);
     
    上面的方法中描述的目录可能每个平台上都不太一样,但大概都差不多,文件名应该是一样的

  • 相关阅读:
    模拟登陆江西理工大学教务系统
    python3爬虫 -----华东交大校园新闻爬取与数据分析
    以selenium模拟登陆12306
    PAT (Basic Level) Practice (中文)1076 Wifi密码 (15 分)
    PAT (Basic Level) Practice (中文)1047 编程团体赛 (20 分)
    PAT (Basic Level) Practice (中文)1029 旧键盘 (20 分)
    PAT (Basic Level) Practice (中文)1016 部分A+B (15 分)
    PAT (Basic Level) Practice (中文)1031 查验身份证 (15 分)
    PAT (Basic Level) Practice (中文)1041 考试座位号 (15 分)
    PAT (Basic Level) Practice (中文)1037 在霍格沃茨找零钱 (20 分)
  • 原文地址:https://www.cnblogs.com/mull/p/4477839.html
Copyright © 2011-2022 走看看