ハードウェアチップのデータシートから、
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) ;