小编Luk*_*rie的帖子

导致共享内存文件上的Linux轮询事件

两个Linux进程打开并映射相同的/ dev/shm/shared内存文件,并将其用作公共内存.问题:一个进程"唤醒"另一个进程以通知它应该查看内存的最简单和最好的方法是什么?例如,一个进程是否可以为另一个进程的文件描述符导致poll()事件?解决方案不需要是便携式的,但我希望它很简单.

linux

10
推荐指数
1
解决办法
3119
查看次数

mremap(2)用HugeTLB来改变虚拟地址?

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)

c linux

3
推荐指数
1
解决办法
551
查看次数

标签 统计

linux ×2

c ×1