小编TOM*_*ANG的帖子

Linux 中线程创建会触发页面错误吗?它与软脏 PTE 有何关系?

我问这个问题的原因是,在测试Linux软脏位的行为时,我发现如果我创建一个线程而不接触任何内存,所有页面的软脏位都会被设置为1(脏)。

例如,malloc(100MB)在主线程中,然后清理软脏位,然后创建一个只是休眠的线程。创建线程后,所有 100MB 内存块的软脏位都设置为 1。

这是我正在使用的测试程序:

#include <thread>
#include <iostream>
#include <vector>
#include <cstdint>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>

#define PAGE_SIZE_4K 0x1000

int GetDirtyBit(uint64_t vaddr) {
  int fd = open("/proc/self/pagemap", O_RDONLY);
  if (fd < 0) {
    perror("Failed open pagemap");
    exit(1);
  }

  off_t offset = vaddr / 4096 * 8;
  if (lseek(fd, offset, SEEK_SET) < 0) {
    perror("Failed lseek pagemap");
    exit(1);
  }

  uint64_t pfn = 0;
  if (read(fd, &pfn, sizeof(pfn)) != sizeof(pfn)) {
    perror("Failed …
Run Code Online (Sandbox Code Playgroud)

linux multithreading pthreads linux-kernel page-fault

4
推荐指数
1
解决办法
232
查看次数