备模拟目的
我们好像不会干一件事而毫无目的,就算不停刷微信朋友圈也是为了打发你无聊的时间。
其实最装B的回答是:设备模拟的目的就是模拟设备。这话是屁话,不过也能说明些什么,确实是模拟设备,用软件的方式提供硬件设备具备的功能。
对于和PC机交互的硬件设备,主要要干两件事,一是提供IRQ中断,二是响应IO输入输出。IO包括PIO/MMIO/DMA等(DMA算不算IO?)
以i8254.c实现的pit为例,主要提供了IRQ注入和PIO响应,见初始化函数pit_initfn:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
static
const
MemoryRegionOps
pit_ioport_ops
=
{
.
read
=
pit_ioport_read
,
.
write
=
pit_ioport_write
,
.
impl
=
{
.
min_access_size
=
1
,
.
max_access_size
=
1
,
}
,
.
endianness
=
DEVICE_LITTLE_ENDIAN
,
}
;
static
int
pit_initfn
(
PITCommonState
*
pit
)
{
PITChannelState
*
s
;
s
=
&
pit
->
channels
[
0
]
;
/* the timer 0 is connected to an IRQ */
//这里有个irq_timer,用于qemu_set_irq提供中断注入
s
->
irq_timer
=
qemu_new_timer_ns
(
vm_clock
,
pit_irq_timer
,
s
)
;
qdev_init_gpio_out
(
&
pit
->
dev
.
qdev
,
&
s
->
irq
,
1
)
;
memory_region_init_io
(
&
|