Articles of 内存映射

为什么proc / ID / maps具有共享库的多个条目

我正在研究embedded式Linux下的proc / ID / maps,而且我注意到一些共享库在一个进程的内存映射中出现了几次,为什么呢? 40094000-400d9000 r-xp 00000000 b3:09 723 /system/lib/libc.so 400d9000-400da000 —p 00000000 00:00 0 400da000-400dc000 r-xp 00045000 b3:09 723 /system/lib/libc.so 400dc000-400de000 rwxp 00047000 b3:09 723 /system/lib/libc.so 400de000-400e9000 rwxp 00000000 00:00 0 400e9000-400ed000 r-xp 00000000 b3:09 770 /system/lib/libgccdemangle.so 400ed000-400ee000 —p 00000000 00:00 0 400ee000-400ef000 r-xp 00004000 b3:09 770 /system/lib/libgccdemangle.so 400ef000-400f0000 rwxp 00005000 b3:09 770 […]

munmap()与私有匿名映射的ENOMEM失败

我最近发现,如果VMA(虚拟内存区域)结构的数量超过vm.max_map_count,那么Linux不能保证使用munmap()可以释放使用mmap()分配的内存。 Manpage明确指出: ENOMEM The process's maximum number of mappings would have been exceeded. This error can also occur for munmap(), when unmapping a region in the middle of an existing mapping, since this results in two smaller mappings on either side of the region being unmapped. 问题是如果可能的话,Linux内核总是试图合并VMA结构,即使对于单独创build的映射,munmap()也会失败。 我能写一个小程序来确认这个行为: #include <stdio.h> #include <stdlib.h> #include <errno.h> #include […]

Linux:如何将物理连续区域的序列映射到用户空间?

在我的驱动程序中,我有一定数量的物理上连续的DMA缓冲区(例如,每个4MB长)从设备接收数据。 它们由硬件使用SG列表处理。 由于收到的数据将经过深入处理,我不想closurescaching,我将在每个缓冲区填充DMA后使用dma_sync_single_for_cpu 。 为了简化数据处理,我希望这些缓冲区在用户空间中显示为一个巨大的,连续的循环缓冲区。 在单个缓冲区的情况下,我只需使用remap_pfn_range或dma_mmap_coherent 。 但是,我不能多次使用这些函数来映射连续的缓冲区。 当然,我可以在vm_operations中执行错误操作,find右边缓冲区中相应页面的pfn,并用vm_insert_pfn把它插入到vma中 。 收购将会非常快,所以当真正的数据到达时,我无法处理映射。 但这可以很容易地解决。 为了在数据采集开始之前准备好所有映射,我可以在开始采集之前简单地读取应用程序中的整个mmapped缓冲区,以便在第一个数据到达时已经插入所有页面。 基于故障的技巧应该可以工作,但也许有更优雅的东西? 只需要一个函数,可以多次调用来逐步构build整个映射? 额外的困难是解决scheme应该适用于(从最小的调整)到从2.6.32到最新的内核。 PS。 我已经看到那个讨厌的职位 。 如果应用程序试图向mmapped缓冲区写入数据(仅执行数据处理),有没有危险,我的精心构build的映射将被COW销毁?

可执行C程序中的段

我正在阅读有关章节和细分。 似乎你可以列出部分和段之间的映射如下。 $ readelf -l test Elf file type is EXEC (Executable file) Entry point 0x8048330 There are 9 program headers, starting at offset 52 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align PHDR 0x000034 0x08048034 0x08048034 0x00120 0x00120 RE 0x4 INTERP 0x000154 0x08048154 0x08048154 0x00013 0x00013 R 0x1 [Requesting program interpreter: /lib/ld-linux.so.2] […]

Linux内核的copy_from_user如何在内部工作?

任何人都可以解释一下copy_from_user函数是如何工作的吗?它是否使用任何缓冲区,或者考虑到内核具有访问用户空间mem的特权这一事实,是否有任何内存映射?

从用户空间访问物理地址

在运行Linux的基于ARM的系统上,我有一个内存映射到物理地址的设备。 从所有地址都是虚拟的用户空间程序,我如何从这个地址读取内容?