微信号:cpp_coder

介绍:最专业的C/C++编程学习和程序员发展的综合平台.提供C/C++、汇编语言等、STL、MFC、QT等等学习、数据结构算法思维分析、各领域项目经验分享、资源下载、招聘和资讯的综合服务.

Windows核心编程基础开篇:计算机体系结构分层入门讲解

2016-04-12 23:56 cpp_coder

文章来源:C++技术网 原创文章版权所有,未经授权,禁止转载。

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

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

【计算机体系分层简图】

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

文章来源:C++技术网 原创文章版权所有,未经授权,禁止转载。

关注微信号,回复“干货”获取干货下载地址(干货即项目源码哦!)或者登陆个人中心下载


 
CPP技术网 更多文章 宏、常量、枚举、结构体和共用体对比分析之常量 宏、常量、枚举、结构体和共用体对比分析之结构体 C/C++声明定义初始化和赋值独家剖析深刻理解 mfc的消息机制,多窗口的互动 MFC中的窗口类:C++类与窗口句柄的结合深入浅出分析
猜您喜欢 Android Service使用拾遗 那些创意的表白在设计师的眼中都弱爆了 数据分析师做竞品分析的正确姿势 7岁失明的微软程序员,竟发明了让盲人“看见”世界的眼镜 第二篇|求职面试时常被问到的65个问题与技巧性回答(二)