首先分析一下sys_read系统调用(内核版本为2.6.19.4)。
源代码如下(摘自fs/read_write.c)
这里用到了fget_light(),file_pos_read(),vfs_read(),file_pos_write(),fput_light()。
- file_pos_read()和file_pos_write()(均位于fs/read_write.c)用来读取当前文件指针(即当前文件操作的位置)
- fget_light()和fput_light()(位于fs/file_table.c和include/linux/file.h)必须是成对出现的!fget_light在当前进程的struct files_struct中根据所谓的用户空间文件描述符fd来获取文件描述符。另外,根据当前fs_struct是否被多各进程共享来判断是否需要对文件描述符进行加锁,并将加锁结果存到一个int中返回,