在分析linux 系统调用 的代码时,如何快速找到 open/read/write 标准库系统调用对应的内核处理函数呢?
查找系统调用函数定义的宏: SYSCALL_DEFINE
eg, 在vim 中直接 :cs f t SYSCALL_DEFINE, 这样搜索结果也不过300多个,可以快速找到自己想找的系统调用函数。
open 系统调用对应的内核函数在 fs/open.c 中:
SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, int, mode)
{
long ret;
if (force_o_largefile())
flags |= O_LARGEFILE;
ret = do_sys_open(AT_FDCWD, filename, flags, mode);
/* avoid REGPARM breakage on x86: */
asmlinkage_protect(3, ret, filename, flags, mode);
return ret;
}
read/write 系统调用对应的内核函数在 fs/read_write.c 中:
SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
{
struct file *file;
ssize_t ret = -EBADF;
int fput_needed;
file = fget_light(fd, &fput_needed);
if (file) {
loff_t pos = file_pos_read(file);
ret = vfs_read(file, buf, count, &pos);
trace_fs_read(fd, buf, count, ret);
file_pos_write(file, pos);
fput_light(file, fput_needed);
}
return ret;
}
SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,
size_t, count)
{
struct file *file;
ssize_t ret = -EBADF;
int fput_needed;
file = fget_light(fd, &fput_needed);
if (file) {
loff_t pos = file_pos_read(file);
ret = vfs_write(file, buf, count, &pos);
trace_fs_write(fd, buf, count, ret);
file_pos_write(file, pos);
fput_light(file, fput_needed);
}
return ret;
}
参考文章:
http://blog.csdn.net/adaptiver/article/details/7175165