smartegg 发表于 2013-12-27 12:13

如何将 普通文件映射到 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写入磁盘。


最后感谢各位亲们的热情回复, 你们太棒了~   :)

asuka2001 发表于 2013-12-27 12:30

回复 1# smartegg

内核空间中除了指定的地方如 copy_{to, from}_user(),不允许page fault产生吧,你mmap不起作用吧,只能是直接一次性把文件内容读出来!

请你详细描述下你的需求。。。为什么要把文件映射到内核空间,你是希望达到什么样的目的。

openspace 发表于 2013-12-27 14:46

写个内核模块来做,然后辅助用户态工具?

像2楼问的,为什么要这么做?

humjb_1983 发表于 2013-12-27 16:54

smartegg 发表于 2013-12-27 12:13 static/image/common/back.gif
众所周知,mmap 可以实现将文件映射 到用户态地址空间上。
但是我有个需求, 是要将文件映射到 ...
映射后进程自己访问相应的地址空间时,就很不方便了,感觉没有实际的用途。

smartegg 发表于 2013-12-30 15:41

回复 2# asuka2001


    感谢您的回复。
我的需求是这样的:
“把整个普通磁盘文件 映射的内核内存的一段连续的虚拟地址"

这样会有如下优点:

1.操作起来比较方便, 直接读写内存即可。
2.不需要考虑哪块内存为脏( 依赖最后脏的会被回刷磁盘 )
3.不需要消耗大量物理内存, 因为只需要虚拟地址连续即可。


我有点迷茫, 不知道该怎么实现, 是不是有点麻烦呢? 

只是想不通映射成用户态地址空间挺简单的, 想映射成内核态怎么会困难这么多呢?

smartegg 发表于 2013-12-30 15:43

回复 3# openspace


见5楼我的回复。主要是想在内核里操作大文件, 而且全映射进内核地址空间里,其他的对文件的复杂操作才会实现起来比较简单。

smartegg 发表于 2013-12-30 15:47

回复 4# humjb_1983


    不会不方便呀, 我映射的是内核地址空间, 不会破坏用户态地址空间的 :)

openspace 发表于 2013-12-30 16:16

回复 5# smartegg


    你这些需求 mmap 满足不了吗?

smartegg 发表于 2013-12-30 16:26

回复 8# openspace


因为我的需求是 只能使用 内核模块。    mmap在内核模块下调用 只能获得一个user space 的连续空间呀?
获取一个 内核的连续空间才比较合理呀 :)

humjb_1983 发表于 2013-12-30 16:40

smartegg 发表于 2013-12-30 15:47 static/image/common/back.gif
回复 4# humjb_1983



我的意思是,映射后,进程自身要访问这段内存就很不方便了,你是要在内核中直接访问(这种用法好像比较少见)那就当别论了,是否可以考虑
在mmap后,在内核模块中get_user_pages+kmap将用户态地址空间映射到内核态,然后直接访问?
纯属一时想法,未考虑细节、未实验,仅参考~
页: [1] 2 3
查看完整版本: 如何将 普通文件映射到 kernel 地址空间 上 ?