Qemu虚化HW相关—Apple的学习笔记

一,前言

近期工作中有新的内容,我业余时间就把精力放在了学习这些新的内容上,由于我理解工作相关内容都是保密的,所以就没有发布博客。最近工作上的相关技术学完了,那么又开始我之前的qemu学习计划了。

我回顾下,为什么要学习qemu,主要原因是它和嵌入式底层相关,和图像处理及os相关。而我主要的技术储备及兴趣爱好就是围绕这些内容。所以选择qemu开源软件作为学习和模仿对象。

二,虚化HW相关

因为很久没有用qemu了,然后之前的stm32 led开源在qemu_stm32版本上实现仿真,我突然想不明白,stm32没有操作系统的文件系统,我之前是怎样把led.hex运行起来的。复习了下,其实就是运行qemu作为参数把led.hex传入的。因为stm32没有linux这样的文件系统。所以qemu仿真的顺序是先初始化了stm32的内核及外设后,执行led.hex仿真外设。

今天我没有调试,主要是花费点时间,稍微复习了下原来的学习小结,qemu主要框架就是基于glic的事件触发机制。注册管道进行通知,建立3个thread。
事件触发入下图就是将io操作变为信号,作为虚拟机cpu的中断。

image.png

那么本次我直接看HW和仿真相关的内容,打开boards-discovery.c看了下代码,关于初始化都是会调用object.c中的API。后来网上查了下qom模型,是qemu设置的面向对象的设计模型。Object,objectclass,typeInfo,typeImp等,这个网上有很多资料介绍,qemu官网应该也有。等于要创建开发板,则需要注册对象,比如cpu,比如button和led等对象。然后就是设置属性,将对象构建完成,那么HW的仿真模型就建立了。意味着可以和我出入了led.hex形成交互,仿真LED动作了。

接着就是仿真HW的显示界面了。这是什么原理呢?还记得我安装编译的时候需要安装SDL2的相关库文件吗?对的,显示界面就是用了SDL2。我在代码中的gpio_led_instance_init_callback函数中,看到了colour.redstate->colour.red关键字。继续搜索可以看到cortexm_graphic_led_init_graphic_context函数,此函数在graphic.c中,里面有SDL_FillRect函数,用来绘制矩形颜色,而led变颜色,应该就是此函数绘制的。

SDL我之前用过API创建显示窗口,制作框,然后配合opengl做渲染。但是具体的API什么含义也不熟悉,所以下一步会设置一个SDL2专题。至少我要把graphic.c中用的SDL相关API弄清楚含义,然后所有函数的功能大概的分析下。界面显示这块内容就完成了,将来可以进行界面自定义了。

三,graphic中SDL2显示分析

由于SDL2显示相关看着还真是简单,所以我不再写新的blog文章了,直接添加在第三章。主要是以前有vulkan的学习,所以render和surface及texture等概念基本都清楚。然后graphic处理的结构代码写的也比较清楚,优秀的代码看起来就应该是这样不费脑力的设计,哈哈~

cortexm_graphic_process_event是10ms的周期扫描处理。里面包括了标准的windows和surface创建,包括了rander和texture转为888rgb格式等。还用到了SDL2的扩展库SDL_Image来初始化加载图片。如下常用函数都用到了

初始化: 
SDL_Init(): 初始化SDL。 
SDL_CreateWindow(): 创建窗口(Window)。 
SDL_CreateRenderer(): 基于窗口创建渲染器(Render)。 
SDL_CreateTexture(): 创建纹理(Texture)。 
循环渲染数据: 
SDL_UpdateTexture(): 设置纹理的数据。 
SDL_RenderCopy(): 纹理复制给渲染器。 
SDL_RenderPresent(): 显示。

里面还有SDL的鼠标事件,识别到鼠标位置后,会判断是否在button范围内,这个和我之前stm32的鼠标处理是一样的思路。这里主要就是button和LED这2个对象,button是鼠标输入,LED是renderUpdate用来做LED ON和OFF。

至于SDL相关函数的功能都可以在其官网上找到,写的也很清楚,很好理解。

你可能感兴趣的:(Qemu虚化HW相关—Apple的学习笔记)