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 之间的线性空间呗~