免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 7816 | 回复: 23

[文件系统] 如何将 普通文件映射到 kernel 地址空间 上 ? [复制链接]

论坛徽章:
0
发表于 2013-12-27 12:13 |显示全部楼层
本帖最后由 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  写入磁盘。


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

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
发表于 2013-12-27 12:30 |显示全部楼层
回复 1# smartegg

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

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

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
发表于 2013-12-27 14:46 |显示全部楼层
写个内核模块来做,然后辅助用户态工具?

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

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
发表于 2013-12-27 16:54 |显示全部楼层
smartegg 发表于 2013-12-27 12:13
众所周知,  mmap 可以实现  将  文件映射 到  用户态地址空间上。
但是我有个需求, 是要将  文件映射到 ...

映射后进程自己访问相应的地址空间时,就很不方便了,感觉没有实际的用途。

论坛徽章:
0
发表于 2013-12-30 15:41 |显示全部楼层
回复 2# asuka2001


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

这样会有如下优点:

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


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

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

论坛徽章:
0
发表于 2013-12-30 15:43 |显示全部楼层
回复 3# openspace


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

论坛徽章:
0
发表于 2013-12-30 15:47 |显示全部楼层
回复 4# humjb_1983


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

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
发表于 2013-12-30 16:16 |显示全部楼层
回复 5# smartegg


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

论坛徽章:
0
发表于 2013-12-30 16:26 |显示全部楼层
回复 8# openspace


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

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
发表于 2013-12-30 16:40 |显示全部楼层
smartegg 发表于 2013-12-30 15:47
回复 4# humjb_1983

我的意思是,映射后,进程自身要访问这段内存就很不方便了,你是要在内核中直接访问(这种用法好像比较少见)那就当别论了,是否可以考虑
在mmap后,在内核模块中get_user_pages+kmap将用户态地址空间映射到内核态,然后直接访问?
纯属一时想法,未考虑细节、未实验,仅参考~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP