Zephyr系统快评

请保留:【作者:张佩】 【原文:www.yiiyee.cn/blog】

Zephry是Linux基金会托管的一个嵌入式RTOS系统,主导开发的是Intel。我对这个系统进行了学习之后,得到了下面的5条总体认识。

  1. Zephyr的内核模式是宏内核,不是微内核;设备驱动都被集成在内核中;内核编译采用Kconfig脚本配置,资源配置也通过它在编译时指定
  2. Zephyr支持的平台:arm、x86、RISC-v、ARC、NIOS 2、POSIX等
  3. ARM平台支持不完全:只支持arm 32系列的m/r平台,a平台不支持;同时,也不支持arm64
  4. Zephyr支持100多种嵌入式开发平台,嵌入式友好;内核size可以小至8kB
  5. Zephyr只有mpu(内存保护单元)的支持,任务之间的内存是相互隔离的,但不支持虚拟内存;多个用户应用同时运行有一定的困难,目前仅支持单应用的形式

内核实现

Zephyr采用的是标准的宏内核的架构,这对于它面向MCU进行开发是有利的。如果采用微内核的话,需要有稳健的IPC机制,不仅执行效率上有所降低,并且需要更多的代码量。

继续阅读“Zephyr系统快评”

5,784 total views, no views today

鸿蒙OS速览

请保留 -> 【作者:张佩】【原文:www.yiiyee.cn/blog

鸿蒙在HDC 2019上作为最重要的产品被隆重推出,现在已经为世人所知。它的三个重要特点是:

第一,它基于微内核的实现,可以很好地运行于IoT及安全相关的嵌入式场景中;

第二,它是分布式架构,使得它可以很好地运行于多端协作的场景;

第三,它面向的是全场景的应用,囊括了像智能穿戴这样的IoT设备、智慧大屏、智能终端以及PC机等。其中荣耀大屏(电视)是它第一个产品。

鸿蒙OS主要特性速览和解析

preview
继续阅读“鸿蒙OS速览”

4,167 total views, no views today

Little Kernel 代码走读(二)

作者:张佩】【原始链接:www.yiiyee.cn/blog

任务管理

LK支持多任务,并且也支持多核。多任务和调度,是LK内核最复杂的功能。一般的嵌入是系统,为了实现简单和便利部署的考虑,会把多任务实现得比较简单,比如uos这样的rtos系统便是了。但LK其实有比较丰富而全面的多任务支持的基础。这使得一些功能更全面的微内核系统比如Zircon,会选择基于它进行开发。

线程结构体

每个内核实现都会为线程创建一个结构体,用来管理任务的执行和维护线程状态。由于无受限的多任务支持能力,所以系统中的线程数量和功能,是不受限的。所以要有一种管理设施,能够对所有的任务进行无区别的管理(某些时候是有区别的,比如idle线程、init线程等,但很少)。这个模块就是内核的任务管理器。而它管理这些任务的抓手,就是线程结构体。

下面是LK定义的线程结构体:

继续阅读“Little Kernel 代码走读(二)”

7,849 total views, 3 views today

Little Kernel 代码走读(一)

作者:张佩】【原始链接www.yiiyee.cn/blog

Little Kernel是一个微型内核,某种意义上,可以被定义为微内核。当下声势大张的谷歌Fuchsia OS的微内核系统就是从它演进而来的。它更为一般的作用,是在安卓设备中,作为一个典型的boot loader并启动安卓OS。相较于更通用的arm平台上的u-boot,它当然更加地简单。所以如果不需要boot loader中实现复杂的功能,特别是不需要驱动复杂的IO设备的话,little kernel是非常合适的。

当然,并不是说Little Kernel(简称LK)没有IO支持。它对于基本的IO设备还是有接口层面的支持的。比如串口、GPIO、基于frame buffer的图形显示设备,以及更高级的设备比如磁盘设备、USB、网络等,甚至virtio设备。但仅限于接口定义,却缺少具体的设备支持。所以新平台的设备驱动开发是一个巨大任务。

在这个文档中,我带领大家一起走读一下LK的核心代码。

LK内核代码走读

这部分我带领大家走读一下LK内核部分的代码。因为代码很简单,所以走读一遍并不费事。和Linux内核相比,走读LK的内核如同在电视上看别人爬山一样,所费精力与实际爬山之人,实有天壤之别。但如鲁迅说的,我的双脚虽不能如愿地周游世界,但通过眼睛却能部分地实现它,观看风光纪录片便如部分地身临其境地领略了那些风光,也能增广见闻的。所以LK虽微,分析它亦不费事,但学习它也能达到增广见闻的目的,部分地达到学习内核实现的目的。

LK官方有一篇和小的文档介绍内核API,然太简。参考。下面我带领大家分别地看一下LK的内存管理、任务管理和同步机制,这三个主要部分的实现逻辑。

继续阅读“Little Kernel 代码走读(一)”

17,213 total views, 3 views today

用“忙碌度”来度量设备虚拟化的性能

本文讨论设备性能的一般度量方法,并根据性能判断的基准点是否确定唯一,将设备性能分为外部性能内部性能 两类。

外部性能

我们采用很多方法来量化一个设备的性能,一般是横向比较,也就是运行一些基准测试软件来获得针对指定设备的测试成绩,作为度量设备性能的量化数据。但是,如果只有单个设备的量化成绩,其实作用不大。100分的成绩,对应的性能到底为高、中或低,需要和更多的设备进行横向比较,才能体现出来。业界会针对某类设备,设立若干个性能相关的标杆基准点,来判别不同的量化分数所对应的性能级别。值得注意的是,这个所谓的标杆基准点,可能是有形的数字,但更可能是无形的,由一些评测实验室在他们的评测报告中体现,当一款新的旗舰设备隆重上市后,旧标杆将随之被修正。

换句话说,通过横向比较为来判断性能时,在不同的时间,比较和判断的标杆基准点很可能是不同的。如果你淘了一块心仪已久的两年前的旗舰显卡,欣欣然准备要大显身手的时候,重新评估一下这块显卡在今天的性能地位,发现已经掉档到入门级别了,你可能会大失所望吧。设备本身的性能并未改变,变化的是评判的标准。

硬件生产工艺的进步,会带来设备性能的大幅提升,特别是摩尔定律还在发生作用的年代,这个提升的幅度是指数级别的,非常惊人。影响性能成绩的另一个因素,是测试软件自身的代码演进和优化程度。一个并不罕见的情况是,使用不同的基准测试软件,对不同的设备进行测试,如果这些设备在市场上的目标定位相同,最后的测试成绩很可能互有参差,而不是一边倒地断定出孰优孰劣。在某个测试软件中,A产品领先一些,另一个测试软件中,B产品则略胜一筹。还有一种情况是,将某个基准测试软件版本升级之后,重新测试某产品,可能会发现结果大不相同。再比如,同一块显卡上,使用不同的3D编程接口(如OpenGL、DX或其它),在渲染相同的内容时,性能也可能不同。这是3D编程接口需要不断迭代升级的一个原因,如何通过优化自身的结构,来更好地发挥硬件的有限性能。

软件的编程方式和优化特性的选择,对不同的设备会产生不同的性能表现。

这种通过外部横向比较而产生的性能数据和判断依据,称为外部性能。其典型特征是:性能的判断依据不断变化——主要地,其性能基准点不断地被提高。

内部性能

继续阅读“用“忙碌度”来度量设备虚拟化的性能”

3,483 total views, no views today

GVT对显示引擎的虚拟(2)

引用注明>> 【作者:张佩】【原文:http://www.yiiyee.cn/Blog/

  • 1. GVT对显示中断的模拟

ISR
中断能打断普通线程的执行

显示引擎定义的中断大部分都是通用型的,不同设备厂商开发的不同代产品在工作的时候,都会不断产生这些中断。比如同步中断(v-sync和h-sync)、vblank中断、扫描中断,这些中断和终端显示器对帧囊(FrameBuffer)的处理相关,在数据处理过程中不断地实时产生;以及插拔检测(hot plug detection)中断,当显示器插入或拔出Port的时候产生。显示引擎也可能会定义一些私有类型的中断,因不同的显卡设备而异,比如一些错误检测中断,其实是硬件和软件驱动之间的一种简单的通信机制。

GVT虚拟的显示设备只实现了最基本的功能,所以模拟通用型中断就足够了。实际上,GVT现在的代码只模拟了vblank和flip done两种中断,发现已经能够满足系统驱动和大部分应用软件的需求了。当然这是不够的,已经发现了一些应用软件,依赖于线扫描中断和垂直同步中断,不久的将来,GVT会陆续加入对它们的支持。理想的情况是GVT把所有的通用型显示中断都模拟好,我们不能假设形形色色的应用软件永远不会使用某种通用型中断。 继续阅读“GVT对显示引擎的虚拟(2)”

5,459 total views, no views today

GVT对显示引擎的虚拟(1)

引用注明>> 【作者:张佩】【原文:http://www.yiiyee.cn/Blog/

server-virtualization
这是一幅描绘了平台虚拟化的示意图

GVT是Intel针对集成显卡(IGD)设备实现的虚拟化方案,最近已经被成功地Upstream到了Linux内核4.10中了。所以用户只要拥有一份最新的Linux内核代码或镜像文件,就可以尝试这个很酷的显卡虚拟化功能。但GVT只是一个核心模块,剥离了和具体的系统虚拟化方案的耦合性,所以要想通过GVT来虚拟化你的显卡,还必须结合特定虚拟化平台下的适配模块。GVT本身是平台无关的,它通过一套公共的接口来抽象各种虚拟化平台的功能。

KVMGT是一起被Upstream的另一个模块,它就是在KVM(Kernel Virtual Machine)平台下GVT的适配模块。虚拟软件比如QEMU在KVM平台上,可以通过KVMGT暴露的用户层接口,来创建和维护GVT的虚拟GPU实例。将来,GVT在XEN和其它虚拟化平台下的适配模块,也将会被Upstream到Linux内核中去,不过这需要一些时间和持续的努力。 继续阅读“GVT对显示引擎的虚拟(1)”

3,880 total views, no views today

浅论Intel GPU虚拟化实现方案GVT

引用注明>> 【作者:张佩】【原文:http://www.yiiyee.cn/Blog/

v0.3 (未完成版,慎勿转载)

kvmgt
KVMGT未upstream前的架构图

在最近的Linux内核4.10的发布中,Intel的GPU虚拟化方案(GVT)完成了代码上传,从此成为Linux内核的一部分。GVT在4.10的发布文档中,作为主要的新特性之一而被发布者隆重地介绍。在过去的两年中,我作为一名开发者,参与到了GVT的开发过程中。对此重大里程碑事件深感欣慰。将陆续写作一些文章,对Inte的GPU驱动和虚拟化实现,进行由粗入细的介绍。

我近来对于一些计算机术语,产生了一点个人趣味上的偏好,细节在此不能备述,容后专文细讲。这里就两个用惯的术语,要在文章中,做很大的习惯上的改变,读者可能会觉得很不适应。无法,我确定了要这样做,只能请读者忍耐。

术语新译
Context:境(一般译作:上下文)
Execution Context:执行境
Hardware Context: 硬境
Logic Context:拟境
buffer:囊(一般译作:缓冲区)
Ring buffer:环形囊

继续阅读“浅论Intel GPU虚拟化实现方案GVT”

8,626 total views, 1 views today

网络内核调试的春天

今天试了两个虚拟机,virtualbox和vmware player,看能不能支持网络调试。结果非常满意,两个虚拟机软件默认配置的虚拟网卡,都能用于建立网络内核调试连接,我三下两除二地,就把内核调试给建立了。vmware中的网卡设备是82574L Gigabit NIC,设备ID是8086/10D3。VirtualBox中的网卡设备是Pro/1000 MT(即颇为经典的E1000系列),设备ID是8086/100E。检查Windows网络内核调试所支持的NIC列表,发现这两块网卡,都在被支持的列表中。链接:Supported NIC for network kernel debug。

不同的虚拟机软件配置其虚拟网卡的方式不尽相同,我比较喜欢VirtualBox,它直接提供了一个可选列表框让用户选择,默认是Pro/1000 MT。VMWare Player则没有类似的接口,但我查看了网上的一些资料,用户也可以通过直接修改配置文件的方式,配置虚拟网卡的类型。 继续阅读“网络内核调试的春天”

3,698 total views, no views today

全局观Windows BCD

引用注明>> 【作者:张佩】【原文:http://www.yiiyee.cn/Blog/
v1.0
BCD Objects
  • 引入BCD

系统启动是一件困难的事情,面对困难,在实现的时候尽量简单化,是个保守而易用的原则。所以Windows系统最初的启动配置文件是一个文本格式的文件(boot.ini),系统启动管理器通过解析文本内容,提取启动参数。

启动配置数据(Boot Configuration Data,简称BCD)是在Vista的时候引入的新机制,目的是希望把启动弄得复杂一点——不不,抱歉我说反了,目的是用一个综合而安全的方案,满足日渐复杂的启动需求。更进一步说,BCD的引入是希望把现存和可能的多种启动方式,和系统启动过程的扩展和配置需求,集成在统一的接口中进行管理和使用。这个统一的配置接口能够覆盖各种需求,包括不同的启动方式,支持休眠与唤醒,实现系统的回退安装,支持启动初期的硬件检测等。

人们对BCD的态度褒贬不一。从肯定的方面看,当一个事物的复杂性增加时,换用更灵活的手段对它重新管理和呈现,是发展的必然。就好比从蜗居换入广厦,室内装修和布置方案,自然是可以大作改观的。从批评的一方看,很多开发者认为,BCD以元数据的方式保存配置信息,数据本身不具有可读性,同时BCD的结构设计得相当复杂,对于学习和使用都缺乏亲和性。他们一致的看法是,虽然boot.ini简陋,但BCD却过于激进,更受青睐的方式是grub方式的配置文件,grub是一种在Linux系统上被广泛使用的启动管理器,其配置文件是文本文件格式的,可直接使用文本编辑器进行编辑和查看,同时还达到了功能完备的目的。

纷争虽然存在,但学习是唯一手段。作为既成的事实,BCD在Windows系统上的重要性业已根深蒂固,如此重要的系统基础设施,已经没有推翻重来的可能性。

继续阅读“全局观Windows BCD”

8,995 total views, 1 views today

我后十年的技术路

过去一年我是比较地迷茫的,这种迷茫是源于我对过去十年工作的反思,一种无意义的反思。

过去十年,我的主要工作是在Windows系统环境下编写内核驱动,我几乎涉及过80%的驱动类型,并在后四年里专门做图形显示驱动。另一项主要的工作内容是软件调试,在AMD工作时,我每个礼拜要至少完成3个debug任务;我每年都会遇到一两个特别奇怪而紧急的问题,最后通过艰深困苦的汇编调试,证明是微软的代码bug。

时间促使我反思,在长久的埋头苦作后,我灵光一现地抬起头来,发现自己做的所有工作,好像都只是皮毛和外表。我做不到以三言两语来描述通常要长篇大论描述的问题,因为我尚被无数的细节所羁绊,远未能抵达其核心。事物的真实面貌并没有被真实展现,我看到的只是包装过的模样,尚不了解它的骨肉和肌理。 继续阅读“我后十年的技术路”

46,177 total views, 8 views today

GPU异步V-Sync技术方案

引用注明>> 【作者:张佩】【原文:www.YiiYee.cn/blog

2014年中,我在公司内部提交了一个名为“异步Timing”(又名“异步V-Sync”)创新方案,用于解决GPU使用V-Sync同步所导致的问题。但十分可惜的是,Intel的创新审核委员没有通过我的方案,只礼貌性地回了一封感谢邮件。这件事情本来尘埃落定,我已不作多想。但最近很多IT新闻介绍了AMD在今年CES上所展示的一项FreeSync技术,惊喜颇多。我发现AMD的FreeSyn技术所要解决的问题和采取的策略,与我的“异步Timing”的设计方案十分相似。我写作此文,向大家介绍V-Sync的基本概念和产生的问题,以及异步Timing方案的细节。

在计算机图形显示系统中,这几个概念是相互关联的:Timing(时序),V-Sync(垂直同步),Refresh Rate(刷新率)。它们是从同一个地方衍生出的概念:Timing Controller(时序控制器,简称T-Con)经过配置后产生连续的Timing时序,Timing时序决定了何时会产生一个V-Sync中断;显示器每收到一个V-Sync中断,便开始一次显示刷新;显示器每秒刷新的次数就对应了它的Refresh Rate(刷新率)。 继续阅读“GPU异步V-Sync技术方案”

9,409 total views, 1 views today

Windows安全软件的思考

引用注明>> 【作者:张佩】【原文:www.YiiYee.cn/blog

最近以来,我重新翻阅了几本Windows系统下的安全类书籍,同时上网查阅资料,很意外地发现,很多几年前流行的牛叉技术,虽然还在书本和网页上历历在目,但实际上多数已不能在新系统中使用了。我由此也发生了一些个人的思考,虽然多年不接触安全技术,但思考的能力还在。

分析安全问题的来源

总是因为存在安全隐患,才有了攻击动作的发生而因为有了大量的攻击,才继而产生了安全防护的需求。所以一定要研究安全隐患的来源。总体上分类,安全问题可以划分为本地和分布式两种,所以安全攻击的方法也可以分为本地攻击和分布式网络攻击。

先看存在于本地机器上的安全隐患,也就是在一台安装了Windows系统的PC机内部的安全隐患,把它分成下面两类:

第一类,是OS架构本身存在的结构性的设计缺陷或不周到,从而导致了被后门软件利用,并据此发动的针对本地资源的攻击。这些不周到主要体现在OS为一系列的Hook技术提供了便利。存在于Windows系统上的Hook技术,从1990年代以来就一直很热门。概言之,它包括静态修改二进制文件和执行时动态修改运行逻辑这两种方法。 继续阅读“Windows安全软件的思考”

3,363 total views, no views today

多了一个“星号”

引用注明>> 【作者:张佩】【原文:www.YiiYee.cn/blog

国庆假期我看WDK 8.1中的sample项目,遇一极有趣问题,和基本的指针使用有关,特缀文于此。请看下面是WDK8.1 msplot项目中的一段代码(经我简化过),三行而已,作一个减法运算。注释中的例值,其期望结果应是0x10,但意外得到一个溢出后的大值:

/* struct _PLOTGPC                      */
/* {                                    */
/*  //...                               */
/*  LPVOID pData;                       */ 
/* };                                   */

LPBYTE *pByte = pPlotGPC->pData; // pByte:0x0040fa30
pByte -= (ULONG_PTR)pPlotGPC;    // pPlotGPC:0x0040fa20
pPlotGPC->pData = pByte;         // 结果:0xff3d11b0

继续阅读“多了一个“星号””

5,292 total views, no views today

假货泛滥是淘宝的毒瘤

引用注明>> 【作者:张佩】【原文:www.YiiYee.cn/blog

我前段时间装修房子,好几个月都没有更新博客。但手里却已经积攒了十多个可供写作的dump文件。现在终于用空了,再次面对word文档敲击键盘时,我却并不急于去分析任何一个dump文件,而要来谈谈淘宝网。有一件发生在眼前的事情,勾起我的一些思考,使我要发挥一番。

买到假货

我前天在天猫上买了一根USB转串口线(商品link)。这是一种很简单的线材,把电脑上的USB口转成串口输出,或把外部串口转成USB输入。串口这种古老的接口,在上世纪曾广泛使用,但进入新世纪后就逐渐被USB接口代替而几乎销声匿迹。如果不是因为一些很传统的需求,现在已很少有它的用武之地。仅在一些特殊的应用领域,串口仍被某些设备所使用,比如老式的打印机、Modem以及串口调试等。现在的常用方式是把USB口转成串口并连接串口外设,这需要通过一根内含转换器的线缆来实现,也就是我买的这根线。

我在购买时特地只选了天猫店铺。这种线缆实现很容易,所以价格不贵,30元以内。我选择了一家地址显示为苏州的店铺,希望早点寄到。快递隔天即送到了,我对此很满意。包装不是密封的,我取出线缆,把USB口连接到电脑上并安装驱动,进行测试。我本以为这么一根简单而廉价的线缆,奸商们必不太愿意对它大费周章吧。但我却想错了。我晦气临头,发现自己买到了假货。 继续阅读“假货泛滥是淘宝的毒瘤”

5,853 total views, no views today

Win32K里的死循环

引用注明>> 【作者:张佩】【原文:www.YiiYee.cn/blog

这是我到新公司后上手的第一个issue。一线工程师找到我,说有一个urgent issue有没有兴趣看一看。当时他已经组织了一个team的人帮助他,我便成了其中一员。

问题确实很紧急,已经影响了产线的生产。当时正临清明假期,导致很多人都岌岌可危地面临清明加班的可能。其实这个问题已经报出来好几个月,但一线工程师一直以绥靖政策对待,以各种方式把问题发生率降低到客户接受的水平。绥靖政策长时间以来是有效的,但最近却突然失效,发生率飙升到了20%。一线工程师才真的着急了。

问题定性

组一个team的人debug同一个问题,在我以前是未曾经历过的。初始的想法当然是认为人多力量大。但真正实施的时候,也可能遭遇人多嘴杂的窘况。 继续阅读“Win32K里的死循环”

7,628 total views, 1 views today