什么是/ dev / mem?


40

大概与内存有关吗?什么会

sudo cat /dev/urandom > /dev/mem

做?破坏所有RAM?所有非内核虚拟内存?以上都不是?


2
另请参阅:dd if=/dev/urandom of=/dev/kmem bs=1 count=1 seek=$RANDOM
user3490 2012年

6
内存保护是否应该停止所有进程的物理内存访问,但已分配给该RAM区域的进程除外?还是sudo会覆盖该保护?
马修·洛克

Answers:


32

它提供对系统物理内存的访问。

mem(4)手册页介绍了更多关于什么/dev/mem是。

是的-可能会引起各种各样的问题。重新启动应该可以解决问题,但很容易发生坏事。小心!:-)


4
我建议回顾一下内存手册页。破布是正确的。“ mem是字符设备文件,它是计算机主内存的映像。例如,它可以用于检查(甚至修补)系统。mem中的字节地址被解释为物理内存地址。” 并且...“文件kmem与mem相同,只是访问内核虚拟内存而不是物理内存。”
Shickadance先生11年

@Andrew Flanagan:您的链接现在显示了如何使用time命令设置秒表。
Aiyion.Prime

1
@ Aiyion.Prime。谢谢-指向archive.org版本。
Andrew Flanagan

19

/ dev / mem提供对系统物理内存(而非虚拟内存)的访问。可以使用/ dev / kmem访问内核虚拟地址空间。

它主要用于访问与外围硬件(例如视频适配器)相关的IO内存地址。


9

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视频在做同样的事情。


7

用测试 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_DEVMEMnopat

/dev/mem查看和修改内核v4.9上的常规RAM,必须首先:

  • 禁用CONFIG_STRICT_DEVMEM(在Ubuntu 17.04上默认设置)
  • 传递nopatx86 的内核命令行选项

没有这些端口,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
    • 从内核模块查询值
  • IO内存和QEMU虚拟平台设备
    • 创建具有已知物理寄存器地址的平台设备
    • 用于devmem2写入寄存器
    • 手表printf从虚拟设备中出来以响应

5

/ dev / mem通常提供对整个物理地址空间的访问。这包括ram,但也包括任何内存映射的IO设备。

许多现代内核将使用“ CONFIG_STRICT_DEVMEM”进行配置,这会将/ dev / mem限制为仅用于内存映射的IO设备。

向其写入随机垃圾是一个坏主意,但是很难预测到底会发生什么。硬件可能以不可预测的方式响应随机垃圾,损坏的内核内存结构可能会导致不可预测的内核行为。充其量我可以预期系统崩溃,最坏的数据损坏甚至硬件阻塞都不是不可能的。

PS请注意,以普通用户身份运行时,您的命令不应执行任何操作,因为sudo仅消除了cat命令,而不消除了重定向。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.