- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个简单的程序试图访问用户空间中的物理内存,内核存储第一个结构页面。在 64 位机器上,这个地址是:
我试图通过用户空间的 mmap 访问这个物理地址。但是下面的代码会使内核崩溃。
int *addr;
if ((fd = open("/dev/mem", O_RDWR|O_SYNC)) < 0 ) {
printf("Error opening file. \n");
close(fd);
return (-1);
}
/* mmap. address of first struct page for 64 bit architectures
* is 0x0000620000000000.
*/
addr = (int *)mmap(0, num*STRUCT_PAGE_SIZE, PROT_READ, MAP_PRIVATE,
fd, 0x0000620000000000);
printf("addr: %p \n",addr);
printf("addr: %d \n",*addr); /* CRASH. */
最佳答案
我想我已经找到了问题——它与 x86 上的/dev/mem 内存映射保护有关。
请引用这篇 LWN 文章:“x86:使用配置选项引入/dev/mem 限制” http://lwn.net/Articles/267427/
CONFIG_NONPROMISC_DEVMEM
现在(我在最近的 3.2.21 内核上对此进行了测试),配置选项似乎被称为 CONFIG_STRICT_DEVMEM。
我更改了我的内核配置:
$ grep DEVMEM .config
# CONFIG_STRICT_DEVMEM is not set
$
当上面的 prg 使用 previous 内核运行时,设置了 CONFIG_STRICT_DEVMEM:dmesg 显示:
[29537.565599] Program a.out tried to access /dev/mem between 1000000->1001000.
[29537.565663] a.out[13575]: segfault at ffffffff ip 080485bd sp bfb8d640 error 4 in a.out[8048000+1000]
这是因为内核保护..
当内核被重建(使用 CONFIG_STRICT_DEVMEM UNSET)并且运行上面的 prg 时:
# ./a.out
mmap failed: Invalid argument
#
这是因为“offset”参数 > 1 MB(在 x86 上无效)(它是 16MB)。
使 mmap 偏移量在 1 MB 以内后:
# ./a.out
addr: 0xb7758000
*addr: 138293760
#
有效!有关详细信息,请参阅上面的 LWN 文章。
在支持 PAT(页面属性表)的 x86 架构上,内核仍然会阻止 DRAM 区域的映射。 kernel source中提到的原因是:
This check is nedded to avoid cache aliasing when PAT is enabled
此检查将导致与上述错误类似的错误。例如:
Program a.out tried to access /dev/mem between [mem 68200000-68201000].
可以通过禁用 PAT 来移除此限制。可以通过在启动时向内核命令行添加“nopat”参数来禁用 PAT。
关于c - 如何在不导致 Linux 内核崩溃的情况下访问 mmaped/dev/mem?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11891979/
在mutagen , 我正在注入(inject)各种代码中的突变。我想改变的一件事是模式 if let Ok(x) = y { .. } .然而,这构成了相当大的挑战,因为我不知道 y 的类型– 用户
在多处理器中,我们知道 lock inc mem :锁可以保证没有其他操作可以访问地址mem . 但是当一个处理器正在执行 mov eax,mem首先,然后在完成之前,第二个处理器执行 lock in
在通过 /metrics 端点公开的 Spring Boot 指标中,mem 和 mem.free 的含义是什么? 我们正在对部署在三个节点上的新 Spring Boot 微服务进行负载测试,每个盒子
我看了perf list的手册,找到了memory load/store的PMU事件定义: mem-loads OR cpu/mem-loads/ [Ke
Grub 是一个兼容多重引导的引导加载程序。当它启动操作系统时,它会创建一个定义可用内存的结构,并在内存中留下指向该结构的指针。 我在这里得到了这些信息: http://wiki.osdev.org/
我正在尝试实现 Wildfly 8.1.0。最终域设置,配置文件 full-ha,具有 1 个主服务器和 2 个从服务器,并通过 mod_cluster 进行负载平衡。 我的环境:1) VPS (Di
在 x86 上,如果 mem 是 32 位对齐的,那么 mov 操作保证是原子的。 如果 [mem] 不是 32 位对齐,可以 lock inc [mem]窗台工作正常吗? 工作正常:提供原子性而不是
基本上,我的问题是以下代码是否有效。 void* mem = operator new(sizeof(T)); T* instance = new(mem) T; delete instance; 如
int a[10]; int b[10]; memcmp(a, b, sizeof(int) * 10); memcmp() 只告诉我们哪个内存块更大/更小,因为它只返回 -1,0,+1。有没有一种方
fn main() { let k = "fire"; drop(k); println!("{:?}", k); } Playground 为什么删除后仍然可以使用k? dr
我有这个问题: let list = [(1,2);(2,3);(1,4);(5,0)];; List.mem (1,2) list;; - : bool = true 但是我需要修改这个函数,例如
我正在试验的问题与正确执行的 open() 或 mmap() 函数无关。我在内核中禁用了 CONFIG_STRICT_DEVMEM,所以我可以毫无问题地从 /dev/mem 中读取。实际上,我可以执行
如果我希望直接使用其他应用程序的虚拟地址访问数据,我可以使用虚拟地址访问 proc/[pid]/mem 吗?偏移量与虚拟地址相同吗? 从代码角度来看,如果我 fseeko(the-proc/[pid]
我正在开发 Raspberry PI (Linux rpi 3.12.28+),并且我有以下 C 代码,可用于操作 GPIO 端口: // IO Acces struct bcm2835_periph
我正在尝试为一个类(class)项目完成一个内存分配器的编写,这不是必要的作业,因为它没有被分配,我自己选择了这个项目。 我有两行标记为 #1 和 #2,两者都不起作用并给出不同的错误消息,以下是详细
这是我想写的代码: template class record : public record { using baseT = record; T1 elem; public: re
当使用这个表达式时: mem::size_of::() * 8 像这样: value % (mem::size_of::() * 8); value * (mem::size_of::() * 8);
我正在使用我的 Raspberry Pi,我正在编写一个 cgi python 脚本来创建一个网页来控制我的 gpio 输出引脚。当我尝试将 RPi.GPIO 导入为 GPIO 时,我的脚本崩溃了。这
我想控制对 dev/mem 的访问。 为了做到这一点,我正在考虑创建一个假的 dev/mem,以便进程访问它而不是实际的 dev/mem。 然后,我的进程将根据假进程中的更改修改 dev/mem。 这
我尝试打开/dev/mem。访问 /dev/mem 需要 root 权限才能打开该文件。 但是我无法在 super 用户中使用我的程序。所以我将/dev/mem访问权限更改为666(不要考虑安全问题!
我是一名优秀的程序员,十分优秀!