[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才有内容。


相关文章

分类

2 Comments

冬瓜头 said:

有一个地方不太懂,mmap之后文件的内容是全部读入内存的?我之前的理解是mmap之后只是page对应,但是内容不是都读入内存吧?

DongHao Author Profile Page said:

你的理解是对的:如果对一个文件调用了mmap,此文件的内容不会全部读入内存。所以我的代码里对 page = find_get_page(file->mapping, 0) 还要加一个if来判断,如果此文件从来没被读过(所有内容都没被cache),这个find_get_page返回的就一定会是NULL :)

留言:

关于文章

This page contains a single entry by DongHao published on 03 10, 2010 5:53 PM.

[linux-kernel] 实现支持poll的驱动设备 was the previous entry in this blog.

[linux-kernel] 进程退出时能做些什么? is the next entry in this blog.

Find recent content on the main index or look in the 存档 to find all content.