2

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;
}
4

1 に答える 1

2

mmap()のドキュメントには次のように書かれています(私の強調):

次のmmap()場合、関数は失敗します。

EACCES

指定された保護に関係なく、fildes引数は読み取り用に開かれていません。または、fildesは書き込み用に開かれておらず、型マッピングPROT_WRITE 用に指定されていますMAP_SHARED

を指定するPROT_WRITEので、ファイルは書き込み用に開いている必要があります。あなたのコードはそれを読み取りのために開くだけです。

于 2013-03-25T12:44:46.497 に答える