预备知识:
__VA_ARGS__
首先来解释一下SYSCALL_DEFINEx 中的x表示上层应用函数的参数个数,比如select()函数有5个参数,因此会对应到SYSCALL_DEFINE5。sname表示的就是上层应用程序中函数的名字,如select。
long, timeout_msecs)
SYSCALL_DEFINE3是个宏,在/include/linux/syscalls.h 中定义了如下的宏:
- #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
#define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
- #define SYSCALL_DEFINEx(x, name, ...)\
asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
- #define __SYSCALL_DEFINEx(x, name, ...) \
- asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
- #define __SC_DECL1(t1, a1) t1 a1
- #define __SC_DECL2(t2, a2, ...) t2 a2, __SC_DECL1(__VA_ARGS__)
- #define __SC_DECL3(t3, a3, ...) t3 a3, __SC_DECL2(__VA_ARGS__)
- #define __SC_DECL4(t4, a4, ...) t4 a4, __SC_DECL3(__VA_ARGS__)
- #define __SC_DECL5(t5, a5, ...) t5 a5, __SC_DECL4(__VA_ARGS__)
- #define __SC_DECL6(t6, a6, ...) t6 a6, __SC_DECL5(__VA_ARGS__)
long, timeout_msecs
也就是 struct pollfd __user *, ufds, unsigned int, nfds,long, timeout_msecs
最后,我们就清楚的了解了系统调用的过程,其他系统调用同理
poll调用过程:
app:poll
kernerl:sys_poll(struct pollfd __user *ufds, unsigned int nfds,long timeout);
即:SYSCALL_DEFINE3(poll, struct pollfd __user *, ufds, unsigned int, nfds,long, timeout_msecs)
do_sys_poll(ufds, nfds, to)
do_sys_poll();
poll_initwait(&table);
init_poll_funcptr(&pwq->pt, __pollwait); 即init_poll_funcptr(&table->pt, __pollwait);
pt->qproc = qproc; 即table->pt->qproc=__pollwait;
fdcount = do_poll(nfds, head,&table, timeout);
do_pollfd(pfd, pt)
if(file->f_op && file->f_op->poll)
mask= file->f_op->poll(file, pwait); //与驱动里面的poll函数相联系
poll_wait(file, &button_waitq, wait); 即 poll_wait(file, &button_waitq,pwait);
p->qproc(filp, wait_address, p); 即:__pollwait(file,&button_waitq,table->pt)//把当期进//程加进等 //待队列;
schedule_hrtimeout_range(to, slack, HRTIMER_MODE_ABS)