分享一下最近修改 jk2410-emulator 的心得

jollen 發表於 April 10, 2007 10:03 PM

來分享一下最近修改 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 必須修改此部份。

20070410-1.JPG

到這裡就只剩實作問題了,不過,由於 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() 看起。

讀者留言 (0)

留言功能維護中。將於近日重新開放。

連絡作者

Jollen Chen,Moko365(仕橙3G教室)講師,熱愛研究 Linux 與 Android 技術。曾為 Motorola、HTC、Foxconn、LG、OPPO、騰迅、廣達電腦、緯創、仁寶等超過 50 家企業講授課程。目前在 MokoVersity 擔任軟體工程師,撰寫 Node.js 程式,也在幾家科技廠兼任 Android Framework 研發顧問。您可透過電子郵件 <jollen (at) jollen (dot) org> 或這裡與我連絡。