2013-10-10 19 views
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) ; 
+0

你可以参考哪个硬件芯片,或者是发现它的上下文的链接? – BlackVegetable

+0

Broadcom 2835 ARM外设数据表。我只是问我们是否想要使用物理地址或虚拟地址,这适用于所有硬件芯片,不仅适用于broadcom的 – lilzz

+0

此代码是否在ARM内核中运行?如果不是,则上述说明不适用。 – ams

回答

3

虽然这是事实,内核开发人员在虚拟内存工作时,开发人员还需要担心的物理内存。

您拥有的物理地址为GPIO_PADS的设备具有GPIO控制器。您希望对需要访问其内存的GPIO进行编程。

您所显示的代码将调用mmap以获取GPIO_PADS中的物理地址并获取MMU将其映射到您的虚拟地址空间。您现在可以直接读写内存并执行所需的GPIO编程。

相关问题