smartegg 发表于 2013-12-30 17:48

回复 10# humjb_1983


我确实需要在 内核态直接访问(虽然听起来挺诡异的), 因为我在内核实现了一个简单的存储服务, 是基于文件的。所以不能依赖用户态进程的地址空间 :)
   

帅绝人寰 发表于 2013-12-30 22:22

第一印象是, 会很麻烦

所谓普通文件, 假定是存在于一个已经在upstream的fs,,例如ext3.这时它的mmap方法已经有了,就是ext3实现的那个。没有很直接的方式,可以去改变ext3 的mmap方法的语义。

有人可能说自己实现mmap方法, 可是, 常见的那种做法, 是自己提供了 特殊文件(char、block等), 这些文件你当然容易往上挂。 regular file就很难了

所以我觉得你的思路可能换一下会更好,例如,调用read/write而不是mmap, 例如, 引入userspace utils

smalloc 发表于 2013-12-31 00:52

内核态段错误是不允许的,当然你可以修改缺页异常流程。
另一个条件是必须有段错误发生启动map机制。
找个进程mmap一下,然后找一块空白内核空间,copy vma结构

openspace 发表于 2013-12-31 08:33

需要在自己的模块中启动内核线程,然后看看 mmap 内核态的实现需要什么样的参数,在模块的内核线程里面构造这些参数

asuka2001 发表于 2013-12-31 09:44

回复 5# smartegg

page fault的限制在那里,你绕不过去。。。

我觉得直接在page cache这一层做可行性大些!

把需要的内容自己取到page cache。可以参考下内核的文件读取流程!

最后做下映射,做文件操作。估计也够麻烦的就是了。。。

unbutun 发表于 2014-01-05 11:23

直接调用file_mmap不行? 就是个建vma页表的事,那段地址对应对了就行了


回复 1# smartegg


   

gacad 发表于 2014-01-05 12:44

以上机制只在提升缓冲内存的读写效率(命中率)

smartegg 发表于 2014-01-06 14:17

回复 16# unbutun


    不行的。 vma 本身只管理用户态的   线性空间。 :)

unbutun 发表于 2014-01-07 22:59

晕,那vmalloc怎么实现的

回复 18# smartegg


   

smartegg 发表于 2014-01-08 11:22

回复 19# unbutun


    使用 vm_struct 结构来管理 VMALLOC_START 到 VMALLOC_END 之间的线性空间呗~
页: 1 [2] 3
查看完整版本: 如何将 普通文件映射到 kernel 地址空间 上 ?