两个Linux进程打开并映射相同的/ dev/shm/shared内存文件,并将其用作公共内存.问题:一个进程"唤醒"另一个进程以通知它应该查看内存的最简单和最好的方法是什么?例如,一个进程是否可以为另一个进程的文件描述符导致poll()事件?解决方案不需要是便携式的,但我希望它很简单.
Linux mremap(2)函数是否能够将从mmap()获取的HugeTLB的虚拟地址更改为新的固定虚拟地址?
(背景:我想根据我得到的内存的物理地址重新映射虚拟地址.这是通过直接检查指针地址来有效地执行虚拟到物理地址转换.我将使用内存将DMA从用户空间用于硬件.)
这似乎不适用于我的简单测试程序:
#define _GNU_SOURCE
#include <stdio.h>
#include <sys/mman.h>
#include <stdint.h>
#define LARGE_PAGE_SIZE (1024*1024*1024)
int main() {
void *p1;
void *p2;
p1 = mmap(NULL, LARGE_PAGE_SIZE, PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_ANONYMOUS|MAP_HUGETLB|MAP_LOCKED,
0, 0);
if (p1 == MAP_FAILED) {
perror("mmap");
return 1;
}
printf("p1 = %p\n", p1);
p2 = mremap(p1, LARGE_PAGE_SIZE, LARGE_PAGE_SIZE,
MREMAP_MAYMOVE|MREMAP_FIXED,
(void*)(((uint64_t)p1) | 0x500000000000ULL));
if (p2 == MAP_FAILED) {
perror("mremap");
return 1;
}
printf("p2 = %p\n", p2);
}
Run Code Online (Sandbox Code Playgroud)
mremap()成功的mmap()失败:
$ gcc -o mremap_hugetlb mremap_hugetlb.c && sudo ./mremap_hugetlb
p1 = 0x2aaac0000000
mremap: Invalid …Run Code Online (Sandbox Code Playgroud)