【发布时间】:2020-05-02 02:05:24
【问题描述】:
#include <stdint.h>
#include <stddef.h>
#include <stdio.h>
static void foo(void){
volatile uint32_t *temp_addr;
temp_addr = (uint32_t*)(0x01C20C00);
*temp_addr =0;
}
int main(){
tinit();
};
它编译但返回Segmentation fault 消息作为结果。我只想重置寄存器0x01c200c00 中的所有位。
【问题讨论】:
-
对。但是您是从 Linux 用户空间运行它的。你得到了
Segmentation fault,因为该地址没有映射到进程的内存中。 -
作为普通用户,您无法访问硬件,AFAIK。这就是@dragosht 所说的。
-
这样想,你有 kernel-space 和 user-space 其中 kernel-space 受到保护用户空间中发生的任何事情。这是一项安全功能,可保护内核免受任何错误或恶意 user-space 进程的影响。 (现在有权限提升机制允许 user-space 代码与 kernel-space 进程交互)。您正试图绕过所有 kernel-space 保护直接访问 kernel-space
TIMER地址。那是行不通的,(如果这样做了,就不会有 kernel-space 和 user-space 之间的分隔) -
内核和运行时库可能通过包含适当的标头并使用提供的计时器函数之一来提供与该计时器正确交互的能力。由于上述原因,查找计时器的地址并尝试直接访问它可能会失败。在控制台窗口中输入
apropos timer以查看可用的计时器功能列表:getitimer, settimer, timer_create, ... -
您需要编写内核驱动程序,使用 mmap() 或者如果工具/库已经可用于该处理器/平台,请使用那些(首先因为它们会干扰您尝试的任何其他操作)。
标签: c raspberry-pi arm hardware-programming