【问题标题】:Accessing hardware registers in Linux userspace在 Linux 用户空间中访问硬件寄存器
【发布时间】:2013-03-14 23:01:16
【问题描述】:

我希望在 Linux 用户空间中写入 OMAP3530 上的硬件寄存器。请找到下面的代码。 Mmap 返回错误:

内存映射失败。错误-1

mmap:权限被拒绝

#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

#define BASE_ADDRESS 0x48050000

int main()
{
        int mem;
        unsigned int *value;
        void *ptr;

        /* Open /dev/mem */
        if ((mem = open ("/dev/mem", O_RDONLY | O_SYNC)) == -1)
                fprintf(stderr, "Cannot open /dev/mem\n"), exit(1);

        ptr = mmap (0, 8192, PROT_READ|PROT_WRITE, MAP_SHARED, mem, BASE_ADDRESS);

        if(ptr == (void *) -1) {
                printf("Memory map failed. error %i\n", ptr);
                perror("mmap");
                }

        value = (unsigned int*)(ptr + 0x4BC+((1-1)*0x90)+(0*0x04));
        *value = 479*799*3-4;
        printf("value = %i", value);

        value = (unsigned int*)(ptr + 0x4C4+((-1)*0x90));
        *value = 1;
        printf("value = %i", value);

        value = (unsigned int*)(ptr + 0x4C8+((-1)*0x90));
        *value = 1;
        printf("value = %i", value);
        return 0;
}

【问题讨论】:

    标签: linux memory memory-management


    【解决方案1】:

    mmap() 的文档说(强调我的):

    如果出现以下情况,mmap() 函数将失败:

    EACCES

    fildes 参数未打开以供读取,无论指定何种保护,或 fildes 未打开以供写入和PROT_WRITEMAP_SHARED 类型映射指定

    由于您指定了PROT_WRITE,因此该文件应打开以供写入。您的代码仅打开它以供阅读。

    【讨论】:

    • 更改了 mem = open ("/dev/mem", O_RDWR | O_SYNC),仍然报错:内存映射失败。错误 1 ​​mmap:不允许操作
    • upps,对不起,我在 x86 上遇到了这个错误,但在 ARM OMAP3530 上它可以工作。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-08-30
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2012-05-17
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多