当前位置:C++技术网 > 资讯 > Windows核心编程入门:1 计算机体系结构分层入门讲解

Windows核心编程入门:1 计算机体系结构分层入门讲解

更新时间:2016-04-10 19:01:05浏览次数:1+次

    本文虽然要讲的东西是高大上的技术,在计算机研究生课程中才有的。似乎对于平民是无法触及的技术知识,然而我却不这么想。我甚至都是非计算机专业的,但是谁也无法阻挡我学习计算机的热情。不仅要学习,而且还要深入探究。学习计算机并不是计算机专业的专利,只要你有兴趣,你就可以学,而且可以学的很好。
    对于计算机体系结构的探索,是设计良好计算机系统和计算机操作系统的必要的条件。因为是入门讲解,所以不必抛出一大堆的专业词汇,迷乱读者的双眼。我尽可能将专业术语通俗化,如果你水平变高了,可以接触更多专业书籍,我这里只是做个引路罢了,让你对这种高大上的技术知识不会望而却步,或者感觉很容易迷失在技术深渊中。
    我独立创办C++技术网,就不是简单的想自己写写博客,分享一点经验而已,而是想做更多的有意义的事情,在C++技术网上,我可以做更多事情,没有平台的阻拦和限制。所以,这些文章都选择放在C++技术网而不是其他网站,当然,必要的分享是可以的。不过,C++技术网作为集中的技术探索平台,将可以让你更多的集中学习,而不是零散的学习。不要问我为什么不将教程发布在其他平台,或者开源平台上,我不想太分心,维护好网站平台就够了。还有更多的技术需要去探索。不过也感谢各位的建议。

    先看看计算机体系分层简图:

【计算机体系分层简图】
    然后我对计算机体系分层简图做一个详细的分析,让你对于整个技术体系有一个完整的了解,然后继续我们的Windows核心编程的学习。如果要深入学习计算机体系结构,可以看《深入理解计算机系统》这本书,可以先看看电子版,然后购买正版的书。
    我们做的应用程序开发,是系统程序中最上层的程序。也就是应用层程序。应用程序运行的状态,我们叫它用户态。对于用户态的具体解释,将在后续的文章中讲解。和用户态对应的,也就是内核态。对此我们暂时只需要一个简单的印象即可,后面会解释的。我们做的最多的就是用户态的程序了。比如写一个界面程序,写几个算法控制台程序等,基本就是我们写的处理业务的逻辑而已。
    所以写应用程序,基本就是处理业务逻辑的。业务是关键,你通过代码组织业务逻辑,实现功能,没有明显Bug,用户体验好,这个应用程序就很不错了。我们大多数人现在写的程序都是应用程序。厉害点的程序员,知道如何使用内核对象,会调用操作内核对象的函数,这也就是核心编程的东西了。其实这些都属于应用程序开发的范畴。
    只不过,你开始接触到内核,实际上你还在内核的外面,即应用程序范围。从简图中可以看到,内核的上层就是应用程序层了。那么我们要讲的核心编程其实就是操作内核对象,调用操作内核对象的API函数而已,还是应用程序开发哦。能够做到这一步,国内就算是不错的程序员了。然而,这才是刚刚开始。我们需要更多的大神,这才是一个起点。
    应用程序开发的东西,处理业务逻辑,会编程的,然后熟悉一下相关领域的编程,如数据库编程,都可以应付一般性的工作。如果你会核心编程,会操作内核对象,水平还不错。如果在应用开发熟悉之后,长时间不继续学习,久而久之,对于程序开发就只感觉是ifelse了,然后就产生无聊感,感觉没有意思。实际上,你是需要继续学习了。因为你在现在做的这个层次上的知识都掌握的差不多了。
    说完了应用程序,我们开始接触内核。我们这里说的内核,就是操作系统内核。操作系统的内核是系统的核心,没有内核,系统就是一个驱壳而已。所以,研究操作系统,一定要去研究内核,而不是停留在内核对象的使用。不过,内核对象的使用和操作,也可以促进你的内核的理解。虽然理解的不多,但是可以慢慢让你熟悉内核。不然一下子突然从应用程序切换到内核学习,你最基本的很多概念都不知道。核心编程和帮助你了解这些基础,也就是了解内核对外的表现的情况,我们的核心编程学习也就是在操作系统内核外围熟悉内核的运作模式。
    能够掌握核心编程,对于内核有了一定的了解,同时我们可以利用核心编程的技术,和帮助我们开发出更好的应用程序。这也是大多数人学习核心编程的原因。如果说学习核心编程是为了研究内核,恐怕就没有几个人愿意学了。谁敢动不动就研究内核,这真不开玩笑,内核还真不是那么好研究的。不过如果你想去研究,循序渐进一步步的了解,也是可以学的很不错的。
    我们后面讲的都是Windows核心编程的技术。核心编程技术现在都是很多人不清楚的,虽然会用点,知道大概怎么回事,但是却不能深入的了解这些机制,基本都是能用就行了。这对于深入学习,跨入内核研究是不够的。我也就是将我的理解分享出来,促进大家来轻松的掌握,让更多的人可以轻松跨入内核研究,而不是在核心编程这一步就被阻拦了。
    至于内核技术,需要很多理论的支持,我们这里讲的体系结构就是一个。所以,千里之行我们才刚走出了第一步。内核的详细解释,将在后面的文章分篇讲。在这里针对总体的结构做一个描述。本文说的内核不是具体一个操作系统的内核,而是一个通用的模型。
    既然内核是操作系统的核心,必然关键的任务也要在内核完成了。操作系统的核心功能就是提供一个简单的硬件操作方法。我们所有程序,都是在操作硬件。不要以为你的控制台显示一个hello world的程序就不会操作硬件哦。输出字符要用到屏幕这个硬件,代码执行要用到CPU硬件,代码存储要用到CPU,代码文件要用到硬盘。如果要输入,还要用到键盘。这些都是硬件哦。然而,我们写hello world的时候,却感受不到硬件的存在。那是因为操作系统给我们提供了一个简便的操作硬件的方法。
    是不是从代码中可以感受到操作系统的作用了呢?对于从内核到内核以下的所有层次,没有多少程序员说的清楚。目前我也只能简单的说说,更深入的知识还要阅读大量书籍。
    那么内核要做的几个基本的事情,要提供一个基本的对于硬件的操作,给应用程序提供API函数。比如我们使用CreateFile,我们传入文件名,就可以轻松创建一个文件。我们根本感觉不到硬件的。然而这个API函数调用之后,底下发生了很多事情,最好到文件写好放在硬盘为止。
    计算机中的标准硬件,是操作系统必须要支持好的。而且要给应用程序提供一个方便的使用方法,所以内核一般要将这些作为基础支持,放入到内核中。比如进程线程的管理、内存的管理、文件管理、网络管理等等,这些东西时时刻刻都要运行,所以这些内核功能都是时时刻刻待在内存中的。
    为什么Windows操作系统运行起来就耗费了那么多内存?内核程序一直在内存中运行咯。内核程序不运行,你怎么支持应用程序的运行呢?所以只是必须的内存开销。然而内核也不是直接操作硬件的。在很多操作系统中,都有一个硬件抽象层(HAL),这个硬件抽象层的作用就是屏蔽硬件的差异而存在。这样可以让内核不用管具体是什么设备,都可以进行管理。但是你在图中可以看到,内核中有一个虚拟驱动。这个也是我们一般写的驱动程序了。这个驱动一般是针对一类设备而写的。为什么这么说?我们底下不是有硬件抽象层吗?你还能为某一个设备写一个驱动程序吗?因为硬件抽象层已经抽象了硬件,上层看到的设备都是逻辑的设备了,不是真实的设备。只有硬件抽象层才知道一个逻辑设备对应哪一个真实的设备。
    但是一类设备,可以有很多型号,我们都要支持,我们可以写一个通用的驱动程序来驱动设备正确的运行。也就是说,虚拟驱动在内核中,为其他内核模块提供操作硬件的方法。然后虚拟驱动再去调用硬件抽象层进一步操作硬件。通过传入的参数,硬件抽象层来确定操作的具体的某一个设备。然而对于具体设备如何操作,硬件抽象层还是不知道的。HAL只是知道可以操作哪个设备,知道一个通用的操作指令,然而不同的设备有不同的操作指令,所以HAL就会将通用操作指令交给物理驱动来执行。
    一般情况,一个设备只能安装一个驱动。物理驱动程序就可以发具体的指令操作具体的设备了。我们应用程序调用CreateFile函数之后,通过一层层的向下调用,然后一直走到硬盘的物理驱动,驱动发各种指令来完成一系列的操作,最终在一个扇区写入了一段数据,在文件系统的文件表中添加了一项。然后一路返回,将得到一个指示文件的东西,在Windows中就是文件句柄了。你可以通过这个文件句柄,调用不同的文件操作函数来操作这个文件。
    其实这张图也很简单了,大概也能看的清楚是怎么回事了。我们这里不用很精确的了解各个部分的运作机制,只要知道各个部分大概是干嘛的,在整体上有这么一个结构就行了。然后在学习的时候,我们会针对各个部分深入的研究。
    补充一下,物理驱动,通常由硬件厂商提供。因为物理驱动要很清楚硬件的结构,要能够准确无误的操作硬件,这不是一般人能够随便写的。没有硬件的结构,你是无法写物理驱动的。然而我们通常说的驱动开发,基本上是虚拟驱动级别的开发,也就是内核级别的驱动开发,而物理驱动开发,算是硬件级别的开发了。物理驱动基本上是一系列的电平时序,完成各个部件的操作。
    以上是我对于整个计算机体系结构的一个简要的分析,对于计算机体系结构一无所知的同学们来说,有一定的参考意义,然而对于很熟悉计算机体系结构的人士来说,实际上是没有什么用的。当然,因为这是泛泛而谈,只是促进理解整个结构,所以并没有太多的专业知识。能够把握这个结构,就可以了。
    鉴于本人水平有限,如果有不准确或者不正确的地方,欢迎指正,洗耳恭听。本文作为核心编程的开篇,主要是让后续的文章有一个大概的认知前提,也不至于让将核心编程的内容时读者一脸懵逼。