如何将 普通文件映射到 kernel 地址空间 上 ?
本帖最后由 smartegg 于 2014-01-06 14:22 编辑众所周知,mmap 可以实现将文件映射 到用户态地址空间上。
但是我有个需求, 是要将文件映射到 内核的地址空间上, 应该怎么做呢?
自己重新实现一遍么?
估计自己重新实现mmap的话, 要做很多工作, 比如:
申请连续的内核地址空间, 将这段连续的地址空间 映射到 file 对应的page cache 上。
感觉很麻烦, 有没有简单的做法呢?
最终我的解决方案如下:
1.使用alloc_pages()+vmap
在VMALLOC_START -VMALLOC_END 的内核线性空间上分配空间。这样就可以在得到的线性空间上直接读写了。
2. 读入数据:调用inode的address_space 的 readpage方法 同步读入。
3.回写脏数据方法:检查映射的页表的 pte 是否为 dirty来 把对应的page写入磁盘。
最后感谢各位亲们的热情回复, 你们太棒了~ :)
回复 1# smartegg
内核空间中除了指定的地方如 copy_{to, from}_user(),不允许page fault产生吧,你mmap不起作用吧,只能是直接一次性把文件内容读出来!
请你详细描述下你的需求。。。为什么要把文件映射到内核空间,你是希望达到什么样的目的。 写个内核模块来做,然后辅助用户态工具?
像2楼问的,为什么要这么做? smartegg 发表于 2013-12-27 12:13 static/image/common/back.gif
众所周知,mmap 可以实现将文件映射 到用户态地址空间上。
但是我有个需求, 是要将文件映射到 ...
映射后进程自己访问相应的地址空间时,就很不方便了,感觉没有实际的用途。 回复 2# asuka2001
感谢您的回复。
我的需求是这样的:
“把整个普通磁盘文件 映射的内核内存的一段连续的虚拟地址"
这样会有如下优点:
1.操作起来比较方便, 直接读写内存即可。
2.不需要考虑哪块内存为脏( 依赖最后脏的会被回刷磁盘 )
3.不需要消耗大量物理内存, 因为只需要虚拟地址连续即可。
我有点迷茫, 不知道该怎么实现, 是不是有点麻烦呢?
只是想不通映射成用户态地址空间挺简单的, 想映射成内核态怎么会困难这么多呢?
回复 3# openspace
见5楼我的回复。主要是想在内核里操作大文件, 而且全映射进内核地址空间里,其他的对文件的复杂操作才会实现起来比较简单。 回复 4# humjb_1983
不会不方便呀, 我映射的是内核地址空间, 不会破坏用户态地址空间的 :) 回复 5# smartegg
你这些需求 mmap 满足不了吗? 回复 8# openspace
因为我的需求是 只能使用 内核模块。 mmap在内核模块下调用 只能获得一个user space 的连续空间呀?
获取一个 内核的连续空间才比较合理呀 :) smartegg 发表于 2013-12-30 15:47 static/image/common/back.gif
回复 4# humjb_1983
我的意思是,映射后,进程自身要访问这段内存就很不方便了,你是要在内核中直接访问(这种用法好像比较少见)那就当别论了,是否可以考虑
在mmap后,在内核模块中get_user_pages+kmap将用户态地址空间映射到内核态,然后直接访问?
纯属一时想法,未考虑细节、未实验,仅参考~