话说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(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 用指定的信息产生一个编译时错误
相关文章推荐
- 话说2.6 内核 系统调用中的sys_open ,sys_read 不见了???
- open系统调用在内核中的流程分析
- 了解open/read/write/close等文件相关系统调用接口,纵向对比fd与FILE结构体
- linux内核文件IO的系统调用实现分析(open)
- linux文件系统之open系统调用(基于3.4.9内核)
- Linux--Sys_Read系统调用过程分析
- 【Linux&Unix--open/close/write/read系统调用】
- linux文件系统之read系统调用(基于3.4.9内核)
- linux 2.6.11内核文件IO的系统调用实现分析(read,write)(转载)
- open,lseek,read,write,close系统调用《unix环境高级编程读书笔记》(1)
- 【Linux&Unix--open/close/write/read系统调用】
- linux2.6内核系统调用的增加方法
- 四种读写文件的方式:系统调用(open/read/write),C语言(fopen,fgets, fputs),C++(ifstream, ofstream getline,)泛型算法
- 关于系统调用open,write,read,close及库函数fopen,fwrite,fread,fclose的使用
- open系统调用在内核中的流程浅析
- 文件编程中的两套操作:标准C库(fread, fwrite,fclose,fopen...)和 系统调用(open, read, write...)
- 内核调用open read write
- read 系统调用剖析--file_operations中read/write函数与内核系统调用的关系
- 简介几种系统调用函数:write、read、open、close、ioctl
- Linux&Unix--open/close/write/read系统调用】