Answers:
sudo cat /dev/urandom > /dev/mem
不会做任何事情,因为sudo会提升cat的特权,而不是重定向的特权。您可以sudo su
在root shell中进行操作然后使用,或者使用
sudo dd if=/dev/urandom of=/dev/mem
/dev/mem
提供对物理内存(即系统中所有RAM)的访问,但这并不意味着您可以对RAM进行完全的读/写访问(请参阅本文档中的CONFIG_STRICT_DEVMEM选项)。另请注意,物理内存的某些区域将映射其他设备,例如视频卡内存等。
盲目地写作/dev/mem
将导致不确定的行为,这是一个youtube视频在做同样的事情。
用测试 busybox devmem
busybox devmem
是mmaps的小型CLI实用程序/dev/mem
。
您可以通过以下方式在Ubuntu中获取它: sudo apt-get install busybox
用法:从物理地址读取4个字节0x12345678
:
sudo busybox devmem 0x12345678
写入0x9abcdef0
该地址:
sudo busybox devmem 0x12345678 w 0x9abcdef0
来源:https : //github.com/mirror/busybox/blob/1_27_2/miscutils/devmem.c#L85
MAP_SHARED
映射时/dev/mem
,您可能需要使用:
open("/dev/mem", O_RDWR | O_SYNC);
mmap(..., PROT_READ | PROT_WRITE, MAP_SHARED, ...)
MAP_SHARED
使写操作立即进入物理内存,这使观察起来更容易,并且对硬件寄存器写操作更有意义。
CONFIG_STRICT_DEVMEM
和 nopat
要/dev/mem
查看和修改内核v4.9上的常规RAM,必须首先:
CONFIG_STRICT_DEVMEM
(在Ubuntu 17.04上默认设置)nopat
x86 的内核命令行选项没有这些端口,IO端口仍然可以工作。
另请参阅:https : //stackoverflow.com/questions/39134990/mmap-of-dev-mem-fails-with-invalid-argument-for-virt-to-phys-address-but-addre/45127582#45127582
缓存刷新
如果尝试写入RAM而不是寄存器,则内存可能会被CPU缓存:https : //stackoverflow.com/questions/22701352/how-to-flush-the-cpu-cache-for-a-region -of-address-space-in-linux,但我没有看到一种非常可移植/简单的方法来刷新它或将该区域标记为不可缓存:
因此,也许/dev/mem
不能可靠地用于将内存缓冲区传递给设备吗?
不幸的是,由于QEMU不模拟缓存,因此无法在QEMU中观察到。
如何测试
现在是有趣的部分。以下是一些不错的设置:
volatile
在用户态进程上分配变量/proc/<pid>/maps
+ 获取物理地址/proc/<pid>/pagemap
devmem2
,并观察用户态进程的反应:kmalloc
virt_to_phys
并将其传回用户空间devmem2
devmem2
写入寄存器printf
从虚拟设备中出来以响应
dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM