我正在尝试将内存映射文件用作:
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) 关于使用共享内存我有两个问题.我正在使用CreateFileMapping在两个进程之间创建共享内存区域.
1)我知道我需要在从CreateFileMapping或OpenFileMapping调用返回的每个句柄上调用CloseHandle以释放内存.我的问题是,如果使用共享内存的程序退出而不调用CloseHandle,那么所有句柄是否都会被Windows XP/7解除分配?IE - 使用mem的所有进程关闭后是否有可能发生内存泄漏?
2)我使用MapViewofFile获取指向mem的指针.在一个实例中,我假设共享内存将始终存在于方法的上下文中.所以我已经将MapViewOfFile的返回值保存为指针并关闭了mem的句柄,我只是使用指向共享内存的指针(但仍然锁定对它的访问).这样安全,还是每次访问共享内存时都应该调用MapViewOfFile?
谢谢,
伊恩
我想编写一对程序,其中一个程序读取数据并将其传输到内部格式,另一个程序将内部格式转换为其他程序.作为一个练习,我想在不使用管道的情况下编写这些程序之间的交互.我更喜欢使用信号和共享内存.
我有程序A和B,其中A调用B.我怎么能
更具体地说,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吗?
我试图使用mmap函数分配一些具有只读访问权限的内存页面。我打印/proc/self/maps以检查内存保护是否正常工作。即使的保护论据mmap是PROT_READ
7fec0c585000-7fec0c785000 r-xp 00000000 00:00 0
Run Code Online (Sandbox Code Playgroud)
这意味着当我要求内核分配一些只读内存页面时,也会将它们也标记为可执行。
我做了一些其他的测试,我意识到当我要求一个只写页面,PROT_WRITE 而没有时PROT_READ,maps文件的输出是这样的:
7fec0c585000-7fec0c785000 -w-p 00000000 00:00 0
Run Code Online (Sandbox Code Playgroud)
这意味着除了前面的示例外,PROT_READ等效于PROT_EXEC
同时调用mmap,也PROT_WRITE|PROT_READ可以执行。
我想知道是否有一种方法可以映射只读的无可执行内存的页面;还是一个读写但没有可执行文件的文件?
运行测试的计算机的信息:
Linux Arch 4.1.6-1-ARCH#1 SMP PREEMPT Mon Aug 17 08:52:28 CEST 2015 x86_64 GNU / Linux
英特尔酷睿i5-2310,x86_64
CreateFileMapping函数返回一个指向内存映射文件的指针,我想将该内存映射视为一个数组.
这是我基本上想做的事情:
char Array[] = (char*) CreateFileMapping(...);
Run Code Online (Sandbox Code Playgroud)
除了显然我不能简单地挥动手臂并声明指针现在是一个数组.
你们有什么想法我能做到这一点吗?我不想将指针指向的值复制到数组中,因为这会对大文件使用太多内存.
谢谢一堆,
我有一个结构,我想导出到一个文件,然后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它?
TL; DR:
(unsigned long)(0x400253FC)等同(unsigned long)((*((volatile unsigned long *)0x400253FC)))?我正在使用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(相当于左移五位)并加上位数. …
你能描述一下x86_64上WC和WB内存的含义和区别吗?为了完整起见,请在x86_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
我对内存映射和内存映射 I/O 很困惑。例如,ARM 体系结构 r0、r1 等中的通用寄存器是否通常是内存映射的?请帮忙。