Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux-从malloc复制虚拟内存地址或移动虚拟内存地址_C_Linux_Memory_Memory Management_Malloc - Fatal编程技术网

Linux-从malloc复制虚拟内存地址或移动虚拟内存地址

Linux-从malloc复制虚拟内存地址或移动虚拟内存地址,c,linux,memory,memory-management,malloc,C,Linux,Memory,Memory Management,Malloc,简短问题: 是否有可能将一个缓冲区映射为具有两种访问同一缓冲区的方式(两个指针指向同一物理内存)? 或者,是否可以临时移动malloc接收的虚拟内存地址?或者可以从虚拟空间中的一个位置指向另一个位置吗 背景: 我正在使用DirectFB,一个表面管理和二维图形合成库。我试图强制执行锁定协议,即锁定曲面,仅在锁定时修改内存(指针指向使用malloc分配的系统内存),并解锁曲面 我目前正试图追踪一个应用程序中的一个bug,该应用程序锁定一个曲面,然后存储像素指针并在以后修改曲面。这意味着库不知道何时

简短问题:
是否有可能将一个缓冲区映射为具有两种访问同一缓冲区的方式(两个指针指向同一物理内存)? 或者,是否可以临时移动malloc接收的虚拟内存地址?或者可以从虚拟空间中的一个位置指向另一个位置吗

背景:
我正在使用
DirectFB
,一个表面管理和二维图形合成库。我试图强制执行锁定协议,即锁定曲面,仅在锁定时修改内存(指针指向使用malloc分配的系统内存),并解锁曲面

我目前正试图追踪一个应用程序中的一个bug,该应用程序锁定一个曲面,然后存储像素指针并在以后修改曲面。这意味着库不知道何时可以安全地读取或写入曲面。我试图找到一种方法来检测是否违反了锁定协议。我想要的是一种在发出解锁调用后使传递给用户的指针无效的方法。更妙的是,如果应用程序试图在锁定后访问内存,我希望应用程序将seg fault设置为seg。这将在调试器中停止,让我们知道涉及哪个曲面,涉及哪个例程,谁调用了它,等等

可能的解决方案:

  • 创建临时缓冲区,将缓冲区指针传递给用户,在解锁时将像素复制到实际缓冲区,删除临时缓冲区 缓冲区

    • 优点:这是一个可实施的解决方案
    • 缺点:性能很慢,因为它需要一个昂贵的拷贝,而且内存可能不可用。没有 确保一个临时曲面与另一个临时曲面重叠的方法 指向突然再次工作的无效指针
  • 为malloc曲面制作一个附加贴图,并将其传递给用户。解锁时,取消映射内存

    • 优点:非常快,不需要额外的内存
    • 缺点:未知这是否可能
    • Gotchas:需要留出一个保留的地址范围,这些地址永远不会被其他任何东西(包括malloc或内核)使用。也需要 确保没有两个表面重叠,这可能会导致旧指针 在应该的时候突然指出某个有效的而不是seg错误
  • 利用用户锁定时库不会访问内存这一事实,只需移动虚拟地址即可 打开锁并在解锁时将其移回

    • 优点:非常快,不需要额外的内存
    • 缺点:未知这是否可能
    • Gotchas:与上面的“2”相同
  • 这是否可行

    其他信息:

    • 这是使用
      Linux2.6
      ,使用stdlib
    • 该库是用
      C
      编写的
    • 库和应用程序在用户空间中运行
    • 有可能使用内核模块(编写自定义内存分配例程),但在 我目前的工作环境可能会把机会减少到接近 零级,我实际上可以实现这个解决方案。但是如果这个 这是唯一的办法,最好知道
    • 底层处理器是x86

    要创建页面的多个映射的函数是
    shm\u open

    您可能只在一个进程中使用内存,但它仍然是“共享内存”——也就是说,同一底层物理页将存在多个虚拟映射

    然而,这不是你想要做的。实际上,您应该做的是让锁定功能使用
    mprotect
    系统调用,在解锁时使内存不可读,并恢复锁定时的权限;任何未锁定的访问都将导致SEG故障。当然,这只适用于单个同时访问线程


    另一种可能更好的追踪问题的方法是在
    valgrind
    或其他内存分析工具中运行应用程序。这将大大降低它的速度,但允许您进行非常精细的控制:您可以使用valgrind脚本将内存标记为可访问/取消标记,当发生冲突时,该工具将直接将您踢入调试器。但是对于这样的一次性问题解决,我建议安装一个
    #ifdef DEBUG
    -wrapped
    mprotect
    调用锁定/解锁函数。

    要创建一个页面的多个映射的函数是
    shm\u open

    您可能只在一个进程中使用内存,但它仍然是“共享内存”——也就是说,同一底层物理页将存在多个虚拟映射

    然而,这不是你想要做的。实际上,您应该做的是让锁定功能使用
    mprotect
    系统调用,在解锁时使内存不可读,并恢复锁定时的权限;任何未锁定的访问都将导致SEG故障。当然,这只适用于单个同时访问线程


    另一种可能更好的追踪问题的方法是在
    valgrind
    或其他内存分析工具中运行应用程序。这将大大降低它的速度,但允许您进行非常精细的控制:您可以使用valgrind脚本将内存标记为可访问/取消标记,当发生冲突时,该工具将直接将您踢入调试器。但是对于这样的一次性问题解决,我会说安装一个
    #ifdef DEBUG
    -wrapped
    mprotect
    调用锁定/解锁函数。

    您想要内存范围的副本还是只想要指向它的第二个指针?我想要一个secon