标签: memory-mapping

使用 MapViewOfFile 有什么限制吗?

我正在尝试将内存映射文件用作:

hFile = ::CreateFile(State.Path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
                                 0, OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN, 0);//open the file

if(hFile !=INVALID_HANDLE_VALUE){
hMap= ::CreateFileMapping(hFile, 0, PAGE_READONLY | SEC_COMMIT, 0, 0, 0);//create Mem mapping for the file in virtual memory
if( hMap!=NULL){
base = ::MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);//load the mapped file into the RAM
//start to compare some bytes (values) from mspaint.exe file in Win7
if( *((BYTE *)base + 0x1C3DF0)== 0x05 )
i++; 
if( *((BYTE *)base + 0x25250C)== 0x21 )
i++;
if( *((BYTE *)base + 0x25272A)== 0x97 …
Run Code Online (Sandbox Code Playgroud)

c++ winapi memory-leaks memory-mapped-files memory-mapping

3
推荐指数
1
解决办法
3714
查看次数

关注使用共享内存与CreateFileMapping和MapViewofFile

关于使用共享内存我有两个问题.我正在使用CreateFileMapping在两个进程之间创建共享内存区域.

1)我知道我需要在从CreateFileMapping或OpenFileMapping调用返回的每个句柄上调用CloseHandle以释放内存.我的问题是,如果使用共享内存的程序退出而不调用CloseHandle,那么所有句柄是否都会被Windows XP/7解除分配?IE - 使用mem的所有进程关闭后是否有可能发生内存泄漏?

2)我使用MapViewofFile获取指向mem的指针.在一个实例中,我假设共享内存将始终存在于方法的上下文中.所以我已经将MapViewOfFile的返回值保存为指针并关闭了mem的句柄,我只是使用指向共享内存的指针(但仍然锁定对它的访问).这样安全,还是每次访问共享内存时都应该调用MapViewOfFile?

谢谢,

伊恩

c++ windows memory-leaks shared-memory memory-mapping

3
推荐指数
1
解决办法
1850
查看次数

在Linux下共享内存映射

动机

我想编写一对程序,其中一个程序读取数据并将其传输到内部格式,另一个程序将内部格式转换为其他程序.作为一个练习,我想在不使用管道的情况下编写这些程序之间的交互.我更喜欢使用信号和共享内存.

我想要的是

我有程序A和B,其中A调用B.我怎么能

  1. 从程序A创建一个内存块
  2. 从程序A调用程序B,为其提供有关在哪里找到内存块的信息
  3. 使用两个程序中的内存块.

更具体地说,A解码自定义视频格式并将单个未压缩帧放入共享缓冲区.B从缓冲区读取并将其编码为输出strean.解码器每秒最多解码100帧,大约500 MiB/s内存流量.由于数据必须经常复制并且缓冲区不是很大,所以管道结果很慢.

我认为可能有用

我的想法是用来mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0)创建一部分共享内存.问题是,execve(2)国家的联合页面:

不保留内存映射(mmap(2)).

那么,我如何与其他程序共享该内存?将两种功能集成到一个程序中并使用它是一个更好的主意fork吗?

c linux memory-mapping execve

3
推荐指数
1
解决办法
487
查看次数

为什么在mmap中PROT_READ等于PROT_EXEC

我试图使用mmap函数分配一些具有只读访问权限的内存页面。我打印/proc/self/maps以检查内存保护是否正常工作。即使的保护论据mmapPROT_READ

 7fec0c585000-7fec0c785000 r-xp 00000000 00:00 0
Run Code Online (Sandbox Code Playgroud)

这意味着当我要求内核分配一些只读内存页面时,也会将它们也标记为可执行。

我做了一些其他的测试,我意识到当我要求一个只写页面,PROT_WRITE 而没有时PROT_READmaps文件的输出是这样的:

7fec0c585000-7fec0c785000 -w-p 00000000 00:00 0 
Run Code Online (Sandbox Code Playgroud)

这意味着除了前面的示例外,PROT_READ等效于PROT_EXEC

同时调用mmap,也PROT_WRITE|PROT_READ可以执行。

我想知道是否有一种方法可以映射只读的无可执行内存的页面;还是一个读写但没有可执行文件的文件?


运行测试的计算机的信息:

  1. Linux Arch 4.1.6-1-ARCH#1 SMP PREEMPT Mon Aug 17 08:52:28 CEST 2015 x86_64 GNU / Linux

  2. 英特尔酷睿i5-2310,x86_64

linux mmap memory-mapping

3
推荐指数
1
解决办法
2495
查看次数

在C++中将指针转换为数组

CreateFileMapping函数返回一个指向内存映射文件的指针,我想将该内存映射视为一个数组.

这是我基本上想做的事情:

char Array[] = (char*) CreateFileMapping(...);
Run Code Online (Sandbox Code Playgroud)

除了显然我不能简单地挥动手臂并声明指针现在是一个数组.

你们有什么想法我能做到这一点吗?我不想将指针指向的值复制到数组中,因为这会对大文件使用太多内存.

谢谢一堆,

c++ arrays pointers memory-mapping

2
推荐指数
2
解决办法
2万
查看次数

如何将结构导出到文件,然后将内存映射到文件?

我有一个结构,我想导出到一个文件,然后mmap()该文件.一个问题是struct有一个成员变量是一个字符串,我不确定mmap如何处理它.在这种情况下,所有这些字符串都具有相同的大小,8个字符.我正在使用Windows,虽然我正在使用我在网上找到的mmap()函数,该函数应该复制Linux mmap()函数.

结构本身定义为:

struct testStruct
{
    string testString;
    unsigned int testInt;
    unsigned int tsetArr[9];
};
Run Code Online (Sandbox Code Playgroud)

是否可以为对象定义sizeof()的返回值?

是否可以映射包含结构数据的文件?

我必须使用什么代码将结构导出到文件,然后mmap它?

c++ struct mmap memory-mapped-files memory-mapping

2
推荐指数
1
解决办法
945
查看次数

在Cortex-M3上使用带预编址地址的带状宏时会出现问题

TL; DR:

  1. 为什么不(unsigned long)(0x400253FC)等同(unsigned long)((*((volatile unsigned long *)0x400253FC)))
  2. 如何制作一个与前者合作的宏?

背景资料

环境

我正在使用ARM Cortex-M3处理器,TI 的LM3S6965,以及他们的StellarisWare(免费下载,出口控制)定义.我正在使用gcc版本4.6.1(Sourcery CodeBench Lite 2011.09-69).Stellaris在"inc/lm3s6965.h"中提供了大约5,000个寄存器和内存地址的定义,我真的不想重做所有这些.但是,它们似乎与我想写的宏不兼容.

比特带

在ARM Cortex-M3上,一部分内存的别名为外设和RAM内存空间的每位32位字.将地址0x42000000的存储器设置为0x00000001会将地址0x40000000的存储器的第一位设置为1,但不会影响字的其余部分.要更改位2,请将0x42000004处的字更改为1.这是一个简洁的功能,非常有用.根据ARM技术参考手册,计算地址的算法是:

bit_word_offset = (byte_offset x 32) + (bit_number × 4)
bit_word_addr = bit_band_base + bit_word_offset
Run Code Online (Sandbox Code Playgroud)

哪里:

  • bit_word_offset 是位带存储区中目标位的位置.
  • bit_word_addr 是别名内存区域中映射到目标位的字的地址.
  • bit_band_base 是别名区域的起始地址.
  • byte_offset 是包含目标位的位带区域中的字节数.
  • bit_number 是目标位的位位置0到7

比特带的实现

"inc/hw_types.h"文件包含以下实现此算法的宏.为了清楚起见,它为基于字的模型实现它,该模型接受4字节对齐的字和0-31位的偏移,但结果地址是等效的:

#define HWREGBITB(x, b)                                               \
    HWREGB(((unsigned long)(x) & 0xF0000000) | 0x02000000 |               \
           (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2))
Run Code Online (Sandbox Code Playgroud)

该算法采用SRAM中的基数为0x20000000或外围存储空间为0x40000000),并将其与0x02000000进行或运算,并添加位带基址偏移量.然后,它将偏移量与基数相乘32(相当于左移五位)并加上位数. …

c casting cortex-m3 memory-mapping c-preprocessor

2
推荐指数
1
解决办法
1384
查看次数

WC vs WB内存?x86_64上的其他类型的内存?

你能描述一下x86_64上WC和WB内存的含义和区别吗?为了完整起见,请在x86_64上描述其他类型的内存,如果有的话.

memory assembly x86-64 memory-mapping cpu-cache

2
推荐指数
1
解决办法
1358
查看次数

使用 numpy 内存映射的 64 位系统中文件的最大大小是多少

我正在尝试处理一个大约 50 GB 的大文件。我正在尝试使用 numpy 内存映射访问该文件。我看到用于内存映射的文件大小有限制,32 位系统为 2GB。这是链接:https : //docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.memmap.html

我想知道使用 numpy 内存映射对文件大小是否有硬限制以获得良好的性能。

python numpy memory-mapped-files memory-mapping numpy-memmap

2
推荐指数
1
解决办法
1526
查看次数

通用寄存器通常是内存映射的吗?

我对内存映射和内存映射 I/O 很困惑。例如,ARM 体系结构 r0、r1 等中的通用寄存器是否通常是内存映射的?请帮忙。

assembly arm cpu-registers memory-mapping

2
推荐指数
1
解决办法
2672
查看次数