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。这将在调试器中停止,让我们知道涉及哪个曲面,涉及哪个例程,谁调用了它,等等
可能的解决方案:
- 优点:这是一个可实施的解决方案
- 缺点:性能很慢,因为它需要一个昂贵的拷贝,而且内存可能不可用。没有 确保一个临时曲面与另一个临时曲面重叠的方法 指向突然再次工作的无效指针
- 优点:非常快,不需要额外的内存
- 缺点:未知这是否可能
- Gotchas:需要留出一个保留的地址范围,这些地址永远不会被其他任何东西(包括malloc或内核)使用。也需要 确保没有两个表面重叠,这可能会导致旧指针 在应该的时候突然指出某个有效的而不是seg错误
- 优点:非常快,不需要额外的内存
- 缺点:未知这是否可能
- Gotchas:与上面的“2”相同
- 这是使用
,使用stdlib李>Linux2.6
- 该库是用
编写的李>C
- 库和应用程序在用户空间中运行李>
- 有可能使用内核模块(编写自定义内存分配例程),但在 我目前的工作环境可能会把机会减少到接近 零级,我实际上可以实现这个解决方案。但是如果这个 这是唯一的办法,最好知道
- 底层处理器是x86
要创建页面的多个映射的函数是
shm\u open
您可能只在一个进程中使用内存,但它仍然是“共享内存”——也就是说,同一底层物理页将存在多个虚拟映射
然而,这不是你想要做的。实际上,您应该做的是让锁定功能使用mprotect
系统调用,在解锁时使内存不可读,并恢复锁定时的权限;任何未锁定的访问都将导致SEG故障。当然,这只适用于单个同时访问线程
另一种可能更好的追踪问题的方法是在
valgrind
或其他内存分析工具中运行应用程序。这将大大降低它的速度,但允许您进行非常精细的控制:您可以使用valgrind脚本将内存标记为可访问/取消标记,当发生冲突时,该工具将直接将您踢入调试器。但是对于这样的一次性问题解决,我建议安装一个#ifdef DEBUG
-wrappedmprotect
调用锁定/解锁函数。要创建一个页面的多个映射的函数是shm\u open
您可能只在一个进程中使用内存,但它仍然是“共享内存”——也就是说,同一底层物理页将存在多个虚拟映射
然而,这不是你想要做的。实际上,您应该做的是让锁定功能使用mprotect
系统调用,在解锁时使内存不可读,并恢复锁定时的权限;任何未锁定的访问都将导致SEG故障。当然,这只适用于单个同时访问线程
另一种可能更好的追踪问题的方法是在
valgrind
或其他内存分析工具中运行应用程序。这将大大降低它的速度,但允许您进行非常精细的控制:您可以使用valgrind脚本将内存标记为可访问/取消标记,当发生冲突时,该工具将直接将您踢入调试器。但是对于这样的一次性问题解决,我会说安装一个#ifdef DEBUG
-wrappedmprotect
调用锁定/解锁函数。您想要内存范围的副本还是只想要指向它的第二个指针?我想要一个secon