Linux kernel 为什么';不自由执行地图?

Linux kernel 为什么';不自由执行地图?,linux-kernel,mmap,strace,Linux Kernel,Mmap,Strace,我有以下代码: unsigned char *p = (unsigned char *)valloc(page_size); if (!p) { ret = -1; goto out; } printf("valloc: allocated %d bytes, virtual address: %p\n", page_size, p); memset(p, 0

我有以下代码:

     unsigned char *p = (unsigned char *)valloc(page_size);
     if (!p) {                 
             ret = -1;
             goto out;
     }
     printf("valloc: allocated %d bytes, virtual address: %p\n", page_size, p);

     memset(p, 0xFF, page_size);
     memcpy(p, s, sizeof(s));

     trace_mem(p, sizeof(s));
     printf("Memory: %p -  press any key\n", p);
     getchar();

     if (ioctl(fd, MY_IOC_PATCH) == -1) {
            fprintf(stderr, "ioctl %s error(%d): %s\n ", "MY_IOC_PATCH", errno, strerror(errno));
            ret = -1;
            goto out;
     }

     if (p) {
             printf("free: freed %d bytes, virtual address: %p\n", page_size, p);
             free(p);
     }
      .........................
然后我使用strace观察系统调用:strace./my_program我得到以下结果:

fstat64(1, {st_mode=S_IFREG|0644, st_size=1533, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =      0xb7730000
brk(0)                                  = 0x9d81000
brk(0x9da4000)                          = 0x9da4000
fstat64(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb772f000
read(0, "\n", 1024)                     = 1
ioctl(3, RTC_IRQP_SET, 0x1000)          = 0
read(0, "\n", 1024)                     = 1
ioctl(3, RTC_EPOCH_READ, 0x9d82000)     = 0
read(0, "\n", 1024)                     = 1
close(3)                                = 0
valloc: allocated 4096 bytes, virtual address: 0x9d82000

第一次行动后,我没看到芒洛克。我想free必须使用munlock来取消映射内存,但这不会导致错误。原因是什么?

我认为上面顺磁性羊角面包的评论可以作为这个问题的“答案”。
malloc()
实现通常会在需要时向操作系统请求更多内存,但决不归还。对于任何操作系统

你看,真的没有必要“归还”。纠缠内核,要求他开拓更多的虚拟机空间并更新内存管理数据结构,是一项相对昂贵的操作。但是,保留存储空间并不会真正“花费”太多。(释放它们的成本不会给你带来任何好处,尤其是当你转身再次要求它们的时候!)所以,你只需要做一次

如果您停止使用这些页面,它们最终将被调出,物理资源(页面框架)将自动用于其他目的。“没有伤害,没有犯规。”但是,如果您突然再次开始使用该存储,那么就没有理由第二(或第三)次“纠缠内核”。页面被再次交换,然后就可以离开了。

1) 将匿名段附加到进程

2) 当然,在第一次使用时,将一堆虚拟地址(堆区域)条目与物理页面相关联

在“空闲”的情况下,它只需要将虚拟内存条目与物理页面解除关联。请注意,因为这些是匿名页面,所以不需要关心“数据”需要放在哪里,而MMA文件可能需要将其放回磁盘


物理页由内存管理器独立跟踪和管理,并由缓存原则(热、冷颜色等)控制。因此,不存在免费尝试将内存返回内核的问题。因为它得到的只是一个虚拟地址。它将把虚拟地址返回给glibc库,glibc库应该维护虚拟地址块以供特定进程使用

“我想free必须使用munlock来取消映射内存”——当然不必;这完全取决于实施。大多数内存管理器不会将
free()
d空间返还给操作系统;他们将其保留下来,以便稍后快速访问。
valloc()
?您的意思是
vmalloc()
?valloc()分配大小字节并返回指向分配内存的指针。内存地址将是页面大小的倍数。