memory-mapping相关内容
在运行 Linux 的基于 ARM 的系统上,我有一个内存映射到物理地址的设备.从所有地址都是虚拟的用户空间程序中,我如何从该地址读取内容? 解决方案 您可以使用 mmap(2) 系统调用将设备文件映射到用户进程内存.通常,设备文件是物理内存到文件系统的映射.否则,您必须编写一个内核模块来创建这样的文件或提供一种将所需内存映射到用户进程的方法. 另一种方法是将/dev/mem 的一部
..
copy_from_user() 函数在内部究竟是如何工作的?考虑到内核确实有权访问用户内存空间,它是否使用任何缓冲区或是否进行了任何内存映射? 解决方案 copy_from_user() 的实现高度依赖于架构. 在 x86 和 x86-64 上,它只是从用户空间地址直接读取并写入内核空间地址,同时临时禁用 SMAP(管理模式访问保护)(如果已配置).其中棘手的部分是 copy_fr
..
我刚刚注意到我的简单程序的数据和堆栈段是可执行的.我在/proc/[pid]/maps中看到了,简单的代码就证实了. 例如: ;程序集.data 节代码:db 0xCC ;int3节.text全局_start_开始:jmp代码mov rax, 60 ;系统退出移动 rdi, 0系统调用 然后 nasm -f elf64 prog.asmld -o prog prog.o./程序 使
..
我对内存映射和内存映射 I/O 很困惑.例如,ARM 体系结构 r0、r1 等中的通用寄存器通常是内存映射的吗?请帮忙. 解决方案 不,这些寄存器在实际 CPU(或多核 CPU 的 CPU 内核)内.您无法通过内存访问它们. 内存映射寄存器是您通过地址或指针(在具有指针的语言中)访问的东西.I/O 设备通常具有内存映射寄存器,您可以在其中写入或读取特定地址以设置或获取信息或数据.换句
..
在运行 Linux 的基于 ARM 的系统上,我有一个将内存映射到物理地址的设备.从所有地址都是虚拟的用户空间程序中,如何从该地址读取内容? 解决方案 您可以使用 mmap(2) 系统调用将设备文件映射到用户进程内存.通常,设备文件是物理内存到文件系统的映射.否则,您必须编写一个内核模块来创建这样的文件或提供一种将所需内存映射到用户进程的方法. 另一种方法是将/dev/mem 的部分
..
我正在Windows 10(64位)中编写内核模式驱动程序,其主要目的是从DMA读取数据,我想知道是否将内存块从内核空间复制到内存中分配的缓冲区中,而不是复制用户空间,我可以以某种方式向用户空间公开一个地址(当然不是物理地址),并保存在内存复制操作中. 也许是这样的: 分配一块连续的物理内存(并将物理地址映射到内核空间中的虚拟地址). 将内核空间中的虚拟地址映射到用户空间中的虚拟
..
更大的内存具有更高的解码延迟;那么为什么寄存器文件是内存的一部分? 这是否仅表示将寄存器“映射"到寄存器?存储在微处理器内部的SRAM寄存器? 如果没有,使用寄存器的好处是什么,因为它们不会比访问RAM快得多?此外,它们的用途是什么?我的意思是这些只是内存的一部分,所以我看不出再拥有它们的意义了.拥有它们与引用内存一样昂贵. 图片摘自 Avr微控制器和嵌入式系统:Muhamm
..
据我了解,C volatile 以及可选的内存防护内联asm已用于在内存映射的I/O之上实现设备驱动程序.在Linux内核中可以找到几个示例. 如果我们忘记了未捕获的异常(如果有的话)的风险,那么用C ++ 11原子替换它们是否有意义?或者,有可能吗? 解决方案 通常,您可以用原子代替内存隔离栅,但不能用 volatile 替换,除非它与专用于隔离栅的一起使用线程间通信. 关于
..
我对“内存映射"和“内存映射的I/O"非常困惑.例如在ARM体系结构r0,r1等中的通用寄存器是否通常进行内存映射?请帮忙. 解决方案 否,这些寄存器位于实际的CPU(或多核CPU的CPU内核)内部.您无法通过内存访问它们. 内存映射寄存器是您可以通过地址或指针(使用具有指针的语言)进行访问的寄存器.I/O设备通常具有内存映射寄存器,您可以在其中写入或读取特定地址来设置或获取信息或数
..
OUT_DIR = '/media/sf_3dAnalysis/simMatrix/' SIM_FILE = 'similarity.npy' data = np.lib.format.open_memmap(OUT_DIR+SIM_FILE, mode='w+', dtype='float32', shape=(len(filelist),len(filelist))) del data
..
在Linux中,如果我们查看/proc/self/maps: 00400000-004ef000 r-xp 00000000 08:01 12845058 /bin/bash 006ef000-006f0000 r--p 000ef000 08:01 12845058 /bin/bash
..
我正在64位Linux机器上开发一个程序,该程序需要将多个任意长度的数据数组映射到我无法控制的固定内存地址.我以为带有MAP_FIXED和MAP_ANONYMOUS的mmap()是可行的方法,例如: mmap((void *) 0x401000, 0x18e, PROT_NONE, MAP_ANONYMOUS | MAP_FIXED, -1, 0); 但是,每次我调用此函数时,它都会返回
..
存在用于node.js的mmap模块: https://github.com/bnoordhuis/node-mmap/ 正如作者Ben Noordhuis指出的那样,访问映射内存可能会阻塞,这就是为什么他不再推荐并停止使用它的原因. 所以我想知道如何为node.js设计一个非阻塞内存映射模块?螺纹,纤维,? 显然,这附近引发了一个问题,即是否会在其他地方而不是在请求处理程序中发
..
我正在尝试将内存映射文件用作: hFile = ::CreateFile(State.Path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN, 0);//open the file i
..
这是我在这里的第一个问题:). 我一直在尝试将物理内存映射到vxWorks 6.8中的虚拟内存,但没有成功, 我正在尝试使用"vmMap"功能,但它总是以以下方式返回: errno = 0x30065 S_taskLib_NAME_NOT_FOUND. 我的代码是: int page_size=0; PHYS_ADDR GPIO_BASE_VIRTUAL_ADDR = 0x
..
在Linux中,查看进程的内存映射的最简单方法是查看/proc/PID/maps,给出如下内容: 08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm 08056000-08058000 rw-p 0000d000 03:0c 64593 /usr/sbin/gpm 08058000-0805b000 rwxp
..
我尝试使用mmap函数分配一些具有只读访问权限的内存页.我打印了/proc/self/maps来检查内存保护是否正常工作.即使mmap的保护参数为PROT_READ 7fec0c585000-7fec0c785000 r-xp 00000000 00:00 0 这意味着当我要求内核分配一些只读内存页面时,它也会将它们也标记为可执行. 我做了一些其他的测试,我意识到当我要求一个只写
..
我最近发现Linux无法保证使用munmap释放分配给mmap的内存,如果这会导致VMA(虚拟内存区域)结构的数量超过vm.max_map_count的情况.联机帮助页(几乎)清楚地指出了这一点: ENOMEM The process's maximum number of mappings would have been exceeded. This error can also oc
..
copy_from_user()函数在内部如何工作?考虑到内核确实具有访问用户内存空间的特权,它是否使用任何缓冲区还是完成了任何内存映射? 解决方案 copy_from_user()的实现高度依赖于体系结构. 在x86和x86-64上,它只是直接从用户空间地址进行读取并写入内核空间地址,同时如果已配置,则暂时禁用SMAP(超级用户模式访问阻止).它的棘手部分是将copy_from_u
..
在运行Linux的基于ARM的系统上,我有一个将内存映射到物理地址的设备.从所有地址都是虚拟的用户空间程序中,如何从该地址读取内容? 解决方案 您可以使用mmap(2)系统调用将设备文件映射到用户进程内存.通常,设备文件是物理内存到文件系统的映射. 否则,您必须编写一个内核模块来创建此类文件或提供一种将所需内存映射到用户进程的方法. 另一种方法是将/dev/mem的部分重新映射到用户
..