3

ハードウェアチップのデータシートから、

Peripherals (at physical address 0x20000000 on) are mapped into the kernel virtual 
address

 space starting at address 0xF2000000. Thus a peripheral advertised here at bus address 
0x7Ennnnnn is available in the ARM kenel at virtual address 0xF2nnnnnn.

次に、サンプルコードから、

  #define BCM2835_PERI_BASE          0x20000000

プログラマーは仮想アドレスを扱うことになっていると思っていましたが、物理アドレスは背後に隠れています。MMU は、物理アドレスの小さい方を隠し、仮想アドレスを大きくします。エンド ユーザー/プログラマーは仮想アドレスを扱います。

しかし、上記のサンプル コードでは明らかに物理アドレスが使用されていますが、なぜでしょうか?

サンプルコード

     #define BCM2835_PERI_BASE           0x20000000
    #define GPIO_PADS       (BCM2708_PERI_BASE + 0x00100000)
    #define CLOCK_BASE      (BCM2708_PERI_BASE + 0x00101000)
    #define GPIO_BASE       (BCM2708_PERI_BASE + 0x00200000)
    #define GPIO_TIMER      (BCM2708_PERI_BASE + 0x0000B000)
    #define GPIO_PWM        (BCM2708_PERI_BASE + 0x0020C000)

   static volatile uint32_t *pads ;



 if ((fd = open ("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0)
return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: Unable to open /dev/mem: %s\n", strerror (errno)) ;

       pads = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PADS) ;
4

1 に答える 1

3

カーネル開発者が仮想メモリで作業するのは事実ですが、開発者は依然として物理メモリについて心配する必要があります。

お使いのデバイスには、物理​​アドレス GPIO_PADS に GPIO コントローラーがあります。メモリにアクセスする必要がある GPIO をプログラムしたいとします。

表示されているコードはmmap、GPIO_PADS で物理アドレスを取得するための呼び出しを行い、MMU を取得してこれを仮想アドレス空間にマップします。これで、メモリを直接読み書きし、必要な GPIO プログラミングを行うことができます。

于 2013-10-10T17:33:34.857 に答える