我问这个问题的原因是,在测试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)