[linux-kernel] 内核里读取mmap文件的内容
作者:董昊 (要转载的同学帮忙把名字和博客链接http://oldblog.donghao.org/uii/带上,多谢了!)
项目中遇到需求,要在内核里读取一个文件的头部内容,这个文件已经mmap了,内容都在内存里。我试了一个较为简洁可靠的方法:
sszie_t sample_read(struct file* file, char __user* buff, loff_t* pos)
{
struct page* page;
char* buff;
if (file->f_mapping)
{
if ((page = find_get_page(file->mapping, 0))
{
buff = page_address(page);
if (buff)
{
/* you can read buff content now */
}
}
}
}
find_get_page是从一堆page里找到偏移量为0的那个page,然后从struct page里拿到真正内容的内存地址。好像已经mmap的文件file->mapping才有内容。
相关文章
- [kernel] linux在多核处理器上的负载均衡原理 - 07 20, 2010
- [kernel] 在release方法里,而不是flush方法里释放 - 06 01, 2010
- [linux] tail和poll无关 - 06 01, 2010
有一个地方不太懂,mmap之后文件的内容是全部读入内存的?我之前的理解是mmap之后只是page对应,但是内容不是都读入内存吧?
你的理解是对的:如果对一个文件调用了mmap,此文件的内容不会全部读入内存。所以我的代码里对 page = find_get_page(file->mapping, 0) 还要加一个if来判断,如果此文件从来没被读过(所有内容都没被cache),这个find_get_page返回的就一定会是NULL :)