我修改了系统调用表,以便在用户空间调用mmap时调用我自己的mmap处理程序。 我的处理程序调用原始mmap,并根据结果选择要执行的操作。
这是一个非常简短的代码片段:
asmlinkage unsigned long my_mmap_handler(unsigned long addr,
unsigned long len,
int prot,
int flags,
int fd,
long off)
{
unsigned long ret_val = old_mmap(addr,len,prot,flags,fd,off);
if (IS_ERR((void*)ret_val))
goto end;
// Do some stuff..
end:
return ret_val;
}
在“Do some stuff”中我对实际的映射文件进行一些操作(即从文件中读取)。
问题在于:
我遇到了尝试mmap字符/块设备的程序(例如/ dev / rdi / card0)。每当我尝试从这样的文件中读取(例如使用vfs_read)时,内核会冻结(不是恐慌,但感觉有些东西在阻塞)。为什么会发生这种情况? 无论如何,我不需要对字符/块设备执行操作,所以我一直试图找到一种方法来查明给定的'struct file'是否代表一个块/字符设备,以防它只是忽略它。到目前为止没有运气。
帮助将不胜感激
答案 0 :(得分:0)
您可以通过读取文件的inode结构成员i_rdev来查明文件是块还是字符设备:
file->f_dentry->d_inode->i_rdev
它包含主要的次要值,如果它不是0则是设备
答案 1 :(得分:0)
使用预处理器宏解决它:
#define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
defined in linux/fs.h
然后可以按如下方式使用宏来确定文件指针是否“描述”特殊文件:
struct file * f;
// ...
if (special_file(file_inode(f)->i_mode))
{
/* If we're here then it is a
block/character device or FIFO/SOCKET file */
}