当前位置:  技术问答>linux和unix

内核宏, 问题。 大家指教。

    来源: 互联网  发布时间:2016-10-16

    本文导语:  #define SYSCALL_DEFINEx(x, name, ...) asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__)) 系统调用的宏里: __SC_DECL __SC_CAST __SC_LONG 以上这三个东西是干什么的, 在哪可以找到解释? 注意我是想知道__SC_DECL __SC_CAST __SC_LONG三...

#define SYSCALL_DEFINEx(x, name, ...)
asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))

系统调用的宏里:
__SC_DECL
__SC_CAST
__SC_LONG
以上这三个东西是干什么的, 在哪可以找到解释?

注意我是想知道__SC_DECL __SC_CAST __SC_LONG三个东西, 关于__VA_ARGS__我知道是什么,所以大家帮忙解释下:
__SC_DECL
__SC_CAST
__SC_LONG



谢谢了。

最好给个例子。

|
我参考http://blog.chinaunix.net/u1/51562/showart_1981255.html
看懂了一部分
如果你仅仅问的是
__SC_DECL 
__SC_CAST 
__SC_LONG ,那还是能解答你的疑问

#define __SC_DECL1(t1, a1)      t1 a1
  72#define __SC_DECL2(t2, a2, ...) t2 a2, __SC_DECL1(__VA_ARGS__)
  73#define __SC_DECL3(t3, a3, ...) t3 a3, __SC_DECL2(__VA_ARGS__)
  74#define __SC_DECL4(t4, a4, ...) t4 a4, __SC_DECL3(__VA_ARGS__)
  75#define __SC_DECL5(t5, a5, ...) t5 a5, __SC_DECL4(__VA_ARGS__)
  76#define __SC_DECL6(t6, a6, ...) t6 a6, __SC_DECL5(__VA_ARGS__)
  77
  78#define __SC_LONG1(t1, a1)      long a1
  79#define __SC_LONG2(t2, a2, ...) long a2, __SC_LONG1(__VA_ARGS__)
  80#define __SC_LONG3(t3, a3, ...) long a3, __SC_LONG2(__VA_ARGS__)
  81#define __SC_LONG4(t4, a4, ...) long a4, __SC_LONG3(__VA_ARGS__)
  82#define __SC_LONG5(t5, a5, ...) long a5, __SC_LONG4(__VA_ARGS__)
  83#define __SC_LONG6(t6, a6, ...) long a6, __SC_LONG5(__VA_ARGS__)
  84
  85#define __SC_CAST1(t1, a1)      (t1) a1
  86#define __SC_CAST2(t2, a2, ...) (t2) a2, __SC_CAST1(__VA_ARGS__)
  87#define __SC_CAST3(t3, a3, ...) (t3) a3, __SC_CAST2(__VA_ARGS__)
  88#define __SC_CAST4(t4, a4, ...) (t4) a4, __SC_CAST3(__VA_ARGS__)
  89#define __SC_CAST5(t5, a5, ...) (t5) a5, __SC_CAST4(__VA_ARGS__)
  90#define __SC_CAST6(t6, a6, ...) (t6) a6, __SC_CAST5(__VA_ARGS__)

#define __SYSCALL_DEFINEx(x, name, ...)                                 
 181        asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__));           
 182        static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__));       
 183        asmlinkage long SyS##name(__SC_LONG##x(__VA_ARGS__))            
 184        {                                                               
 185                __SC_TEST##x(__VA_ARGS__);                              
 186                return (long) SYSC##name(__SC_CAST##x(__VA_ARGS__));    
 187        }                                                               
 188        SYSCALL_ALIAS(sys##name, SyS##name);                            
 189        static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__))
 190



可以看到这些都是递归宏
以sendto系统调用为例进行分析:
它的定义为:
SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
        unsigned, flags, struct sockaddr __user *, addr,
        int, addr_len)
那么最终
 asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__));
的__SC_DECL##x(__VA_ARGS__);就会展开成
int fd, void __user * buff, size_t len,unsigned flags, struct sockaddr __user * addr,  int addr_len
完全是函数参数原型

而__SC_CAST##x(__VA_ARGS__)
就会展开成
(int) fd, (void __user *) buff, (size_t) len,(unsigned )flags, (struct sockaddr __user * )addr,  (int) addr_len

__SC_LONG##x(__VA_ARGS__)展开成
(long) fd, (long) buff, (long) len,(long)flags, (long )addr,  (long) addr_len

    
 
 

您可能感兴趣的文章:

  • 请问重新编译LINUX内核是否能将没有用的外设的驱动程序删除并减少内核占有内存的资源?请好心人仕指教!
  • linux 内核进程堆问题,大家指教
  • 内核启动参数,大家指教
  • 升级内核到(2.6.6)后,鼠标(p/s2口)不能动了,请指教?
  • 内核进程线程问题,大家指教
  • linux编译的内核不能启动,是怎么回事,请高手指教!
  • #####编译内核使支持 video for linux 的问题!!!!!!!!!!!!!!! 请高手指教
  • 各位前辈,请指教,我按照网上的教程编译不了内核
  • redhat 9.0 下驱动程序开发是否需要重新编译内核?求高手指教!
  • 内核编译成功,但是用Loadlin从DOS引导出错!请高手指教!
  • 内核编译初期问题,大家指教
  • Linux2.6内核mmap的问题! 请高手指教!
  • 高手指教:正在学习-linux内核完全注释(0.11),对于linux/init/main.c有个问题,请帮忙
  • 各位大侠,我想编译一个多文件内核模块,但是无论怎么编,tcp_phas.c这个文件总是不编译(我在这个里面写上乱行不报错),下面是两个方法,请指教。
  • 编译内核出错,高手指教
  • 内核栈~ 内核线程 ~用户线程 之间关系 问题
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项 iis7站长之家
  • 新手的菜鸟问题:不同内核版本下编译的程序能否互相调用,是否需要在同一内核下重新编译.
  • 问一个小白问题,在交叉编译时,系统内核和开发板的内核有没有相关性?
  • Android 内核移植问题 要求识别SATA硬盘 请问内核的make menuconfig 要如何配置?求高手
  • 修改内核代码问题:如何编译修改的单个文件而不用重建整个内核?
  • 请教一个问题:程序在Linux 2.4.20内核上跑无问题。但在2.4.19内核上跑就出现段错误现象。查了一星期,毫无头绪,万望各位指点。
  • 内核版本问题 GCC版本问题
  • linux内核安装问题 , 有点疑惑~
  • 内核升级问题!!!!!
  • 内核问题
  • 问个编译内核的简单问题~~~
  • 内核重编译前的小白问题
  • 请教一个linux进程内核栈的问题
  • 升级linux内核时,2.6.21.5内核编译成功,但启动时出现panic,请看问题详细描述!
  • 菜鸟问题,内核编译以后,启动不了。系统提示内核文件文件找不到!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux内核中影响tcp三次握手的一些协议配置
  • Fedora Core 2自带的内核升级程序下载下来内核后,要不要再编译一遍内核?
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • 进程内核栈和操作系统内核栈的关系
  • CentOS 6内核升级:下载编译启用新内核版本详细过程
  • Linux中内核线程不访问内核态地址空间?
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • 2.6内核下编译2.4内核
  • linux内核中的likely宏和unlikely宏介绍及用法
  • 谁能提供kgdb内核补丁内核模块的下载
  • CentOS 6.5 下载地址及如何升级内核(kernel)版本到 3.10.28
  • 编译新内核后怎么进入原来内核
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • 请问linux中如何判断内核是否已经启动。(在内核中写程序)
  • docker使用的技术之Container内核原理介绍
  • 内核模块跟内核版本不匹配????????
  • 请教:如何安装新内核(rpm包)而不同原来得内核冲突?? 在线等待!!
  • linux为什么要升级内核?升级内核有何作用?
  • 内核升级后,如何在新的内核中加载显卡驱动?
  • 内核源码和结果make过的内核源码有什么区别
  • 不重新编译内核能修改内核函数吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3