Little Kernel 代码走读(二)

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

任务管理

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

线程结构体

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

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

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

7,898 total views, 2 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,298 total views, 8 views today

Windbg调试命令详解

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

1. 概述

用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe、ntsd.exe、kd.exe和Windbg.exe。其中cdb.exe和ntsd.exe只能调试用户程序,Kd.exe主要用于内核调试,有时候也用于用户态调试,上述三者的一个共同特点是,都只有控制台界面,以命令行形式工作。

Windbg.exe在用户态、内核态下都能够发挥调试功能,尤其重要的是,它不再是命令行格式而是采用了可视化的用户界面。所以绝大部分情况下,我们在谈及Windows调试工具的时候,都直接指向Windbg,而不大谈及前三者。

Windbg在用户态和内核态下,都支持两种调试模式,即“实时调试模式(Living)”和“事后调试模式(Postmortem)”。所谓实时模式,是被调试的目标对象(Target)当前正在运行当中,调试器可以实时分析、修改被调试目标的状态,如寄存器、内存、变量,调试exe可执行程序或双击双机实时调试都属于这种模式;所谓事后模式,是被调试的目标对象(Target)已经结束了,现在只是事后对它保留的快照进行分析,这个快照称为转储文件(Dump文件)。 继续阅读“Windbg调试命令详解”

50,351 total views, 23 views today

Windows的PNP和电源特性概述

欢迎转载作者:张佩】【原文:http://www.yiiyee.cn/Blog/pnp/

这一节讲述一般设备的PNP和电源特性。

PNP特性

PNP是Plug And Play的简称,代表和外部设备插拔有关事件的处理。PNP是现代操作系统必须支持的基本特性,其目的是希望操作系统能够在软硬件支援下,在基本无需用户干预的情况下,即可很好地处理外部设备的接入和移除操作;当设备配置发生动态变更时,系统也能悄没生息地处理好,并一切正常地使用它们。

stocking-station

有些笔记本是当成工作站来用的,这样就需要很多外部接口。但一般的笔记本,局限于物理空间,不能够提供过多的外部接口,会使用接口坞来扩展(见左图例)。大的接口坞上通常有十几、数十个扩展接口,来满足工作站的接口要求。其实,一些移动设备,如手机、平板电脑,也使用接口坞的方式实现扩展,不过接口少一些。接口坞接入主机的时候,系统如果有PNP支援,就能够直接使用上面的接口了,不用重启系统,一般也不用手动安装设备驱动。 继续阅读“Windows的PNP和电源特性概述”

6,687 total views, 2 views today

Windows显示驱动(WDDM)编程初步(2)

欢迎转载作者:张佩】【原文:http://www.yiiyee.cn/Blog/wddm2/

第二部分专门只讲VIDPN。这是后面内容的基础。WDDM框架用VIDPN这个概念,来描述它所要处理的显示关系。

1. VIDPN

VIDPN的全称是Video Present Network,这个因为词组不太好翻译(直译可以是:视频提交网络,但颇为难听),所以一般都直接讲它的英文。

VIDPN是WDDM引入的概念,用来描述通过显卡设备(Adapter)建立的若干个显示源(Source)和若干个目标接口(Target)之间的关系。系统按照VIDPN所定义的方式,将一个或多个显示源(Source)通过显卡设备,输出到这些目标接口(Target)上。
继续阅读“Windows显示驱动(WDDM)编程初步(2)”

24,167 total views, 9 views today

Windows显示驱动(WDDM)编程初步(1)

欢迎转载作者:张佩】【原文:http://www.yiiyee.cn/Blog/wddm1/

WDDM Frame

Windows显示驱动从Vista开始,使用新的WDDM编程框架,称为Windows Display Driver  Model。也有一种最初的名称是LDDM,L代表Longhorn,但后来微软在所有产品线上都不再使用Longhorn代号,故而改成现在的名称。虽然在有些地方还能看到LDDM的说法,但应理解成旧文档的遗存,不应该做概念上的区分。

WDDM框架是一种典型的小端口(miniport)驱动框架。NT系统中的所有小端口框架,都是基于WDM框架来实现的,但小端口框架对外提供了更高级的接口,以简化编程的难度,并提高稳定性。如下图所示,中间的WDDM是系统提供的编程框架,我们基于这个框架,编写里面的小端口驱动,也就是显示驱动。 继续阅读“Windows显示驱动(WDDM)编程初步(1)”

30,442 total views, 16 views today

小z说:内核驱动的编译环境

作者:张佩】【原始URLhttp://www.yiiyee.cn/Blog/KernelBuildEnviroment/

[download id=”2″]

这一章驱动小z继续带大家遨游驱动王国。在这块地面上,小z是个地头蛇,跑动跑西惯了。贵读者有什么地方想特别了解的,都可以告诉我,很乐意陪您做半日游。

所谓登高必有卑,在把大家引入到高山圣境之前,先要在山脚下徜徉几时,为的是把一些预备的事情交代清楚。这一节讲的是驱动程序编译环境。Windows内核驱动的历史有多久,它的开发环境就要有多久,所以是很有历史的话题。话分两头讲,它起先是很不好,后来则非常好。很不好的时代是旧社会,现在则已是非常好的新时代。
继续阅读“小z说:内核驱动的编译环境”

7,849 total views, 3 views today