草庐IT

PACKET_MMAP

全部标签

Linux/perl mmap 性能

我正在尝试使用mmap优化对大型数据集的处理。数据集在千兆字节范围内。这个想法是将整个文件映射到内存中,允许多个进程同时处理数据集(只读)。但它没有按预期工作。作为一个简单的测试,我简单地映射文件(使用perl的Sys::Mmap模块,使用我认为直接映射到底层C函数的“mmap”子程序)并让进程休眠。执行此操作时,代码在从mmap调用返回之前花费了超过一分钟的时间,尽管此测试什么也没做——甚至没有读取——来自mmap的文件。我猜测,虽然linux可能需要在第一次mmap时读取整个文件,所以在第一个进程中映射文件后(当它处于休眠状态时),我在另一个进程中调用了一个简单的测试,它尝试了读取

linux - mmap:在用户空间中映射一个用 kmalloc 分配的内核缓冲区

在用户空间进程中映射使用kmalloc分配的缓冲区的正确方法是什么?也许我还不了解内存映射......我写了一个内核模块来分配这个缓冲区(例如120字节),我会在用户空间进程中读写它。显然我创建了一个字符设备并实现了一个mmapfile_operations中的方法结构。我的方法是:staticintmy_mmap(structfile*filp,structvm_area_struct*vma){//printk(KERN_INFO"Allocatedvirtualmemorylength=%d",vma->vm_end-vma->vm_start);longunsignedints

linux - mmap:在用户空间中映射一个用 kmalloc 分配的内核缓冲区

在用户空间进程中映射使用kmalloc分配的缓冲区的正确方法是什么?也许我还不了解内存映射......我写了一个内核模块来分配这个缓冲区(例如120字节),我会在用户空间进程中读写它。显然我创建了一个字符设备并实现了一个mmapfile_operations中的方法结构。我的方法是:staticintmy_mmap(structfile*filp,structvm_area_struct*vma){//printk(KERN_INFO"Allocatedvirtualmemorylength=%d",vma->vm_end-vma->vm_start);longunsignedints

linux - mmap:映射文件会立即加载到内存中吗?

从手册中,我只知道mmap()将文件映射到虚拟地址空间,因此可以随机访问该文件。但是,我不清楚映射文件是否立即加载到内存中?我猜内核是按页管理映射的内存,按需加载,如果我只做几次读写,只加载了几页。这是正确的吗? 最佳答案 不,是的,也许吧。这取决于。调用mmap通常仅意味着对您的应用程序而言,映射文件的内容被映射到其地址空间,就好像文件被加载到那里一样。或者,就好像文件确实存在于内存中一样,就好像它们是一体的一样(其中包括写回磁盘的更改,假设您具有写访问权限)。不多也不少。它没有加载某些东西的概念,应用程序也不知道这意味着什么。应

linux - mmap:映射文件会立即加载到内存中吗?

从手册中,我只知道mmap()将文件映射到虚拟地址空间,因此可以随机访问该文件。但是,我不清楚映射文件是否立即加载到内存中?我猜内核是按页管理映射的内存,按需加载,如果我只做几次读写,只加载了几页。这是正确的吗? 最佳答案 不,是的,也许吧。这取决于。调用mmap通常仅意味着对您的应用程序而言,映射文件的内容被映射到其地址空间,就好像文件被加载到那里一样。或者,就好像文件确实存在于内存中一样,就好像它们是一体的一样(其中包括写回磁盘的更改,假设您具有写访问权限)。不多也不少。它没有加载某些东西的概念,应用程序也不知道这意味着什么。应

linux - mmap 比 ioremap 慢

我正在为运行Linux2.6.37的ARM设备开发。我正在尝试尽快切换IO引脚。我制作了一个小内核模块和一个用户空间应用程序。我尝试了两件事:使用ioremap直接从内核空间操作GPIO控制寄存器。mmap()GPIO控制寄存器,无需缓存并从用户空间使用它们。这两种方法都有效,但第二种方法比第一种方法慢3倍左右(在示波器上观察到)。我想我禁用了所有缓存机制。当然,我想获得两个世界中最好的:用户空间的灵active和易于开发以及内核空间的速度。有人知道为什么mmap()可能比ioremap()慢吗?这是我的代码:内核模块代码staticintti81xx_usmap_mmap(struc

linux - mmap 比 ioremap 慢

我正在为运行Linux2.6.37的ARM设备开发。我正在尝试尽快切换IO引脚。我制作了一个小内核模块和一个用户空间应用程序。我尝试了两件事:使用ioremap直接从内核空间操作GPIO控制寄存器。mmap()GPIO控制寄存器,无需缓存并从用户空间使用它们。这两种方法都有效,但第二种方法比第一种方法慢3倍左右(在示波器上观察到)。我想我禁用了所有缓存机制。当然,我想获得两个世界中最好的:用户空间的灵active和易于开发以及内核空间的速度。有人知道为什么mmap()可能比ioremap()慢吗?这是我的代码:内核模块代码staticintti81xx_usmap_mmap(struc

ios - 为什么 mmap() 使用 MAP_FAILED 而不是 NULL?

有人知道为什么mmap()返回MAP_FAILED而不是NULL吗?在大多数系统上,MAP_FAILED似乎是(void*)-1。为什么mmap()不直接使用NULL呢?我知道地址0x0在技术上是一个有效的内存页面,而(void*)-1永远不会是一个有效的页面。然而我的猜测是mmap()实际上永远不会返回页面0x0。例如,在Windows上,VirtualAlloc()在出错时返回NULL。假设mmap()永远不会返回0x0是否安全?据推测,对mmap()的成功调用应该将可用内存返回给调用者。地址0x0永远不可用,因此它永远不会在成功时返回。在这种情况下,使用0x0作为失败标记似乎是明

ios - 为什么 mmap() 使用 MAP_FAILED 而不是 NULL?

有人知道为什么mmap()返回MAP_FAILED而不是NULL吗?在大多数系统上,MAP_FAILED似乎是(void*)-1。为什么mmap()不直接使用NULL呢?我知道地址0x0在技术上是一个有效的内存页面,而(void*)-1永远不会是一个有效的页面。然而我的猜测是mmap()实际上永远不会返回页面0x0。例如,在Windows上,VirtualAlloc()在出错时返回NULL。假设mmap()永远不会返回0x0是否安全?据推测,对mmap()的成功调用应该将可用内存返回给调用者。地址0x0永远不可用,因此它永远不会在成功时返回。在这种情况下,使用0x0作为失败标记似乎是明

c - 当长度大于 4GB 时 mmap 失败

(正确的代码在“更新5”中)在此示例C代码中,我尝试映射从0x100000000到0x200000000的内存范围:#include#include#include#includeintmain(void){uint64_t*rr_addr=0;uint64_ti=17179869184;printf("\nsizeof(size_t):%llu\n",sizeof(size_t));printf("(uint64_t)0x100000000:%llx\n",(uint64_t)0x100000000);printf("1L在不同的系统(Linux、gcc)上,我得到不同的结果:结果1