阅读:2656回复:5
linux下关于内存映射的困惑
我在一个MODULE中拦截了sys_open的调用,然后在这个函数里还想再调用sys_getcwd等内核函数,但是这些函数要求输入的内存是用户态内存地址,而我在MODULE里又只能分配内核内存,结果导致sys_getcwd函数调用失败!找了一些资料,说可以通过remap_page_range函数把内核内存映射到用户地址空间中(因为是HOOK的,这时肯定有一个对应的用户地址空间),但是这个函数不知道具体如何应用,而且看了该函数的说明,即使这样可以成功,但是映射完以后,那块内核内存区域所对应的用户地址又是多少呢?这个问题困扰了我很长时间,如果哪位大侠知道解决方法还请赐教,这里先谢了!
|
|
|
沙发#
发布于:2009-11-21 18:49
自己实现一个内核版:去掉copy_to_user,代替为内核的内存copy就可以了
|
|
|
板凳#
发布于:2009-11-23 13:42
我最初就是这样实现的,但是这样一来版本依赖非常严重,LINUX又改来改去,要N多个版本,非常恼火。后来想到用do_mmap映射一段内存,然后找到VMA,再安装NOPAGE例程,但是又发现do_mmap并不一定是产生新的VMA,这样的话,安装NOPAGE又会影响其它的内存,还是比较恼火,现在。。。
|
|
|
地板#
发布于:2009-11-23 19:45
似乎内核中可以直接使用vfs_write等调用
要做内核的产品就别总想着移植性问题,必须稳定下来一个内核。所以说你的这用想法是不正确的,是违背了规律,因为内核本来就是在不停的变化,不变的是对外的系统调用。 要想移植性好,就做个应用层的程序,和内核不停的交互,把内核容易变化的放到应用层去做。不过太脱裤放屁了,很是没有必要。 |
|
|
地下室#
发布于:2010-05-20 14:01
sys_getcwd
|
|
5楼#
发布于:2010-05-20 14:03
调用sys_getcwd 之前,先set_ds(KERNEL_DS) 一下,试试吧
|
|