我想通过在linux中使用mmap()将其映射到虚拟地址来写入/def/mem的区域

问题描述 投票:0回答:1

我的代码是这样的:

    mfd=open("/dev/mem", O_RDWR | O_SYNC)
    mmap(0, length, PROT_WRITE|PROT_READ, MAP_SHARED, mfd, offset)

我知道,使用标志 MAP_SHARED,其他进程可以访问这个映射区域。

我也知道,使用标志 MAP_PRIVATE,我无法写入映射区域,因为写入操作时进行复制。

所以我想知道的是,是否有一些解决方案来阻止其他进程的访问(写入)。

c linux kernel mmap
1个回答
0
投票

我知道,使用标志 MAP_SHARED,其他进程可以访问这个映射区域。

有点。如果您使用

MAP_SHARED
,则映射将由底层文件动态支持,因此写入该文件的更改可以被其他进程在文件中以及其他进程的文件(共享)映射中观察到,这样,其他进程对底层文件或同一区域映射后的共享映射的更改就可以通过映射观察到。 地图本身对其他进程不可见,除非您这样做。

我也知道,使用标志 MAP_PRIVATE,我无法写入映射区域,因为写入操作时进行复制。

再次,有点。使用
MAP_PRIVATE

,映射由底层文件(如果有)“静态”支持。如果您要求映射区域是可写的,但对它的写入不会传递到底层文件,并且未指定其他进程在映射后对该文件的写入是否通过映射可见。

写时复制不是造成这种情况的原因,而是其机制。

所以我想知道的是,是否有一些解决方案来阻止其他进程的访问(写入)。

使用

MAP_SHARED

映射文件不会为随机其他进程提供比其他进程更多的对该文件的访问权限。如果您的进程分叉了其他进程,那么您可能希望确保他们在继续正常工作之前取消映射该区域,但即使这样也可能没有必要。特别是,当子进程立即
exec

是另一个程序时,就没有必要了。

但是请注意,
/dev/mem

并不一定提供对所有内存的访问。事实上,它很可能根本不允许访问任何 RAM,而只允许访问硬件内存映射区域。


© www.soinside.com 2019 - 2024. All rights reserved.