免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2930 | 回复: 4
打印 上一主题 下一主题

新人求助关于系统调用的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-08 20:15 |只看该作者 |倒序浏览
本人在看epoll内核代码时(linux-3.0)发现,提供的系统调用epoll_create()对应内核实现应该为sys_epoll_create()。
但是我找遍整个内核源码都没有找到sys_epoll_create()的实现,只找到asmlinkage long sys_epoll_create(int size);

在eventpoll.c中发现几个怪异的函数定义,如
SYSCALL_DEFINE1(epoll_create1, int, flags);

SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd,
                struct epoll_event __user *, event);
等。

本人刚刚接触内核,想请教各位前辈如何去找一个系统调用对应的系统实现(就以epoll_create()为例)。

非常非常感谢!!



SYSCALL_SPU(epoll_create)
asmlinkage long sys_epoll_create(int size);
cond_syscall(sys_epoll_create);
#define __NR_epoll_create        255
#define __NR_epoll_create                (__NR_Linux + 24

论坛徽章:
0
2 [报告]
发表于 2011-08-08 23:03 |只看该作者
我之前总结过:

http://www.tek-life.org/2011/06/28/linux-syscall-extend/

不知道从哪个版本的内核开始,系统调用变成宏了。在2.6.38的内核里面追踪了一下,以SYSCALL_DEFINE1为例:


SYSCALL_DEFINE1(name,…)展开sys_name,后面的数字,若为1则是一个参数,若为2则为2个参数

具体的宏,展开跟踪流程如下:
#define SYSCALL_DEFINE1(name, …) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
                                        |   
                                        v   
                        #define SYSCALL_DEFINEx(x, sname, …)              \
                                  __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
                                         |                             
                                         v                             
                        #define __SYSCALL_DEFINEx(x, name, …)                 \
                         asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
                                                     \   
                                                      \   
                                         #define __SC_DECL1(t1, a1)  t1 a1
  
拿一个例子来对照一下:
SYSCALL_DEFINE1(brk, unsigned long, brk)  
              |                              
              v   
SYSCALL_DEFINE1(1, _brk, unsigned long, brk)
              |                              
              v   
__SYSCALL_DEFINE1(1, _brk, unsigned long ,brk)
              |                    
              v   
asmlinkage long sys_brk(unsigned long brk)
                                    

SYSCALL_DEFINE1(brk, unsigned long, brk)—> long sys_brk(unsigned long brk)

{
    unsigned long rlim, retval;
    unsigned long newbrk, oldbrk;
    struct mm_struct *mm = current->mm;
    unsigned long min_brk;
        
    ……

    retval = mm->brk;
    up_write(&mm->mmap_sem);
    return retval;
}

论坛徽章:
0
3 [报告]
发表于 2011-08-09 08:14 |只看该作者
回复 2# omycle 非常感谢!

论坛徽章:
0
4 [报告]
发表于 2011-08-09 09:29 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2011-08-09 09:30 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP