Syscall系统调用Linux内核跟踪

2014-11-24 09:50:17 · 作者: · 浏览: 1

其实真正调用的还是系统函数syscall(SYS_read),也就是sys_read()函数中,在Linux2.6.37中的利用几个宏定义实现。


在Linux内核中使用下面的宏进行系统调用


其中SYSCALL_DEFINE3的宏定义如下:


##的意思就是宏中的字符直接替换,
如果name = read,那么在宏中__NR_##name就替换成了__NR_read了。
__NR_##name是系统调用号,##指的是两次宏展开.即用实际的系统调用名字代替"name",然后再把__NR_...展开.如name == ioctl,则为__NR_ioctl




不管是否定义CONFIG_FTRACE_SYSCALLS宏,最终都会执行 下面的这个宏定义:


__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)


最终会调用下面类型的宏定义:


asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
也就是我们前面提到的sys_read()系统函数。
asmlinkage通知编译器仅从栈中提取该函数的参数。所有的系统调用都需要这个限定词!这和我们上一篇文章quagga中提到的宏定义,有异曲同工之妙。


也就是宏定义中的下面代码:


代码解析:


if (file->f_op->read)
ret = file->f_op->read(file, buf, count, pos);


到此,虚拟文件系统层所做的处理就完成了,控制权交给了 ext2 文件系统层。