2012-01-20 27 views
2

我想在我的ARMv6裸機應用程序中使用usermode和SVC,但爲此我需要設置ARMv6中斷向量表的SVC條目以分支到我的中斷處理程序。但是,我無法找到一個很好的例子來說明如何做到這一點(即:我需要設置什麼內存地址,以及如何設置)。過去我做過類似的事情,但總是使用更全面的引導加載程序(RedBoot),它爲我設置了一些此類功能。任何幫助,將不勝感激。設置中斷向量表ARMv6

我測試用我的應用程序:

qemu-system-arm -M versatilepb -cpu arm1176 

回答

3

你談論SWI中斷?或其他人之一(FIQ,IRQ)。無論如何,我想我知道問題是什麼。 Qemu用於運行linux,您的二進制文件不會被加載到地址0x00000,因此您的入口點不會被qemu用於處理異常。

我有一個使用qemu並實現解決方案的示例。轉到http://github.com/dwelch67/yagbat的qemu目錄。 qemu的例子與yagbat repo中的gba沒有什麼關係,gba是一個32位ARM的東西,所以很容易從代碼中借用代碼,所以我把它粘在那裏。

這個例子是專門爲你的問題寫的,因爲我試圖弄清楚如何以這種方式使用qemu。看起來,地址0x00000000空間被模擬爲ram,因此您可以重新編寫qemu異常表,並在您的二進制文件加載的0x10000地址空間中有異常調用代碼。

一個快速和骯髒的解決方案是使二進制的入口點(該qemu加載到0x10000)類似於地址0x00000處的向量表。 ldr pc指令是相對於程序計數器的,反彙編可能表明它正在加載一個地址爲0x10000,但它實際上是相對於pc而言的,反彙編器使用假設正在使用的鏈接地址的pc。

.globl _start 
_start: 
    ldr pc,start_vector_add 
    ldr pc,undef_vector_add 
    ldr pc,swi_vector_add 


start_vector_add: .word start_vector 
undef_vector_add: .word undef_vector 
swi_vector_add: .word swi_vector 

然後,在您想要導致任何中斷之前,在該示例中,我使用swi指令導致swi中斷。您從0x10000到0x00000複製足夠的代碼以包含異常表和它加載到PC中的地址列表。通過鏈接你的程序到0x10000這些地址在0x10000範圍內。當發生中斷時,你現在修改的異常處理程序會將基於0x10000的地址加載到PC中,並且0x10000範圍內的處理程序將被調用。

使用這個命令行來在我的例子運行的二進制

qemu-system-arm -M versatilepb -m 128M -kernel hello_world.bin 

,然後CTRL-ALT-3(不是F3,但3)將切換到串行控制檯,你可以看到輸出,並關閉該窗口關閉qemu並停止模擬。

+0

我還沒有完全做到這一切工作在我的應用程序,因爲我遇到了一個相關的問題: - 一旦我可以得到解決(希望),我將能夠使這項工作,然後我會接受你的答案:) – singpolyma

+0

你看我的例子嗎?它會做你想在另一個bug,引導臂,從手臂調用C等等,你需要的只是輸入make。因爲我的代碼不使用庫,如果它不是我的版本,應該可以使用gcc編譯器。 –

+0

更改此行CROSS_COMPILE?= arm-none-eabi爲您正在使用的任何(gcc)編譯器,arm-linux-gnueabi –