话说2.6 内核 系统调用中的sys_open ,sys_read 不见了???

来源:互联网 发布:阿里云连接器 编辑:程序博客网 时间:2024/04/27 23:00

话说2.6 内核 系统调用中的sys_open ,sys_read 不见了???

在2.6的xx以后的fs/open.c好像就没有了sys_open的足迹,找了半天也找不到,但是它又的确的使用了,

困惑了n久之后,小小的发现了一个#define SYSCALL_DEFINE3 SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, int, mode)
1050 {
1051 long ret;
1052 
1053 if (force_o_largefile())
1054 flags |= O_LARGEFILE;
1055 
1056 ret = do_sys_open(AT_FDCWD, filename, flags, mode);
1057 /* avoid REGPARM breakage on x86: */
1058 asmlinkage_protect(3, ret, filename, flags, mode);
1059 return ret;
1060 }

-----------------------------------
#define SYSCALL_DEFINE0(name) asmlinkage long sys_##name(void)
99 #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
100 #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
101 #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
102 #define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
103 #define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
104 #define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
105 



#define SYSCALL_DEFINEx(x, name, ...) \
124 asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__)); \
125 static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__)); \
126 asmlinkage long SyS##name(__SC_LONG##x(__VA_ARGS__)) \
127 { \
128 __SC_TEST##x(__VA_ARGS__); \
129 return (long) SYSC##name(__SC_CAST##x(__VA_ARGS__)); \
130 } \
131 SYSCALL_ALIAS(sys##name, SyS##name); \
132 static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__))
-------------------------------------------------------

##表示将两个相邻的宏标记连接成一个整体标记,所以当第一次替换后成为
SYSCALL_DEFINEx(2, _open,...),然后再次替换对于asmlinkage long sys##name(...);
执行替换后变成asmlinkage long sys_open(....);


再附上常用的预处理器宏:
#define  定义一个预处理器宏 

#undef     取消一个预处理器宏

#include   插入另一个源文件的文本

#if        测试一个常量表达式的值

#ifdef     测试如果一个宏已被定义

#ifndef    测试如果一个宏没有被定义

#else      测试失败后

#endif     终止条件文本

#line      提供用于编译器信息的行号

#elif      与else if相似

defined    判断一个宏是否被定义,已定义返回1,否则返回0,其与#if和#elif联用

#          将#后的宏标记转化为字符串

##         将两个相邻的宏标记连接成一个整体标记

#pragma    指定依赖编译器的信息

#error     用指定的信息产生一个编译时错误