來分享一下最近修改 jk2410-emulator 的心得,簡單紀錄重點,不過應該對有志研究 qemu 的 developer 有些啟發作用;OrzLab 有意舉辦 qemu 的讀書會,到時一定要跟大家多多請教,了解這個模擬器的明日之星。
對於 qemu internal 的研究,我還算是新手,幾天前從 jserv 那拿來了 openmoko-emulator 後,再參照 qemu-neo1973,做了一些小修改。最近在研究 qemu PC emulator,由於 qemu 可以研究的地方真的很多,像是:
- dynamic translator(解譯 target CPU opcode 的核心)
- accelerator(kqemu)
- translation cache
- MMU emulation
- Linux system call 的處理
- System emulator(vl)
- (...more)
所以如果不能結合大家的力量來 hacking 的話,的確還挺辛苦的。不過,其中 system emulator 的實作因為和週邊硬體的模擬有關,所以花了比較多時間在這個部份。以 S3C2410A 這顆 SoC 的模擬來說,target 是使用 'target-arm/' ,不過,由於官方發佈的 mainstram 版本似乎沒有定義 ARM920T 的 CPU ID,所以由 OpenMoko & OpenedHand 所實作的 'qemu-neo1973' 在 'target-arm/cpu.h' 加了相關定義:
#define ARM_CPUID_ARM920T 0x41129200
在 qemu system emulator 初始化「machine」時,會需要指定 CPU ID;其它的部份,像是 SoC 的 controller 部份,qemu-neo1973 已經對 qemu 註冊好 IO 與 memory 的資訊,對於 S3C2410A 這顆玻璃製品的支援算是完備。
最後,則是 machine 的模擬部份。Qemu system emulator 提供一個介面如下:
int qemu_register_machine(QEMUMachine *m) {
QEMUMachine **pm; pm = &first_machine; while (*pm != NULL) pm = &(*pm)->next; m->next = NULL; *pm = m; return 0; }
可參考 hw/neo1973.c 的實作:
QEMUMachine neo1973_machine = { "neo", "Neo1973 phone aka FIC GTA01 aka OpenMoko (S3C2410A)", neo_init, };
'Machine' 的註冊是寫在 system emulator 裡,即 vl.c,並透過 qemu-system-arm 的 '-M' 參數來指定所要模擬的 machine。關於 machine 的部份,雖然同樣是基於 S3C2410A 的 PCB,但是週邊與 GPIO 的規格還是有差異,因此 jk2410-emulator 必須修改此部份。
到這裡就只剩實作問題了,不過,由於 qemu-neo1973 並沒有完整模擬所有 S3C2410 controller 的行為(register read/write),所以可能要先自己再實作一小部份,或是等待 OrzLab 更新 openmoko-emulator。
另外,順帶一提,qemu 的 ELF loader(elfload.c)是由 kernel 移植而來:
/* This is the Linux kernel elf-loading code, ported into user space */
可由 elfload.c:elf_exec() 看起。
Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue
您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw