2020年3月11日星期三

arm_emulator: 用C写的一个兼容ARMv4指令集的模拟器

       大概2000多行C代码,可以移植。支持所有基本指令集,CP15协处理器,所有异常、支持MMU。没有浮点fpu和除法、非对齐访问以及16位指令thumb支持。支持单步运行调试。

MMU相关的CP15寄存器:
0:ID 编码&cache 类型(只读)
1:控制位
2:地址转换表基地址(TTB)
3:域访问控制位
5:失效状态寄存器(FSR)
6:失效地址寄存器(FAR)

外设寄存器:
中断控制器寄存器(0x4001f040)
(0x0)MSK:中断屏蔽寄存器(置1有效)
(0x4)PND:中断状态寄存器(硬件置位、软件清零)
定时器寄存器(0x4001f020)
(0x0)CNT: 计数值寄存器(只读,单位毫秒)
(0x4)EN:定时器使能寄存器
兼容8250 的串口寄存器(0x40020000)
(0x0)DLL, THR, RBR:传输保持&接收缓存寄存器
(0x4)DLH, IER:中断使能寄存器
(0x8)IIR, FCR:中断指示(读)&FIFO控制寄存器(写)
(0xC)LCR:线路控制寄存器
....
指令计数器(0x4001f030)
(0x0)CC:读取已执行的指令数,调试用(32bit)

中断:
0:10ms定时器
1:串口

移植了keil&gcc裸机、freeRTOS、linux 5.1 内核的工程,文件系统用的buildroot,基于initramfs,可以登录进串口终端。

CPU信息:
[root@armemulator ~]# cat /proc/cpuinfo
processor       : 0
model name      : ARM920T rev 5 (v4l)
BogoMIPS        : 20.24
Features        : swp half
CPU implementer : 0x41
CPU architecture: 4T
CPU variant     : 0x0
CPU part        : 0x920
CPU revision    : 5
Hardware        : ARM Emulator (Device Tree Support)
Revision        : 0000
Serial          : 0000000000000000

模拟器涉及的平台相关函数:
IO:
#define KBHIT()   kbhit() 
#define GETCH()   getch()
#define PUTCHAR(c)   putchar(c)
时钟:
#define GET_TICK()   (clock()*1000/CLOCKS_PER_SEC)

地址:
项目地址: https://github.com/hxdyxd/arm_emulator
Linux内核地址:https://github.com/hxdyxd/arm-emulator-linux

没有评论:

发表评论