访问/ dev / mem的权限

我有一组关于/dev/mem

  1. 网上的很多文章似乎都把/dev/mem指向了"Physical RAM"的网关。 但是如果我是正确的, /dev/mem是处理器的"Physical Address Space"的网关,它可能包括许多硬件外设的控制寄存器,而不仅仅是RAM? 请纠正我,如果我错了!

  2. 为了防止攻击者误用/dev/mem和改变内核内存,需要启用一个标志CONFIG_STRICT_DEVMEM ,这会阻止用户应用程序访问超过1MB的物理地址空间。 我检查了我的电脑上的configuration文件(Ubuntu),发现CONFIG_STRICT_DEVMEM = y 。 我写了一个程序,试图读取超过1 MB的物理内存,我能够读取! 没有分段错误或任何Operation NOT Permitted不允许的错误。 这怎么可能?

我的程序大致如下所示:

 fd = open ( "/dev/mem", O_RDWR); ptr = (int*) mmap(0, MAP_SIZE, PROT_READ, fd, myAddress & (~MAP_MASK)); printf("%d", *ptr); 

Solutions Collecting From Web of "访问/ dev / mem的权限"

  1. 是的,你是对的,/ dev / mem允许你映射任何物理地址,包括非RAM内存映射的IO。 这可以用于快速和肮脏的黑客访问某些硬件设备,而无需编写内核驱动程序。

  2. CONFIG_STRICT_DEVMEM使用arch/x86/mm/init.c devmem_is_allowed()在/ dev / mem中devmem_is_allowed()内核检查地址,其中的注释说明:

     * On x86, access has to be given to the first megabyte of ram because that area * contains bios code and data regions used by X and dosemu and similar apps. * Access has to be given to non-kernel-ram areas as well, these contain the PCI * mmio resources as well as potential bios/acpi data regions. 

    你的地址0xFFFF0000非常可能是非RAM,因为BIOS通常把IO内存放在4GB以下,所以你甚至可以用STRICT_DEVMEM来映射它。

以下是什么收益率:

 cat /dev/mem | wc 

我得到:

 cat: /dev/mem: Operation not permitted 1908 11791 1048576 

所以对我来说,它停在1MB。

请注意,猫使用开放,而不是mmap,所以它不是一个完全相同的测试。

你确定你读的是1MB以上?