2013-10-10 52 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編程。

相關問題