您的位置:首页 > 运维架构

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

2012-08-10 12:56 696 查看


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

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

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

-----------------------------------
#define SYSCALL_DEFINE0(nameasmlinkage 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 (longSYSC##name(__SC_CAST##x(__VA_ARGS__));
\
130 } \
131 SYSCALL_ALIAS(sys##nameSyS##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     用指定的信息产生一个编译时错误
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编译器 测试 user x86