IO thread初始化
Qemu IO thread初始化函数位于main-loop.c:
int qemu_init_main_loop(void)
{
int ret;
GSource *src;
init_clocks();
if (init_timer_alarm() < 0) {
fprintf(stderr, "could not initialize alarm timer\n");
exit(1);
}
ret = qemu_signal_init();
if (ret) {
return ret;
}
qemu_aio_context = aio_context_new();
src = aio_get_g_source(qemu_aio_context);
g_source_attach(src, NULL);
g_source_unref(src);
return 0;
- init_clocks(): 依次创建rt_clock, vm_clock, host_clock三个时钟,这3个时钟区别,在qemu-timer.h中有简要的说明,后面讨论qemu时钟和定时器的时候,再详细的分析他们之间的区别。
- init_timer_alarm(): QEMU-KVM默认支持两种timer, 分别是dynticks timer和unix timer; dynticks timer使用timer_create(CLOCK_REALTIME)创建时钟,然后通过timer_settime()触发SIGALRM信号, 而unix timer使用setitimer来触发SIGALRM信号; 前者的实现会使用rdtsc, 所以精度更高些。QEMU-KVM默认使用dynticks timer.
- qemu_signal_init(): 该函数首先创建一个signalfd,&

本文深入分析QEMU-KVM的IO thread初始化,包括时钟设置、timer、信号处理和AIO上下文。IO thread主函数使用select和g_poll轮询系统IO,处理block io、signalfd、eventfd和socket。此外,还介绍了slirp(用户模式网络)以及IO Handler和AIO Handler的工作方式。最后,文章探讨了IO thread同步问题和可能的性能优化,如使用epoll替换select。
最低0.47元/天 解锁文章
1476

被折叠的 条评论
为什么被折叠?



