liwashington
驱动小牛
驱动小牛
  • 注册日期2004-04-30
  • 最后登录2010-10-21
  • 粉丝0
  • 关注0
  • 积分-11分
  • 威望98点
  • 贡献值1点
  • 好评度12点
  • 原创分0分
  • 专家分0分
阅读:2586回复:5

linux下关于内存映射的困惑

楼主#
更多 发布于:2009-11-15 15:53
我在一个MODULE中拦截了sys_open的调用,然后在这个函数里还想再调用sys_getcwd等内核函数,但是这些函数要求输入的内存是用户态内存地址,而我在MODULE里又只能分配内核内存,结果导致sys_getcwd函数调用失败!找了一些资料,说可以通过remap_page_range函数把内核内存映射到用户地址空间中(因为是HOOK的,这时肯定有一个对应的用户地址空间),但是这个函数不知道具体如何应用,而且看了该函数的说明,即使这样可以成功,但是映射完以后,那块内核内存区域所对应的用户地址又是多少呢?这个问题困扰了我很长时间,如果哪位大侠知道解决方法还请赐教,这里先谢了!
我只想有个好老婆,每天有几顿好饭吃……
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
沙发#
发布于:2009-11-21 18:49
自己实现一个内核版:去掉copy_to_user,代替为内核的内存copy就可以了
走走看看开源好 Solaris vs Linux
liwashington
驱动小牛
驱动小牛
  • 注册日期2004-04-30
  • 最后登录2010-10-21
  • 粉丝0
  • 关注0
  • 积分-11分
  • 威望98点
  • 贡献值1点
  • 好评度12点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-11-23 13:42
我最初就是这样实现的,但是这样一来版本依赖非常严重,LINUX又改来改去,要N多个版本,非常恼火。后来想到用do_mmap映射一段内存,然后找到VMA,再安装NOPAGE例程,但是又发现do_mmap并不一定是产生新的VMA,这样的话,安装NOPAGE又会影响其它的内存,还是比较恼火,现在。。。
我只想有个好老婆,每天有几顿好饭吃……
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
地板#
发布于:2009-11-23 19:45
似乎内核中可以直接使用vfs_write等调用

要做内核的产品就别总想着移植性问题,必须稳定下来一个内核。所以说你的这用想法是不正确的,是违背了规律,因为内核本来就是在不停的变化,不变的是对外的系统调用。

要想移植性好,就做个应用层的程序,和内核不停的交互,把内核容易变化的放到应用层去做。不过太脱裤放屁了,很是没有必要。
走走看看开源好 Solaris vs Linux
yjc17
驱动牛犊
驱动牛犊
  • 注册日期2006-09-25
  • 最后登录2011-12-27
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望23点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2010-05-20 14:01
sys_getcwd
yjc17
驱动牛犊
驱动牛犊
  • 注册日期2006-09-25
  • 最后登录2011-12-27
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望23点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2010-05-20 14:03
调用sys_getcwd 之前,先set_ds(KERNEL_DS) 一下,试试吧
游客

返回顶部