精华内容
下载资源
问答
  • 领域驱动实践总结二:架构分析与代码设计 领域驱动设计DDD是一种设计思想,它可以同时指导中台业务建模和微服务设计(中台本质是业务模型,微服务是业务模型的系统落地),领域驱动设计强调领域模型和微服务设计的一体...

    目录

    领域驱动实践总结二:架构分析与代码设计

    一、微服务架构模型的对比与选择

    (一)整洁架构

    (二)六边形架构

    (三)DDD 分层架构

    1.用户接口层

    2.应用层

    3.领域层

    4.基础层

    5.从三层架构向 DDD 分层架构演进

    (四)三种微服务架构模型的对比和分析

    二、领域驱动设计分层架构与微服务代码模型

    (一)代码模型总目录结构

    1.微服务一级目录结构

    2.用户接口层目录结构、职能和代码形态

    3.应用层目录结构、职能和代码形态

    4.领域层目录结构、职能和代码形态

    5.基础层层目录结构、职能和代码形态

    (二)应用层的领域对象分析

    1.实体方法的封装

    2.领域服务的组合和封装

    3.应用服务的组合和编排

    (三)领域层的领域对象分析

    1.设计实体

    2.找出聚合根

    3.设计值对象

    4.设计领域事件

    5.设计领域服务

    6.设计仓储

    (四)代码模型强调内容

    第一点:聚合之间的代码边界一定要清晰。

    第二点:你一定要有代码分层的概念。

    三、正确理解微服务的边界

    (一)逻辑边界

    (二)物理边界

    (三)代码边界

    四、正确认识服务和数据在微服务各层的协作

    (一)正确认识服务的协作

    1. 服务的类型

    2. 服务的调用(三类主要场景)

    微服务内跨层服务调用

    微服务之间的服务调用

    领域事件驱动

    3. 服务的封装与组合

    (二)正确认识服务数据的协作

    1.基础层数据协作

    2.领域层数据协作

    3.应用层数据协作

    4.用户接口层数据协作

    5.前端应用数据协作

    参考书籍、文献和资料


    领域驱动实践总结二:架构分析与代码设计

    领域驱动设计DDD是一种设计思想,它可以同时指导中台业务建模和微服务设计(中台本质是业务模型,微服务是业务模型的系统落地),领域驱动设计强调领域模型和微服务设计的一体性,先有领域模型然后才有微服务,而不是脱离领域模型来谈微服务设计。

    微服务拆分困境产生的根本原因:不知道业务或者微服务的边界到底在什么地方。

    DDD 核心思想:通过领域驱动设计方法定义领域模型,从而确定业务和应用边界,保证业务模型与代码模型的一致性。

    对于领域驱动设计的学习做的总结主要写三篇博客,主要包括三部分:基本理论总结与分析、架构分析与代码设计、具体应用设计分析,主要参考的资料为极客时间的欧创新架构师的《DDD》实战,其他参考书籍在文章下方的参考书籍中。

    本次主要总结DDD架构分析与代码设计:

    一、微服务架构模型的对比与选择

    微服务架构模型现有的选择模型包括:整洁架构、CQRS 和六边形架构、DDD 分层架构等。

    (注:CQRS架构之前博客中有讲,本次不做分析)

    每种架构模式虽然提出的时代和背景不同,但其核心理念都是为了设计出“高内聚低耦合”的架构,轻松实现架构演进。

    DDD 分层架构的思想使架构边界变得越来越清晰,它在微服务架构模型中,占有非常重要的位置。建议选择DDD 分层架构

    (一)整洁架构

    在整洁架构里,同心圆代表应用软件的不同部分,从里到外依次是领域模型、领域服务、应用服务和最外围的容易变化的内容,比如用户界面和基础设施。

    整洁架构最主要的原则是依赖原则,它定义了各层的依赖关系,越往里依赖越低,代码级别越高,越是核心能力。外圆代码依赖只能指向内圆,内圆不需要知道外圆的任何情况。

    (二)六边形架构

    六边形架构的核心理念是:应用是通过端口与外部进行交互的。

    也就是说,在下图的六边形架构中,红圈内的核心业务逻辑(应用程序和领域模型)与外部资源(包括 APP、Web 应用以及数据库资源等)完全隔离,仅通过适配器进行交互。它解决了业务逻辑与用户界面的代码交错问题,很好地实现了前后端分离。

    六边形架构各层的依赖关系与整洁架构一样,都是由外向内依赖。

    六边形架构的一个端口可能对应多个外部系统,不同的外部系统也可能会使用不同的适配器,由适配器负责协议转换。这就使得应用程序能够以一致的方式被用户、程序、自动化测试和批处理脚本使用。

    (三)DDD 分层架构

    从上到下依次是:用户接口层、应用层、领域层和基础层。

    1.用户接口层

    用户接口层负责向用户显示信息和解释用户指令。

    这里的用户可能是:用户、程序、自动化测试和批处理脚本等等。

    2.应用层

    应用层是很薄的一层,理论上不应该有业务规则或逻辑,主要面向用例和流程相关的操作

    位于领域层之上,领域层包含多个聚合,所以它可以协调多个聚合的服务和领域对象完成服务编排和组合,协作完成业务操作。

    应用层也是微服务之间交互的通道,它可以调用其它微服务的应用服务,完成微服务之间的服务组合和编排。

    注意

    • 在设计和开发时,不要将本该放在领域层的业务逻辑放到应用层中实现。因为庞大的应用层会使领域模型失焦,时间一长你的微服务就会演化为传统的三层架构,业务逻辑会变得混乱。
    • 应用服务是在应用层的,它负责服务的组合、编排和转发,负责处理业务用例的执行顺序以及结果的拼装,以粗粒度的服务通过 API 网关向前端发布。
    • 应用服务还可以进行安全认证、权限校验、事务控制、发送或订阅领域事件等。

    3.领域层

    领域层的作用是实现企业核心业务逻辑,通过各种校验手段保证业务的正确性

    领域层主要体现领域模型的业务能力,它用来表达业务概念、业务状态和业务规则。

    领域层包含聚合根、实体、值对象、领域服务等领域模型中的领域对象。

    注意:

    • 领域模型的业务逻辑主要是由实体和领域服务来实现的,其中实体会采用充血模型来实现所有与之相关的业务功能。
    • 实体和领域服务在实现业务逻辑上不是同级的,当领域中的某些功能,单一实体(或者值对象)不能实现时,领域服务就会出马,它可以组合聚合内的多个实体(或者值对象),实现复杂的业务逻辑。

    4.基础层

    基础层是贯穿所有层的,它的作用就是为其它各层提供通用的技术和基础服务,包括第三方工具、驱动、消息中间件、网关、文件、缓存以及数据库等。比较常见的功能还是提供数据库持久化。

    基础层包含基础服务,它采用依赖倒置设计,封装基础资源服务,实现应用层、领域层与基础层的解耦,降低外部资源变化对应用的影响。

    5.从三层架构向 DDD 分层架构演进

    DDD 分层架构中的要素其实和三层架构类似,只是在 DDD 分层架构中,这些要素被重新归类,重新划分了层,确定了层与层之间的交互规则和职责边界。

    • 三层架构向 DDD 分层架构演进,主要发生在业务逻辑层和数据访问层
    • DDD 分层架构在用户接口层引入了 DTO,给前端提供了更多的可使用数据和更高的展示灵活性。
    • DDD 分层架构对三层架构的业务逻辑层进行了更清晰的划分,改善了三层架构核心业务逻辑混乱,代码改动相互影响大的情况。
    • DDD 分层架构将业务逻辑层的服务拆分到了应用层和领域层应用层快速响应前端的变化领域层实现领域模型的能力
    • 数据访问层和基础层之间三层架构数据访问采用 DAO 方式DDD 分层架构的数据库等基础资源访问,采用了仓储(Repository)设计模式,通过依赖倒置实现各层对基础资源的解耦。仓储又分为两部分:仓储接口和仓储实现仓储接口放在领域层中,仓储实现放在基础层。原来三层架构通用的第三方工具包、驱动、Common、Utility、Config 等通用的公共的资源类统一放到了基础层。

    (四)三种微服务架构模型的对比和分析

    • 重点关注图中的红色线框,它们是非常重要的分界线,这三种架构里面都有,它的作用就是将核心业务逻辑与外部应用、基础资源进行隔离。
    • 红色框内部主要实现核心业务逻辑,划分了应用层和领域层,来承担不同的业务逻辑。
    • 领域层实现面向领域模型,实现领域模型的核心业务逻辑,属于原子模型,它需要保持领域模型和业务逻辑的稳定,对外提供稳定的细粒度的领域服务,所以它处于架构的核心位置。
    • 应用层实现面向用户操作相关的用例和流程,对外提供粗粒度的 API 服务。它就像一个齿轮一样进行前台应用和领域层的适配,接收前台需求,随时做出响应和调整,尽量避免将前台需求传导到领域层。应用层作为配速齿轮则位于前台应用和领域层之间。

    二、领域驱动设计分层架构与微服务代码模型

    DDD 并没有给出标准的代码模型,不同的人可能会有不同理解。这里我们在使用的时候还是建议按照欧创新架构师总结的来进行适用,具体如下:

    (一)代码模型总目录结构

    根据 DDD 分层架构模型建立了标准的微服务代码模型,在代码模型里面,各代码对象各据其位、各司其职,共同协作完成微服务的业务逻辑。它包括用户接口层、应用层、领域层和基础层,分层架构各层的职责边界非常清晰,又能有条不紊地分层协作。

    • 用户接口层:面向前端提供服务适配,面向资源层提供资源适配。这一层聚集了接口适配相关的功能。
    • 应用层职责:实现服务组合和编排,适应业务流程快速变化的需求。这一层聚集了应用服务和事件相关的功能。
    • 领域层:实现领域的核心业务逻辑。这一层聚集了领域模型的聚合、聚合根、实体、值对象、领域服务和事件等领域对象,以及它们组合所形成的业务能力。
    • 基础层:贯穿所有层,为各层提供基础资源服务。这一层聚集了各种底层资源相关的服务和能力。

    业务逻辑从领域层、应用层到用户接口层逐层封装和协作,对外提供灵活的服务,既实现了各层的分工,又实现了各层的协作。

    1.微服务一级目录结构

    微服务一级目录是按照 DDD 分层架构的分层职责来定义的。从下面这张图中,我们可以看到,在代码模型里分别为用户接口层、应用层、领域层和基础层,建立了 interfaces、application、domain 和 infrastructure 四个一级代码目录。

    2.用户接口层目录结构、职能和代码形态

    主要存放用户接口层与前端交互、展现数据相关的代码。前端应用通过这一层的接口,向应用服务获取展现所需的数据。这一层主要用来处理用户发送的 Restful 请求,解析用户输入的配置文件,并将数据传递给 Application 层。数据的组装、数据传输格式以及 Facade 接口等代码都会放在这一层目录里。

    具体如下:

    • Assembler:实现 DTO 与领域对象之间的相互转换和数据交换。一般来说 Assembler 与 DTO 总是一同出现。
    • Dto:它是数据传输的载体,内部不存在任何业务逻辑,我们可以通过 DTO 把内部的领域对象与外界隔离。
    • Facade:提供较粗粒度的调用接口,将用户请求委派给一个或多个应用服务进行处理。

    3.应用层目录结构、职能和代码形态

    主要存放应用层服务组合和编排相关的代码。应用服务向下基于微服务内的领域服务或外部微服务的应用服务完成服务的编排和组合向上为用户接口层提供各种应用数据展现支持服务应用服务和事件等代码会放在这一层目录里

    具体如下:

    • Event(事件):这层目录主要存放事件相关的代码。它包括两个子目录:publish 和 subscribe。前者主要存放事件发布相关代码,后者主要存放事件订阅相关代码(事件处理相关的核心业务逻辑在领域层实现)。为了实现事件的统一管理,建议你将微服务内所有事件的发布和订阅的处理都统一放到应用层,事件相关的核心业务逻辑实现放在领域层。通过应用层调用领域层服务,来实现完整的事件发布和订阅处理流程。
    • Service(应用服务):这层的服务是应用服务。应用服务会对多个领域服务或外部应用服务进行封装、编排和组合,对外提供粗粒度的服务。应用服务主要实现服务组合和编排,是一段独立的业务逻辑。你可以将所有应用服务放在一个应用服务类里,也可以把一个应用服务设计为一个应用服务类,以防应用服务类代码量过大。

    4.领域层目录结构、职能和代码形态

    主要存放领域层核心业务逻辑相关的代码。领域层可以包含多个聚合代码包,它们共同实现领域模型的核心业务逻辑。聚合以及聚合内的实体、方法、领域服务和事件等代码会放在这一层目录里。

    具体如下:

    • Aggregate(聚合):它是聚合软件包的根目录,可以根据实际项目的聚合名称命名,比如权限聚合。在聚合内定义聚合根、实体和值对象以及领域服务之间的关系和边界。聚合内实现高内聚的业务逻辑,它的代码可以独立拆分为微服务。以聚合为单位的代码放在一个包里的主要目的是为了业务内聚,而更大的目的是为了以后微服务之间聚合的重组。聚合之间清晰的代码边界,可以让你轻松地实现以聚合为单位的微服务重组,在微服务架构演进中有着很重要的作用。
    • Entity(实体):它存放聚合根、实体、值对象以及工厂模式(Factory)相关代码。实体类采用充血模型,同一实体相关的业务逻辑都在实体类代码中实现。跨实体的业务逻辑代码在领域服务中实现
    • Event(事件):它存放事件实体以及与事件活动相关的业务逻辑代码
    • Service(领域服务):它存放领域服务代码一个领域服务是多个实体组合出来的一段业务逻辑。你可以将聚合内所有领域服务都放在一个领域服务类中,你也可以把每一个领域服务设计为一个类。如果领域服务内的业务逻辑相对复杂,建议将一个领域服务设计为一个领域服务类,避免由于所有领域服务代码都放在一个领域服务类中,而出现代码臃肿的问题。领域服务封装多个实体或方法后向上层提供应用服务调用
    • Repository(仓储):它存放所在聚合的查询或持久化领域对象的代码,通常包括仓储接口和仓储实现方法。为了方便聚合的拆分和组合,我们设定了一个原则:一个聚合对应一个仓储。(特别说明:按照 DDD 分层架构,仓储实现本应该属于基础层代码,但为了在微服务架构演进时,保证代码拆分和重组的便利性,把聚合仓储实现的代码放到了聚合包内。)

    5.基础层层目录结构、职能和代码形态

    主要存放基础资源服务相关的代码,为其它各层提供的通用技术能力、三方软件包、数据库服务、配置和基础资源服务的代码都会放在这一层目录里。

    具体如下:

    • Config:主要存放配置相关代码。
    • Util:主要存放平台、开发框架、消息、数据库、缓存、文件、总线、网关、第三方类库、通用算法等基础代码,你可以为不同的资源类别建立不同的子目录。

    (二)应用层的领域对象分析

    应用层的主要领域对象是应用服务和事件的发布以及订阅。

    在事件风暴或领域故事分析时,我们往往会根据用户或系统发起的命令,来设计服务或实体方法。为了响应这个命令,我们需要分析和记录:

    • 在应用层和领域层分别会发生哪些业务行为;
    • 各层分别需要设计哪些服务或者方法;
    • 这些方法和服务的分层以及领域类型(比如实体方法、领域服务和应用服务等),它们之间的调用和组合的依赖关系。

    在严格分层架构模式下,不允许服务的跨层调用,每个服务只能调用它的下一层服务。服务从下到上依次为:实体方法、领域服务和应用服务。建议采用服务逐层封装的方式,服务的封装和调用主要有以下几种方式:

    1.实体方法的封装

    实体方法是最底层的原子业务逻辑。

    • 如果单一实体的方法需要被跨层调用,你可以将它封装成领域服务,这样封装的领域服务就可以被应用服务调用和编排了。
    • 如果它还需要被用户接口层调用,需要将这个领域服务封装成应用服务

    经过逐层服务封装,实体方法就可以暴露给上面不同的层,实现跨层调用。

    封装时服务前面的名字可以保持一致,你可以用 *DomainService 或 *AppService 后缀来区分领域服务或应用服务

    2.领域服务的组合和封装

    领域服务会对多个实体和实体方法进行组合和编排,供应用服务调用。

    如果它需要暴露给用户接口层,领域服务就需要封装成应用服务

    3.应用服务的组合和编排

    应用服务会对多个领域服务进行组合和编排,暴露给用户接口层,供前端应用调用。

    多个应用服务可能会对多个同样的领域服务重复进行同样业务逻辑的组合和编排。当出现这种情况时,就需要分析是不是领域服务可以整合了。可以将这几个不断重复组合的领域服务,合并到一个领域服务中实现,这样领域模型将会越来越精炼,更能适应业务的要求。

    应用服务类放在应用层 Service 目录结构下。领域事件的发布和订阅类放在应用层 Event 目录结构下。

    (三)领域层的领域对象分析

    事件风暴结束时,领域模型聚合内一般会有:聚合、实体、命令和领域事件等领域对象

    在完成故事分析和微服务设计后,微服务的聚合内一般会有:聚合、聚合根、实体、值对象、领域事件、领域服务和仓储等领域对象。

    1.设计实体

    大多数情况下,领域模型的业务实体与微服务的数据库实体是一一对应的。

    但某些领域模型的实体在微服务设计时,可能会被设计为多个数据实体,或者实体的某些属性被设计为值对象。

    在分层架构里,实体采用充血模型,在实体类内实现实体的全部业务逻辑。这些不同的实体都有自己的方法和业务行为,比如地址实体有新增和修改地址的方法,银行账号实体有新增和修改银行账号的方法。

    实体类放在领域层的 Entity 目录结构下。

    2.找出聚合根

    聚合根来源于领域模型,聚合根是一种特殊的实体,它有自己的属性和方法聚合根可以实现聚合之间的对象引用,还可以引用聚合内的所有实体。

    • 在个人客户聚合里,个人客户这个实体是聚合根,它负责管理地址、电话以及银行账号的生命周期。
    • 个人客户聚合根通过工厂和仓储模式,实现聚合内地址、银行账号等实体和值对象数据的初始化和持久化。

    聚合根类放在代码模型的 Entity 目录结构下。聚合根有自己的实现方法,比如生成客户编码,新增和修改客户信息等方法。

    3.设计值对象

    根据需要将某些实体的某些属性或属性集设计为值对象。值对象类放在代码模型的 Entity 目录结构下。

    在个人客户聚合中,客户拥有客户证件类型,它是以枚举值的形式存在,所以将它设计为值对象。

    有些领域对象可以设计为值对象,也可以设计为实体,我们需要根据具体情况来分析:

    • 如果这个领域对象在其它聚合内维护生命周期,且在它依附的实体对象中只允许整体替换,我们就可以将它设计为值对象。
    • 如果这个对象是多条且需要基于它做查询统计,建议将它设计为实体。

    4.设计领域事件

    如果领域模型中领域事件会触发下一步的业务操作,我们就需要设计领域事件

    • 首先确定领域事件发生在微服务内还是微服务之间。
    • 然后设计事件实体对象,事件的发布和订阅机制,以及事件的处理机制。
    • 判断是否需要引入事件总线或消息中间件

    领域事件实体和处理类放在领域层的 Event 目录结构下。领域事件的发布和订阅类建议放在应用层的 Event 目录结构下。

    5.设计领域服务

    如果一个业务动作或行为跨多个实体,我们就需要设计领域服务。

    领域服务通过对多个实体和实体方法进行组合,完成核心业务逻辑。可以认为领域服务是位于实体方法之上和应用服务之下的一层业务逻辑。

    按照严格分层架构层的依赖关系

    • 如果实体的方法需要暴露给应用层,它需要封装成领域服务后才可以被应用服务调用。
    • 如果有的实体方法需要被前端应用调用,我们会将它封装成领域服务,然后再封装为应用服务。

    领域服务类放在领域层的 Service 目录结构下。

    6.设计仓储

    每一个聚合都有一个仓储,仓储主要用来完成数据查询和持久化操作。

    仓储包括仓储的接口和仓储实现,通过依赖倒置实现应用业务逻辑与数据库资源逻辑的解耦。

    仓储代码放在领域层的 Repository 目录结构下。

    (四)代码模型强调内容

    第一点:聚合之间的代码边界一定要清晰

    聚合之间的服务调用和数据关联应该是尽可能的松耦合和低关联,聚合之间的服务调用应该通过上层的应用层组合实现调用,原则上不允许聚合之间直接调用领域服务。

    这种松耦合的代码关联,在以后业务发展和需求变更时,可以很方便地实现业务功能和聚合代码的重组,在微服务架构演进中将会起到非常重要的作用。

    第二点:你一定要有代码分层的概念

    写代码时一定要搞清楚代码的职责,将它放在职责对应的代码目录内。

    应用层代码主要完成服务组合和编排,以及聚合之间的协作,它是很薄的一层,不应该有核心领域逻辑代码。

    领域层是业务的核心,领域模型的核心逻辑代码一定要在领域层实现。

    如果将核心领域逻辑代码放到应用层,你的基于 DDD 分层架构模型的微服务慢慢就会演变成传统的三层架构模型了。

    三、正确理解微服务的边界

    微服务设计的重点,就是看微服务设计是否能够支持架构长期、轻松的演进。

    在事件风暴中,我们会梳理出业务过程中的用户操作、事件以及外部依赖关系等,根据这些要素梳理出实体等领域对象。

    • 根据实体对象之间的业务关联性,将业务紧密相关的多个实体进行组合形成聚合,聚合之间是第一层边界。
    • 根据业务及语义边界等因素将一个或者多个聚合划定在一个限界上下文内,形成领域模型,限界上下文之间的边界是第二层边界。

    为了方便理解,我们将这些边界细分为:逻辑边界、物理边界和代码边界。

    (一)逻辑边界

    逻辑边界主要定义同一业务领域或应用内紧密关联的对象所组成的不同聚类的组合之间的边界

    微服务内聚合之间的边界就是逻辑边界。一般来说微服务会有一个以上的聚合,在开发过程中不同聚合的代码隔离在不同的聚合代码目录中。它是一个虚拟的边界,强调业务的内聚,可根据需要变成物理边界,也就是说聚合也可以独立为微服务。

    微服务的架构演进并不是随心所欲的,需要遵循一定的规则,这个规则就是逻辑边界。微服务架构演进时,在业务端以聚合为单位进行业务能力的重组,在微服务端以聚合的代码目录为单位进行微服务代码的重组。

    来看一个微服务实例,在下面这张图中,我们可以看到微服务里包含了两个聚合的业务逻辑,两个聚合分别内聚了各自不同的业务能力,聚合内的代码分别归到了不同的聚合目录下。

    那随着业务的快速发展,如果某一个微服务遇到了高性能挑战,需要将部分业务能力独立出去,我们就可以以聚合为单位,将聚合代码拆分独立为一个新的微服务,这样就可以很容易地实现微服务的拆分。

    另外,我们也可以对多个微服务内有相似功能的聚合进行功能和代码重组,组合为新的聚合和微服务,独立为通用微服务,有点做中台的感觉!

    (二)物理边界

    微服务之间的边界是物理边界。它强调微服务部署和运行的隔离,关注微服务的服务调用、容错和运行等。

    物理边界主要从部署和运行的视角来定义微服务之间的边界。不同微服务部署位置和运行环境是相互物理隔离的,分别运行在不同的进程中。这种边界就是微服务之间的物理边界。

    举例:

    有些项目团队在将集中式单体应用拆分为微服务时,首先进行的往往不是建立领域模型,而只是按照业务功能将原来单体应用的一个软件包拆分成多个所谓的“微服务”软件包,而这些“微服务”内的代码仍然是集中式三层架构的模式,“微服务”内的代码高度耦合,逻辑边界不清晰,这里我们暂且称它为“小单体微服务”

    而随着新需求的提出和业务的发展,这些小单体微服务会慢慢膨胀起来。当有一天你发现这些膨胀了的微服务,有一部分业务功能需要拆分出去,或者部分功能需要与其它微服务进行重组时,你会发现原来这些看似清晰的微服务,不知不觉已经摇身一变,变成了臃肿油腻的大单体了,而这个大单体内的代码依然是高度耦合且边界不清的。

    这种单体式微服务只定义了一个维度的边界,也就是微服务之间的物理边界,本质上还是单体架构模式。微服务设计时要考虑的不仅仅只有这一个边界,别忘了还要定义好微服务内的逻辑边界和代码边界,这样才能得到你想要的结果。

    (三)代码边界

    不同层或者聚合之间代码目录的边界是代码边界。它强调的是代码之间的隔离,方便架构演进时代码的重组。

    代码边界主要用于微服务内的不同职能代码之间的隔离

    微服务开发过程中会根据代码模型建立相应的代码目录,实现不同功能代码的隔离。由于领域模型与代码模型的映射关系,代码边界直接体现出业务边界。

    代码边界可以控制代码重组的影响范围,避免业务和服务之间的相互影响。

    微服务如果需要进行功能重组,只需要以聚合代码为单位进行重组就可以了。

    四、正确认识服务和数据在微服务各层的协作

    (一)正确认识服务的协作

    1. 服务的类型

    按照分层架构设计出来的微服务,其内部有 Facade 服务、应用服务、领域服务和基础服务。之前都有提到,这里可以回忆一下!

    2. 服务的调用(三类主要场景)

    微服务的服务调用包括三类主要场景:微服务内跨层服务调用,微服务之间服务调用和领域事件驱动。

    • 微服务内跨层服务调用

    前端应用调用发布在 API 网关上的 Facade 服务,Facade 定向到应用服务应用服务作为服务组织和编排者,它的服务调用有这样两种路径:

    • 第一种是应用服务调用并组装领域服务。此时领域服务会组装实体和实体方法,实现核心领域逻辑。领域服务通过仓储服务获取持久化数据对象,完成实体数据初始化。
    • 第二种是应用服务直接调用仓储服务。这种方式主要针对像缓存、文件等类型的基础层数据访问。这类数据主要是查询操作,没有太多的领域逻辑,不经过领域层,不涉及数据库持久化对象。

     

    • 微服务之间的服务调用

    微服务之间的应用服务可以直接访问,也可以通过 API 网关访问

    由于跨微服务操作,在进行数据新增和修改操作时,你需关注分布式事务,保证数据的一致性。

    • 领域事件驱动

    领域事件驱动包括微服务内和微服务之间的事件。

    • 微服务内通过事件总线(EventBus)完成聚合之间的异步处理。
    • 微服务之间通过消息中间件完成。异步化的领域事件驱动机制是一种间接的服务访问方式。

    当应用服务业务逻辑处理完成后,如果发生领域事件,可调用事件发布服务,完成事件发布。

    当接收到订阅的主题数据时,事件订阅服务会调用事件处理领域服务,完成进一步的业务操作。

    3. 服务的封装与组合

    微服务的服务是从领域层逐级向上封装、组合和暴露的。基本如下图体现:

    (二)正确认识服务数据的协作

    在 DDD 中有很多的数据对象,这些对象分布在不同的层里。它们在不同的阶段有不同的形态:

    • 数据持久化对象 PO(Persistent Object),与数据库结构一一映射,是数据持久化过程中的数据载体。
    • 领域对象 DO(Domain Object),微服务运行时的实体,是核心业务的载体。
    • 数据传输对象 DTO(Data Transfer Object),用于前端与应用层或者微服务之间的数据组装和传输,是应用之间数据传输的载体。
    • 视图对象 VO(View Object),用于封装展示层指定页面或组件的数据。

    微服务各层数据对象的职责和转换过程如下:

    1.基础层数据协作

    基础层的主要对象是 PO 对象。

    我们需要先建立 DO 和 PO 的映射关系

    • 当 DO 数据需要持久化时,仓储服务会将 DO 转换为 PO 对象,完成数据库持久化操作。
    • 当 DO 数据需要初始化时,仓储服务从数据库获取数据形成 PO 对象,并将 PO 转换为 DO,完成数据初始化。

    大多数情况下 PO 和 DO 是一一对应的。但也有 DO 和 PO 多对多的情况,在 DO 和 PO 数据转换时,需要进行数据重组。

    2.领域层数据协作

    领域层的主要对象是 DO 对象。

    DO 是实体和值对象的数据和业务行为载体,承载着基础的核心业务逻辑

    通过 DO 和 PO 转换,我们可以完成数据持久化和初始化。

    3.应用层数据协作

    应用层的主要对象是 DO 对象。

    如果需要调用其它微服务的应用服务,DO 会转换为 DTO,完成跨微服务的数据组装和传输。

    用户接口层先完成 DTO 到 DO 的转换,然后应用服务接收 DO 进行业务处理。如果 DTO 与 DO 是一对多的关系,这时就需要进行 DO 数据重组

    4.用户接口层数据协作

    用户接口层会完成 DO 和 DTO 的互转,完成微服务与前端应用数据交互及转换。

    Facade 服务会对多个 DO 对象进行组装,转换为 DTO 对象,向前端应用完成数据转换和传输。

    5.前端应用数据协作

    前端应用主要是 VO 对象

    展现层使用 VO 进行界面展示,通过用户接口层与应用层采用 DTO 对象进行数据交互。

     

    参考书籍、文献和资料

    1.极客时间课程《DDD实战》,欧创新,2019.

    2.郑天民. 微服务设计原理与架构. 北京:人民邮电出版社,2018.

    3.陈超、秦金卫、张逸等. 高可用可伸缩微服务架构. 电子工业出版社. 2019.

    4.Eric Evans. 领域驱动设计-软件核心复杂性应对之道。 人民邮电出版社. 2018.

    展开全文
  • 树莓派使用指令驱动TSC打印机

    千次阅读 2018-11-21 13:43:38
    写下这篇博客的原因:公司要求用树莓派驱动TSC打印机,在完成这个任务的过程中主要遇到了以下几个问题: ...基于以上两个原因,我最后只好选择使用TSC打印机的指令集来驱动TSC打印机。 TSC打印机官网地址:TS...

    写下这篇博客的原因:公司要求用树莓派驱动TSC打印机,在完成这个任务的过程中主要遇到了以下几个问题:

    • 官网提供TSC打印机的linux驱动只适用于x86_64,x86架构,树莓派是armV7架构
    • 官网提供的驱动TSC打印机的库都是.dll动态库,无法再linux系统下调用,且无法反编译

    基于以上两个原因,我最后只好选择使用TSC打印机的指令集来驱动TSC打印机。

    1. TSC打印机官网地址:TSC打印机

    2. 使用TSC打印指令集驱动TSC打印机原理:
      在linux系统下,打印机使用USB接入后,会在/dev/usb/目录下,生成一个lp0文件,这个lp0文件就是TSC打印机的设备文件,要驱动TSC打印机就得向这个文件中写入TSC打印机指令集来打印指定打印内容。

    3. TSC打印编程之前的测试:
      既然知道了可以用指令集写入TSC打印机设备文件的方式,那么就得先熟悉TSC打印机指令,这里推荐使用官网的提供的DiagTool_V163工具进行测试,这个工具是windows系统下安装的,只是用来测试,需要安装官网提供的windows驱动:
      在这里插入图片描述
      通过这个工具,可以直接使用发送指令集(点击图中的通信工具)的方式与TSC打印机进行通信。
      这里我有一个简单的使用这个工具,通过发送指令集来驱动TSC打印机的例子,供参考:
      在这里插入图片描述

    点击传送数据,即可驱动TSC打印机打印相关内容。

    1. 中文字符的打印实现:
      通过阅读TSC打印指令集文档后,我知道公司购买的打印机内的FLASH内存(2560KB)太小,无法存储中文字体(一般3000KB以上),因此虽然指令集文档中说明了有简体中文字体的支持,我也没办法使用。
      因此,为了解决这个中文字符打印的问题,仍然需要使用DiagTool_V163工具,通过这个工具,可以制作一个点阵型的字体,然后写入打印机中的FLASH即可使用中文字体,下面是我自己制作的一个微软雅黑字体:
      在这里插入图片描述
      选择好要制作的字体之后,先点击“储存字形文件”来查看字体文件的大小(不能超过剩余的FLASH空间的大小),我的这个字体是2230KB,然后点击“传送字形文件”将字体写入打印机中,接下来就能够使用这个字体了:
      TEXT 100, 60, "字体名称“,0,1,1,2,”TSC打印机“
      PS:查看打印机FLASH剩余内存大小,可以点击“档案管理”,选择读取FLASH内存大小即可:
      在这里插入图片描述
    2. Golang编程实现:
      打印机编程部分,我选择了自己熟悉的Go语言来进行编程,代码如下:
    package tsc
    
    import (
    	"bufio"
    	"bytes"
    	"fmt"
    	"golang.org/x/text/encoding/simplifiedchinese"
    	"os"
    	"printer"
    	"strconv"
    )
    
    // TSC打印机设备文件路径
    const DEV_FILE = "/dev/usb/lp0"
    
    //const DEV_FILE = "/home/toothless/golang/src/tsc/logic.txt"
    
    // 全局文件描述符
    var gfd *os.File
    
    // 向打印机发送TSC指令
    func TSCSendCommand(comm string) {
    
    	var buf bytes.Buffer
    
    	// 1. 构建写入器
    	writer := bufio.NewWriter(gfd)
    
    	// 2. 构建字符串
    	buf.WriteString(comm)
    	buf.WriteString("\r\n")
    
    	// 3. 输出最后的命令字符串
    	str := buf.String()
    
    	command, err := simplifiedchinese.GBK.NewEncoder().String(str)
    	if err != nil {
    		fmt.Println(err)
    	}
    
    	//codefmt := mahonia.NewDecoder("gbk2312")
    
    	//command := codefmt.ConvertString(str)
    
    	// 4. 写入命令
    	if _, err := writer.WriteString(command); nil != err {
    		fmt.Println("[WRITE ERROR]:", err)
    		return
    	}
    
    	writer.Flush()
    
    }
    
    // 构建打印内容git clone --depth 1 https://github.com/golang/text.git
    func TSCText(x, y, font, content string) string {
    
    	var comm string = ""
    
    	switch font {
    	case "MicroFont":
    		comm = "TEXT " + x + "," + y + "," + FormatString(font) + "," + "0,2,2,1" + "," + FormatString(content)
    	default:
    		comm = "TEXT " + x + "," + y + "," + FormatString(font) + "," + "0,1,1,1" + "," + FormatString(content)
    	}
    
    	return comm
    }
    
    // 构建条形码内容
    func TSCBarcode(x, y, codeType, content string) string {
    	// 1. 构建字符串
    	comm := "BARCODE " + x + "," + y + "," + FormatString(codeType) + "," + "200,2,0,5,2" + "," + FormatString(content)
    
    	return comm
    }
    
    // 执行打印
    func TSCPrint(print_num int) {
    
    	comm := "PRINT 1," + strconv.Itoa(print_num)
    
    	TSCSendCommand(comm)
    }
    
    // 生成"string"格式的字符串
    func FormatString(content string) string {
    	return "\"" + content + "\""
    }
    
    // 打印机初始化设置:设定纸张大小SIZE,间隙GAP等
    func TSCInit() {
    	// 打开打印机设备文件
    	if fd, err := os.OpenFile(DEV_FILE, os.O_RDWR|os.O_APPEND, 0666); nil != err {
    		panic(err)
    	} else {
    		gfd = fd
    	}
    
    	TSCSendCommand("SIZE 3.94,5.91")
    	TSCSendCommand("GAP 0.08, 0")
    	TSCSendCommand("SPEED 4")
    	TSCSendCommand("DIRECTION 1")
    	TSCSendCommand("CLS")
    }
    
    // 结束一次打印
    func TSCStop() {
    
    	TSCSendCommand("EOP")
    
    	gfd.Close()
    }
    
    测试代码如下:
    func TestTacPrinter(t *testing.T) {
    	TSCInit()
    
    	comm := TSCText("120", "220", "MicroFont", "一起学编程")
    	TSCSendCommand(comm)
    	
    	comm = TSCText("120", "340", "MicroFont", "好好学习,天天向上")
    	TSCSendCommand(comm)
    
    	comm = TSCBarcode("120", "800", "128", "58167667390")
    	TSCSendCommand(comm)
    
    	TSCPrint(2)
    	
    	TSCStop()
    }
    

    在实现打印机编程的过程中,会遇到/dev/usb/lp0 不可读写的情况,这个就直接使用:
    sudo chmod 666 /dev/usb/lp0 命令修改权限即可,但这种方式只能暂时修改权限,每次打印机重新连接就得重新执行这个命令,这里推荐这位博主的文章来进行永久权限修改:
    永久修改权限

    1. 树莓派驱动TSC打印机:
      Golang是支持跨平台编译的,因此只需要将go源码文件编译成arm平台可用的可执行文件,再放入树莓派中执行即可。具体编译命令如下:
      GOOS=linux GOARCH=amd64 go build tsc.go

    以上,就是树莓派使用指令集的方式驱动TSC打印机的全部内容,谢谢!

    /dev/ttyUSB0 permission denied解决办法:https://blog.csdn.net/zbrj12345/article/details/79752221

    展开全文
  • 驱动蓝屏代码及原因,解决方案

    千次阅读 2017-02-04 11:15:48
    1. 故障检查信息 *** STOP: 0x100000d1 (0x00000000, 0x00000002, 0x...错误第二部分是被括号括起来的四个数字集,表示随机的开发人员定义的参数(这个参数对于普通用户根本无法理解,只有驱动程序编写者或微软操
    1.   故障检查信息
    *** STOP:  0x100000d1 (0x00000000, 0x00000002, 0x00000000, 0x00000000)
    其中错误的第一一是停机码(Stop Code)也就是0x100000d1,用于识别已发生错误的类型。错误第二部分是被括号括起来的四个数字集,表示随机的开发人员定义的参数(这个参数对于普通用户根本无法理解,只有驱动程序编写者或微软操作系统的开发人员才懂)。第三部分是错误名。信息第一行通常用来识别产生错误的驱动程序或设备。这种信息多数很简洁。但停机码可以作为搜索项在微软知识库和其他技术资料中使用。
    2.推荐操作
    蓝屏第二部分是推荐用户进行的操作信息。有时,推荐的操作仅仅是一般性建议(比如:到销售商网站查找BIOS的更新等);有时,也就是显示一条与当前问题相关的提示。一般来说,惟一的建议就是重启电脑。
    3.高度端口信息
    告诉用户内存置信映像是否写到磁盘上了,使用内存转储映像可以确定发生问题的性质,还会告诉用户调试信息是否被传到另一台电脑上,以及使用什么端口完成这次通讯。不过,这里的信息对于普通用户来说,没什么意义。
    出现蓝屏后的九个常规解决方案
    WIN XP 蓝屏信息非常多,产生的原因往往集中在不兼容的硬件和驱动程序。有问题的软件、病毒等。因此首先为大家提供一些常规的解决方案,在遇到蓝屏错误后,应先对照这些方案进行排除。
    1.重启
    有时只是某个程序或驱动程序一时犯错,重启后它们会改过自新。
    2.新硬件
    首先,应该检查新硬件是否插牢,这个被许多人忽视的问题往往会引发许多莫明其妙的故障。如果确认没有问题,将其拔下,然后换个插槽试试,并安装最新的驱动程序。同时还应对照微软网站的硬件兼容列表检查一下硬件是否与操作系统兼容。如果你的硬件没有在表中,那么就得到硬件厂商网站进行查询,或拨打他们的咨询电话。
    Windows XP的硬件兼容列表:
    http://support.microsoft.com/default.aspx?scid=kb;zh-cn;314062
    3.新驱动和新服务
    如果刚安装完某个硬件的新驱动,或安装了某个软件,而它又系统服务中添加了相应项目(比如:杀毒软件、CUP降温软件、防火墙软件等),在重启或使用中出现了蓝屏故障,请到安全模式来卸载或禁用它们。
    4.检查病毒
    比如病毒有时会导致Windows蓝屏死机,因此查杀病毒必不可少。同时一些木马间谍软件也会引发蓝屏,所以最好再用相关工具进行扫描检查。
    5.检查BIOS和硬件兼容性
    对于新装的电脑经常出现蓝屏问题,应该检查并升级BIOS到最新版本,同时关闭其中的内在相关项,比如:缓存和映射。另外,还应该对照微软网站的硬件兼容列表检查自己的硬件。还有就是,如果主板BIOS无法支持大容量硬盘也会导致蓝屏,需要对其进行升级。
    小提示:
    BIOS的缓存和映射项
    Video BIOS Shadowing(视频BIOS映射)
    Shadowing address ranges(映射地址列)
    System BIOS Cacheable(系统BIOS缓冲)
    Video BIOS Cacheable(视频BIOS缓冲)
    Video RAM Cacheable(视频内在缓冲)
    6.检查系统日志
    在“开如--à运行”中输入“EventVwr.msc”,回车后打开“事件查看器”,注意检查其中的“系统日志”和“应用程序日志”中标明“错误”的项。
    7.查询停机码
    把蓝屏中密密麻麻的E文记下来,接着到其他电脑中上网,进入微软帮助与支持网站:http://support.microsoft.com .在左上角的“搜索(知识库)”中输入停机码,比如:0x100000d1,接着在下面首先选择“中文知识库”,如果搜索结果没有适合信息,可以选择“英文知识库”再搜索一遍。一般情况下,会在这里找到有用的解决案例。另外在百度,google 等搜索引擎中使用蓝屏的停机码或后面的说明文字做为关键字搜索,往往也会有意外的收获。
    8. 最后一次正确配置
    一般情况下,蓝屏都出现于更新了硬件驱动或新加硬件并安装其驱动后,这时windowsXP提供的“最后一次正确配置”就是解决蓝屏的快捷方式,重启系统,在出现启动菜单时按下F8键就会出现高级启动选项菜单,接着选择“最后一次正确配置”。
    9.   安装最新的系统补丁和service pack
    有些蓝屏故障是windows本身存在缺陷造成的,因此可通过安装最新的系统补丁和service pack来解决。
    小提示
    微软如何分析蓝屏故障
    微软在windows中设计了一个功能,就是在蓝屏出现后,KeBugCheck 能够生成一个侦错文件——Memory.dmp(一般位于系统目录中,比如:C:\WINNT),它记录了发生蓝屏时的详细情况,以便微软专家对错误进行分析.当然,一般用户即使打开它,也根本看不懂其中奥秘.微软建议在遇到蓝屏后,将Memory.dmp压缩并通过FTP、邮件或其他方式寄送给他们,但过程比较烦琐,目前还没有人证明这样能尽快得到来自微软的解决方案。
    如果你对Memory.dmp的内容感兴趣,可运行windows XP安装光盘support\Tools文件夹中的setup.exe来安装其支持工具,然后在C:\Program Files\Support Tools文件夹中找到Dumpchk.exe,它是一个命令行工具,可以打开Memory.dmp并显示其中内容.
    默认生成的Memory.dmp体积基本与你的系统内存相等,可以按下Win+Break组合键打开“系统属性”,进入“高级→启动和故障恢复”,在“写入调试信息”项选择是否生成Memory.dmp,“小内存转储”,“核心内存转储”或“完全内存转储”。建议选择“无”,因为Memory.dmp可能只对微软有用,并且我们一般也不会选择发送给微软。
    45个经典蓝屏案例——破解
    1.0x0000000A:IRQL_NOT_LESS_OR_EQUAL
    ²     错误分析:主要是由有问题的驱动程序,有缺陷或不兼容的硬件与软件造成的.从技术角度讲,表明在内核模式中存在以太高的进程内部请求级别(IRQL)访问其没有权限访问的内存地址.
    Ø       解决方案:请用前面介绍的解决方案中的2 .3 .5 .8 .9方案尝试排除.
    实例1:在安装windows 2000/XP时出现
    除检查硬件是否符合兼容性列表外,还应采取以下措施.
    (1) 在安装启动过程中,当“Setup is inspecting your computer’s hardware configuration”消息出现时按F5键,当得到提示时,指定正确的计算机类型和硬件抽象层(HAL)。一般用户(只安装了一个CPU),请指定 “Standard PC HAL”。
    (2) 关闭CMOS设置中所有缓存及映射(shadowing)设置项,即插即用选项以及病毒保护功能。
    (3) 断开那些对于电脑启动非必需的硬件,包括网卡,内置调制解调器,声卡,第二块硬盘。同时检查硬盘的跳线是否设置为主跳线,并检查光驱的跳线是否正确。
    (4) 如果是从windows2000升级到windows XP,还需要卸载所有杀毒软件和启动管理软件(比如:Norton GoBack等),并且去掉所有不必要的硬件,断开所有USB设备和打印机。
    实例2:在使用windows2000/XP时出现
    (1)         检查最新安装的软件和硬件驱动程序,卸载或禁用它们,推荐使用安全模式来完成这个任务,如果是驱动程序,则推荐使用windows XP的驱动程序返回功能来恢复原有的驱动程序。
    (2)         如果windows无法启动。首先尝试使用“最后一次正确配置”来解决问题,如果无效,则按照下面的方法来解决。
    ★   Windows XP:使用安装光盘进入故障恢复控制台,运行“%systemroot%\system32\restore\rstrui.exe”命令,然后按照提示进行系统还原操作即可.
    ★   Windows 2000:记下蓝屏信息中显示的文件名,找到一台和你的电脑软,硬件配置类似的电脑,打开“注册表编辑器”找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services],这里保存了系统中每一个设备.服务的注册信息,请细细查看每条信息,特别是右侧窗格中的“DiskPlayName”,一些驱动程序会在这里标明设备驱动用途的描述,另外,在 “ImagePath”键值后面有相应文件名,这也是关注的要点,需要对照你抄下来的文件名。
    用windows 2000安装光盘进入“故障恢复控制台”,接着进入C:\WINNT\System32目录,输入“listsvc”,回车后会列出当前系统所安装的服务或设备,找到并记下与新装硬件或软件相关的服务或设备名,然后输入“disable服务或设备名”,回车即可将其停止。

    2.0x00000012:TRAP_CAUSE_UNKNOWN
    ²     错误分析:如果遇到这个错误信息,那么很不幸,因为KeBugCheck分析的结果是错误原因未知。
    Ø       解决方案:既然微软都帮不上忙,那就得靠自己了,请仔细回想这个错误是什么时候出现的;第一次发生时你对系统做了哪些操作;发生时正在进行什么操作。从这些信息中找出可能的原因,从而选择相应解决方案尝试排除。
       实例3:创新声卡驱动引发蓝屏
       当启动windows 2000时出现蓝屏信息,其中信息为“STOP 0x00000012( 0x00000000,0x00000000,0x00000000,0x00000000,) TRAP_CAUSE_UNKNOWN”。
         这个问题的原因是由于安装了创新Sound Blaster Live声卡,并且使用了Sound Blaster Live软件,解决方法是,在“控制面板→添加/删除程序”中卸载Sound Blaster Live软件,接着到 http://www.mydrivers.com/cgi-bin/sound/271,1.htm   下载并安装最新版本的驱动程序。
    3.0x0000001A:MEMORY_MANAGEMENT
    ²     错误分析:这个内存管理错误往往是由硬件引起的,比如:新安装的硬件,内存本身有问题等.
    Ø       解决方案:如果是在安装windows时出现,有可能是由于你的电脑达不到所安装windows的最小内存和磁盘要求.
    4. 0x0000001E:KMODE_EXCEPTION_NOT_HANDLED
    ²     错误分析:Windows内核检查到一个非法或未知的进程指令,这个停机码一般是由有问题的内存或是与前面0x0000001A相似原因造成的.
    Ø       解决方案:
    (1)硬件兼容性有问题:请对照前面提到的最新硬件兼容性列表,查看所有硬件是否包含在该列表中.
    (2)有问题的设备驱动,系统服务或内存冲突和中断冲突: 如果在蓝屏信息中出现了驱动程序名称,请试着在安全模式或故障恢复控制台中禁用或删除该驱动,并禁用所有刚安装的驱动或软件.如果错误出现在系统启动过程中,请进入安全模式,将蓝屏信息中所标明的文件重命名或删除.
    (3)如果错误信息中明确指出Win32k.sys:很可能是第三方远程控制软件造成的,需要从故障恢复控制台中将该软件的服务关闭.
    (4)在安装windows后第一次重启时出现:最大嫌疑可能是系统分区的磁盘空间不足或BIOL兼容性有问题.
    (5)如果是在关闭某个软件时出现,很可能是软件本身存在设计缺陷,请升级或卸载它.
    实例4:显示0x0000001E停机码,并且带有Aspi32.sys信息
    Windows XP本身不包括ASPI支持,而电脑中安装了较旧版的APSI(高级SCSI编程接口,许多与光驱相关的软件会需要它,比如:Nero等).请到http://mydrivers.com/dir83/d33572.htm 下载Adaptec ASPI最新驱动4.71.2版,解压后,运行其中的aspiinst.exe即可完成安装.
    5.0x00000023:FAT_FILE_SYSTEM
    0x00000024:NTFS_FILE_SYSTEM
    ²     错误分析: 0x00000023通常发生在读写使用FAT16或FAT32文件系统的系统分区时,而0x00000024则是由于NTFS.SYS文件出现错误(这个驱动文件的作用是允许系统读写使用NTFS文件系统的磁盘).这两个蓝屏错误很可能是磁盘本身存在物理损坏,或是中断要求封包(IRP)损坏而导致的. 其他原因还包括:硬盘磁盘碎片过多;文件读写操作过于频繁,并且数据量非常大或者是由于一些磁盘镜像软件或杀毒软件引起的.
    Ø       解决方案:
    第一步:首先打开命令行提示符,运行“ChkDsk /r”命令检查并修复硬盘错误,如果报告存在坏道(Bad track)。请使用硬盘厂商提供的检测工具进行检测和修复。
    第二步:接着禁用所有即时扫描文件的软件,比如杀毒软件,防火墙软件或备份工具。
    第三步:右击C:\WINNT\system32\drivers\fastfat.sys文件并选择“属性”,查看其版本是否与当前所使用的 Windows版本相符
    第四步:安装最新的主板驱动程序,特别IDE驱动。如果你的光驱,可移动存储器也提供有驱动程序,最好将它们升级到最新版。
    6.0x00000027:RDR_FILE_SYSTEM
    ²     错误分析:这个错误产生的原因很难判定,不过Windows内存管理出了问题很可能会导致这个停机码的出现.
    Ø       解决方案:如果是内存管理的缘故,通常增加内存会解决问题.
    7. 0x0000002E:DATA_BUS_ERROR
    ²     错误分析:系统内存存储器奇偶校验产生错误,通常是因为有缺陷的内存(包括物理内存,二级缓存或显卡显存),设备驱动程序访问不存在的内存地址等原因引起的.另外,硬盘被病毒或其他问题所损伤,也会出现这个停机码.
    Ø       解决方案
    (1)   检查病毒.
    (2)   使用“ChkDsk /r”命令检查所有磁盘分区。
    (3)   用Memtest86等内存测试软件测试内存。
    (4)   检查硬件是否正确安装,比如:是否插牢,金手指是否有污渍。
    8.0x00000035:NO_MORE_IRP_STACK_LOCATIONS
    ²     错误分析:从字面上理解,应该是驱动程序或某些软件出现堆栈问题.其实这个故障的真正原因应该是驱动程序本身存在问题.或是内存有质量问题.
    Ø       解决方案:请使用前面介绍的常规解决方案中与驱动程序和内存相关的方案进行排除.
    9.0x0000003F:NO_MORE_SYSTEM_PTES
    ²     错误分析:一个与系统内存管理相关的错误,比如:由于执行了大量的输入/输出操作,造成内存管理出现问题;有缺陷的驱动程序不正确地使用了内存资源;某个应用程序(比如:备份软件)被分配了大量的内核内存等.
    Ø       解决方案:卸载所有最近新安装的软件(特别是那些增强磁盘性能的应用程序和杀毒软件)和驱动程序.
    10. 0x00000044:MULTIPLE_IRP_COMPLETE_REQUESTS
    ²     错误分析:通常是由硬件驱动程序引起的.
    Ø       解决方案:卸载最近安装的驱动程序.这个故障很少出现,目前已经知道的是,在使用http://www.in-system.com/ 这家公司的某些软件时会出现,其中的罪魁就是Falstaff.sys文件.
       11. 0x00000050:PAGE_FAULT_IN_NONPAGED_AREA
    ²     错误分析:有问题的内存 (包括物理内存,二级缓存,显存),不兼容的软件(主要是远程控制和杀毒软件),损坏的NTFS卷以及有问题的硬件(比如:PCI插卡本身已损坏)等都会引发这个错误.
    Ø       解决方案:请使用前面介绍的常规解决方案中与内存,软件,硬盘,硬件等相关的方案进行排除.
       12. 0x00000051:REGISTRY_ERROR
    ²     错误分析:这个停机码说明注册表或系统配置管理器出现错误,由于硬盘本身有物理损伤或文件系统存在问题,从而造成在读取注册表文件时出现输入/输出错误.
    Ø       解决方案:使用“ChkDsk/r”检查并修复磁盘错误。
       13. 0x00000058:FTDISK_INTERNAL_ERROR
    ²     错误分析:说明在容错集的主驱动器发生错误.
    Ø       解决方案:首先尝试重启电脑看是否能解决问题,如果不行,则尝试“最后一次正确配置”进行解决。
    14.0x0000005A: CRITICAL_SERVICE_FAILED
    ²     错误分析:某个非常重要的系统服务启动失败造成的。
    Ø       解决方案:如果是在安装了某个新硬件后出现的,可以先移除该硬件。并通过网上列表检查它是否与Windows 2000/XP兼容,接着启动电脑,如果蓝屏还是出现,请使用“最后一次正确配置”来启动Windows,如果这样还是失败建议进行修复安装或是重装。
    15.0x0000006F:   SESSION3_INITIALIZATION_FAILED
    ²     错误分析:这个错误通常出现在Windows启动时,一般是由有问题的驱动程序或损坏的系统文件引起的。
    Ø       解决方案:建议使用Windows安装光盘对系统进行修复安装。
    16.0x00000076: PROCESS_HAS_LOCKED_PAGES
    ²     错误分析:通常是因为某个驱动程序在完成了一次输入/输出操作后,没有正确释放所占用的内存。
    Ø       解决方案:
    第一步:点击“开始--à运行”,输入“Regedt32”,找到[HKLM\SYSTEM \CurrentControlSet\Control\Session Manager\Memory Management],在右侧窗格新建名为“TrackLockedPages”的双字节值,将其值设置为了1。这样Windows便会在错误再次出现时跟踪到是哪个驱动程序的问题。
    第二步:如果再次出现蓝屏,那么错误信息会变成:
    STOP: 0x000000CB (0xY, 0xY, 0xY, 0xY) DRIVER_LEFT_LOCKED_PAGES_IN_PROCESS
    其中第四个“0xY”会显示为问题驱动程序的名称,接着对其进行更新或删除。
    第三步:进入注册表编辑器,删除刚才添加的“TrackLockedPages”值。
    17 0x00000077: KERNEL_STACK_INPAGE_ERROR
    ²     错误分析:说明需要使用的内核数据没有在虚拟内存或物理内存中找到。这个错误常常预示着硬盘有问题,相应数据损坏或受到病毒侵袭。
    Ø       解决方案:使用杀毒软件扫描系统,使用“ChkDsk / r”命令检查并修复磁盘错误,如不行则使用硬盘厂商提供的工具进行检测和修复。
    18.0x0000007A: KERNEL_DATA_INPAGE_ERROR
    ²     错误分析:这个错误往往是虚拟内存中的内核数据无法读入内存造成的。原因可能是虚拟内在页面文件中存在坏簇、病毒、磁盘控制器出错、内存有问题。
    Ø       解决方案:首先用升级为最新病毒库的杀毒软件查杀病毒,如果错误信息中还有0xC000009C或0xC000016A代码,那么表示是坏簇造成的,并且系统的磁盘检测工具无法自动修复,这时要进入“故障恢复控制台”,用“Chkdsk / r”命令进行手动修复。
    19. 0x0000007B: INACCESSIBLE_BO0T_DEVICE
    ²     错误分析:Windows在启动过程中无法访问系统分区或启动卷。一般发生在更换主板后第一次启动时,主要紧因为新主板和旧主板的IDE控制器使用了不同芯片组造成的。及时雨也可能是病毒或硬盘操作所引起的。
    Ø       解决方案:一般只要用安装光盘启动电脑,然后执行修复安装即可解决问题。对于病毒则可使用DOS版的杀毒软件进行查杀。如果是硬盘本身存在问题,请将其安装到其他电脑中,然后使用“ChkDsk / r”来检查并修复磁盘错误。
    20.0x0000007E: SYSTEM_THREAD_EXCEPTION_NOT_HANDLED
    ²     错误分析:系统进程产生错误,但Windows错误处理器无法捕获。其产生原因很多,包括:硬件兼容性,有问题的驱动程序或系统服务,或者是某些软件。
    Ø       解决方案:请使用“事件查看器”来获取更多的信息,从中发现错误根源。
    实例5:在升级到Windows XP后,出现这样的蓝屏信息
    第一步:检查磁盘空间,如果在Windows安装过程中第一次重启后或在安装完成后出现此问题,可能是没有足够可用的硬盘空间来运行Windows。
    第二步:BIOS不兼容.如果在Windows安装过程中第一次重启后或在安装完成后出现此问题,可能是BIOS与Windows不兼容,请升级到最新BIOS。
    第三步:存在不兼容的硬件驱动程序。如果STOP错误信息中列出了某驱动程序的名称,请禁用或删除该驱动程序。如果在启动过程中发生错误,则需要进入安全模式重命名或删除有问题的驱动程序。如果无法进入安全模式,则需要用安装光盘进入故障恢复控制台,然后对该文件进行重命名。
    小提示:
    “0x10000007E: SYSTEM_THREAD_EXCEPTION_NOT_HANDLED_M”的错误原因和解决方案基本相同。
    21.0x0000007F: UNEXPECTED_KERNEL_MODE_TRAP
    ²     错误分析:一般是由于有问题的硬件(比如:内存)或某些软件引起的。有时超频也会产生这个错误。
    Ø       解决方案:用检测软件(比如:Memtest86)检查内存,如果进行了超频,请取消超频。将PCI硬件插卡从主板手插槽拔下来,或更换插槽。另外,有些主板(比如:nForce2主板)在进行CPU超频后,南桥芯片过热也会导致蓝屏,此时为该芯片单独增加散热片往往可以有效解决问题。
    22.0x00000080: NMI_HARDWARE_FAILURE
    ²     错误分析:通常是由硬件引起的。
    Ø       解决方案:如果最近安装了新硬件,请将其移除,然后试试更换插槽和安装最新的驱动程序,如果升级了驱动程序,请恢复回原来的版本;检查内存金手指是否有污迹和损坏;扫描病毒;运行“ChkDsk / r”检查并修复磁盘错误:检查所有硬件插卡已经插牢。如果以上尝试都无效果,就得找专业的电脑维修公司请求帮助了。
    23.0x0000008E: KERNEL_MODE_EXCEPTION_NOT_HANDLED
    ²     错误分析:内核级应用程序产生了错误,但Windows错误处理器没有捕获。通常是硬件兼容性问题。
    Ø       解决方案:升级驱动程序或升级BIOS。
    小提示
    “0x1000008E: KERNEL_MODE_EXCEPTION_NOT_HANDLED_M”的错误原因和解决方案基本相同。
    24.0x0000009C: MACHINE_CHECK_EXCEPTION
    ²     错误分析:通常是由硬件引起的,一般是因为超频,或是硬件存在问题(内存、CPU、总线、电源)。
    Ø       解决方案:如果进行了超频,请降回CPU原来频率检查硬件。
    25.0x0000009F: DRIVER_POWER_STATE_FAILUER
    ²     错误分析:往往与电源有关系,常常发生在与电源相关的操作,比如:关机、待机或休眠。
    Ø       解决方案:重装系统,如果不能解决,请更换电源。
    26.0x000000A5: ACPI_BIOS_ERROR
    ²     错误分析:通常是因为主板BIOS不能全面支持ACPI规范。
    Ø       解决方案:如果没有相应BIOS升级,那么可在安装Windows 2000/XP时,当出现“Press F6 if you need to install a third-party SCSI or RAID driver”提示时,按下F7键,这样Windows便会自动禁止安装ACPI HAL,而安装Standard PC HAL。
    小知识
    什么是ACPI?
    它是Advanced Configuration and Power Interface的缩写,意为“高级配置与电源接口”。这是英特尔、微软和东芝共同开发的一种电源管理标准。它帮助操作系统控制、划拨给每一个与电脑相连的设备的电量。有了ACPI,操作系统就可以把不用的外设关闭。
    27.0x000000B4: VIDEO_DRIVER_INIT_FAILURE
    ²     错误分析:这个停止信息表示Windows因为不能启动显卡驱动,从而无法进入图形界面。通常是显卡的问题或者是存在与显卡的硬件冲突(比如:与并行或串行端口冲突)。
    Ø       解决方案:进入安全模式查看问题是否解决,如果可以,请升级最新的显卡驱动程序。如果还不行,则很可能是显卡与并行端口存在冲突,需要在安全模式下按下 Win+Break组合键打开“系统属性”窗口,在“硬件—>设备管理器”中找到并双击连接打印机的LPT1端口的项,在“资源”选项卡中取消 “使用自动配置”的勾选,然后将“输入/输出范围”的“03BC”改为“0378”。
    小提示
    有时,显卡还会和串行端口产生冲突,从而出现长时间使用后,键盘和鼠标完全失灵,屏幕出现蓝屏,经查发现,原来电脑上的串口鼠标与显卡有冲突,换成PS/2鼠标后故障解决。
    28.0x000000BE: ATTEMPTED_WRITE_TO_READONLY_MEMORY
    ²     错误分析:某个驱动程序试图向只读内存写入数据造成的。通常是在安装了新的驱动程序、系统服务或升级了设备的固件程序后。
    Ø       解决方案:如果在错误信息中包含有驱动程序或服务文件名称,请根据这个信息将新安装的驱动程序或软件卸载或禁用。
    29.0x000000C2: BAD_POOL_CALLER
    ²     错误分析:一个内核层的进程或驱动程序错误地试图进行内存操作。通常是驱动程序或存在BUG的软件造成的。
    Ø       解决方案:请参考前面介绍的常规解决方案相关项目进行排除。
    小提示
    驱动程序引发的蓝屏
    0x000000C4: DRIVER_VERIFIER_DETECTED_VIOLATION
    0x000000C5: DRIVER_CORRUPTED_EXPOOL
    0x000000C6: DRIVER_CAUGHT_MODIFYING_FREED_POOL
    0x000000C7: TIMER_OR_DPC_INVALID
    0x000000C9: DRIVER_VERIFIER_IOMANAGER_VIOLATION
    以上几个蓝屏信息基本都是由于硬件驱动程序有问题所造成的,需要升级驱动程序来解决故障。
    30.0x000000CE: DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS
    ²     错误分析:通常是由有问题的驱动程序或系统服务造成的。
    Ø       解决方案:请参考前面介绍的常规解决方案相关项目进行排除。
    实例6:点击“显示属性”的“设置”标签时出现此蓝屏信息
    同时还会显示“VGA.DLL”的文件信息,这个问题的产生原因是安装了PCAnywhere version 9.0 或10.0,请卸载并重装PCAnywhere,然后启动该软件,点击“ToolàApplication Options àHost Operation”,将“Host video mode” 修改为“Compatible”。
    实例7:启动时出现此蓝屏信息并显示SKNFW.SYS
    这是由于安装了天网防火墙软件,其相应服务无法正常运行,造成Windows蓝屏并不能启动。请进入安全模式,接着卸载该软件即可解决。
    31.0x000000D1: DRIVER_IRQL_NOT_LESS_OR_EQUAL
    ²     错误分析:通常是由有问题的驱动程序引起的(比如罗技鼠标的Logitech MouseWare 9.10和9.24版驱动程序会引发这个故障)。同时,有缺陷的内存、损坏的虚拟内存文件、某些软件(比如多媒体软件、杀毒软件、备份软件、DVD播放软件)等也会导致这个错误。
    Ø       解决方案:检查最近安装或升级的驱动程序(如果蓝屏中出现了“acpi.sys”等类似文件名,可以非常肯定是驱动程序问题)和软件;测试内在是否存在问题;进入“故障恢复控制台”,转到虚拟内存页面文件Pagefile.sys所在分区,执行“Del Pagefile.sys”命令,将页面文件删除;然后在页面文件所在分区执行“Chkdsk /r”命令;进入Windows后重新设置虚拟内存。
    如果在上网时遇到这个蓝屏,而你恰恰又正在进行大量的数据下载和上传(比如:网络游戏、BT下载),那么应该是网卡驱动的问题,需要升级其驱动程序。
    32.0x000000EA: THREAD_STUCK_IN_DEVICE_DRIVER
    ²     错误分析:通常是由显卡或显卡驱动程序引发的。
    Ø       解决方案:先升级最新的显卡驱动程序,如果不行,则需要更换显卡测试故障是否集资发生。
    33.0x000000ED: UNMOUNTABLE_BOOT_VOLUME
    ²     错误分析:一般是由于磁盘存在错误导致的,有时也建议检查硬盘连接红是否接触不良,或是没有使用合乎该硬盘传输规格的连接线,例如ATA-100硬盘仍使用ATA-33的连接线,对低速硬盘无所谓,但高速硬盘(支持ATA-66以上)的要求较严格,规格不对的连接线有时也会引起这类没办法开机的故障。如果在修复后,还是经常出现这个错误,很可能是硬盘损坏的前兆。
    Ø       解决方案:一般情况下,重启会解决问题,不管怎样都建议你执行“ChkDsk / r” 命令来检查和修复磁盘。
    34.0x000000F2: HARDWARE_INTERRUPT_STORM
    ²     错误分析:内核层检测到系统出现中断风暴,比如:某个设备在完成操作后没有释放其所战友用的中断。通常这是由有缺陷的驱动程序造成的。
    Ø       解决方案:升级或卸载最近安装的硬件驱动程序。
    35.0x00000135: UNABLE_TO_LOCATE_DLL
    ²     错误分析:通常表示某个文件丢失或已经损坏,或者是注册表出现错误。
    Ø       解决方案:如果是文件丢失或损坏,在通常会显示相应的文件名,你可以通过网络或是其他电脑找到相应的文件,并将其复制到系统文件夹下的SYSTEM32子文件夹中。如果没有显示文件名,那就很可能是注册表损坏,请选用系统还原或是以前的注册表备份进行恢复。
    36.0xC000021A:STATUS_SYSTEM_PROCESS_TERMINATED
    ²     错误分析:用户模式子系统,例如Winlogon或客户服务器运行时子系统(CSRSS)已被损坏。所以无法再保证安全性,导致系统无法启动有时,当系统管理员错误地修改了用户帐户权限,导致其无法访问系统文件和文件夹。
    Ø       解决方案:使用“最后一次正确配置”,如果无效,可使用安装光盘进行修复安装。
    实例8:GoBack引起0xC000021A
    当安装了GoBack软件后,在启动电脑时出现停机码为“0xC000021A”的蓝屏信息解决方法是,在启动并出现 GoBack画面时按下空格键进入其设置窗口,选择“Disable GoBack”选项,然后让电脑完成启动,接着进入“控制面板à添加/删除程序”,卸载GoBack。
    37. Stop OxC0000221 OR STATUS_IMAGE_CHECKSUM_MISMATCH
    ²     错误分析:通常是由于驱动程序或系统DLL文件损坏造成的,一般情况下,在蓝屏中会出现文件名称。
    Ø       解决方案:
    (1)     使用Windows安装光盘进行修复安装。
    (2)     如果还能进入安全模式,可在“开始à运行”中输入:
    sfc/scannow
    回车执行系统文件检查并恢复被修改或损坏的文件。
       (3)还可以采用提取文件的方法来解决,进入 “故障恢复控制台”,使用Copy或Expand命令从安装光盘中复制或解压缩受损的文件。不过,蓝屏一般都是驱动程序文件的问题,所以Expand命令会用的多一些,比如:蓝屏中提示tdi.sys文件,因为驱动文件一般在i386\driver 压缩包中,所以使用:expand G:\386\driver.cab \f:tdi.sys c:\WINNT   \system\driver.
    小提示:
    l       磁盘错误有可能是文件损坏的根源,请在“恢复控制台”中执行“Chkdsk /r”进行检查。
    l       新安装的内存如果有问题,很可能导致虚拟内存页面文件出错,请按照“0x000000D1: DRIVER_IRQL_NOT_LESS_OR_EQUAL”的解决方案解决。
    38.如果启动时出现这些蓝屏停机码
    如果在Windows启动时出现蓝屏,并出现附表一中的错误信息,那么多半是硬件出现了问题,请用硬件厂商提供的诊断工具来判断硬件是否存在问题,并到其网站查看是否有最新的BIOS或固件更新程序。如果硬件没有问题,重装Windows 2000/XP,若相同问题还是出现,就只能求助专业的技术支持了。
    如果遇到的是附表二中的错误信息,也只有重装Windows了,如果不能解决问题,建议求助专业的技术支持。
    附表一:
    停机码
    错误名
    0x31
    PHASEO_INITIALIZATION_FAILED
    0x5C
    HAL_INITIALIZATION_FAILED
    0x5D
    HEAP_INITIALIZATION_FAILED
    Ox5E
    OBJECT_INITIALIZATION_FAILED
    Ox5F
    SECURITY_INITIALIZATION_FAILED
    Ox60
    PROCESS_INITIALIZATION_FAILED
    附表二:
    停机码
    错误名
    0x32
    PHASE1_INITIALIZATION_FAILED
    0x61
    HAL1_INITIALIZATION_FAILED
    0x62
    OBJECT1_INITIALIZATION_FAILED
    0x63
    SECURITY1_INITIALIZATION_FAILED
    0x64
    SYMBOLIC_INITIALIZATION_FAILED
    0x65
    MEMORY1_INITIALIZATION_FAILED
    0x66
    CACHE_INITIALIZATION_FAILED
    0x67
    CONFIG_INITIALIZATION_FAILED
    0x68
    FILE_INITIALIZATION_FAILED
    0x69
    IO1_INITIALIZATION_FAILED
    0x6A
    LPC_INITIALIZATION_FAILED
    0x6B
    PROCESS1_INITIALIZATION_FAILED
    0x6C
    REFMON_INITIALIZATION_FAILED
    0x6D
    SESSION1_INITIALIZATION_FAILED
    0x6E
    SESSION2_INITIALIZATION_FAILED
    0x6F
    SESSION3_INITIALIZATION_FAILED
    0x70
    SESSION4_INITIALIZATION_FAILED
    0x71
    SESSION5_INITIALIZATION_FAILED
    展开全文
  • 什么驱动程序

    千次阅读 多人点赞 2018-11-05 20:19:50
    驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息。有了此信息,计算机就可以与设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。...

           驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息。有了此信息,计算机就可以与设备进行通信驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。操作系统不同,硬件的驱动程序也不同,各个硬件厂商为了保证硬件的兼容性及增强硬件的功能会不断地升级驱动程序。如:Nvidia 显卡芯片公司平均每个月会升级显卡驱动程序2-3次。驱动程序是硬件的一部分,当你安装新硬件时,驱动程序是一项不可或缺的重要元件。凡是安装一个原本不属于你电脑中的硬件设备时,系统就会要求你安装驱动程序,将新的硬件与电脑系统连接起来。驱动程序扮演沟通的角色,把硬件的功能告诉电脑系统,并且也将系统的指令传达给硬件,让它开始工作。

      当你在安装新硬件时总会被要求放入“这种硬件的驱动程序”,很多人这时就开始头痛。不是找不到驱动程序的盘片,就是找不到文件的位置,或是根本不知道什么是驱动程序。比如安装打印机这类的硬件外设,并不是把连接线接上就算完成,如果你这时候开始使用,系统会告诉你,找不到驱动程序。怎么办呢?参照说明书也未必就能顺利安装。其实在安装方面还是有一定的惯例与通则可寻的,这些都可以帮你做到无障碍安装。

      在Windows系统中,需要安装主板光驱、显卡、声卡等一套完整的驱动程序。如果你需要外接别的硬件设备,则还要安装相应的驱动程序,如:外接游戏硬件要安装手柄、方向盘、摇杆、跳舞毯等的驱动程序,外接打印机要安装打印机驱动程序,上网或接入局域网要安装网卡、Modem甚至ISDN、ADSL的驱动程序。说了这么多的驱动程序,你是否有一点头痛了。下面就介绍Windows系统中各种的不同硬件设备的驱动程序,希望能让你拨云见日。

      在Windows 9x下,驱动程序按照其提供的硬件支持可以分为:声卡驱动程序、显卡驱动程序、鼠标驱动程序、主板驱动程序、网络设备驱动程序、打印机驱动程序、扫描仪驱动程序等等。为什么没有CPU、内存驱动程序呢?因为CPU和内存无需驱动程序便可使用,不仅如此,绝大多数键盘、鼠标、硬盘、软驱、显示器和主板上的标准设备都可以用Windows自带的标准驱动程序来驱动,当然其它特定功能除外。如果你需要在Windows系统中的DOS模式下使用光驱,那么还需要在DOS模式下安装光驱驱动程序。多数显卡、声卡、网卡等内置扩展卡和打印机、扫描仪、外置Modem等外设都需要安装与设备型号相符的驱动程序,否则无法发挥其部分或全部功能。驱动程序一般可通过三种途径得到,一是购买的硬件附带有驱动程序;二是Windows系统自带有大量驱动程序;三是从Internet下载驱动程序。最后一种途径往往能够得到最新的驱动程序。

      供Windows 9x使用的驱动程序包通常由一些.vxd(或.386)、.drv、.sys、.dll或.exe等文件组成,在安装过程中,大部分文件都会被拷贝到“Windows/ System”目录下。

      Windows怎样知道安装的是什么设备,以及要拷贝哪些文件呢?答案在于.inf文件。.inf是从Windows 95时代开始引入的一种描述设备安装信息的文件,它用特定语法的文字来说明要安装的设备类型、生产厂商、型号、要拷贝的文件、拷贝到的目标路径,以及要添加到注册表中的信息。通过读取和解释这些文字,Windows便知道应该如何安装驱动程序。目前几乎所有硬件厂商提供的用于Windows 9x下的驱动程序都带有安装信息文件。事实上,.inf文件不仅可用于安装驱动程序,还能用来安装与硬件并没有什么关系的软件,例如Windows 98支持“Windows更新”功能,更新时下载的系统部件就是利用.inf文件来说明如何安装该部件的。

      在安装驱动程序时,Windows一般要把.inf文件拷贝一份到“Windows/Inf”或“Windows/Inf/Other”目录下,以备将来使用。Inf目录下除了有.inf文件外,还有两个特殊文件Drvdata.bin和Drvidx.bin,以及一些.pnf文件,它们都是Windows为了加快处理速度而自动生成的二进制文件。Drvdata.bin和Drvidx.bin记录了.inf文件描述的所有硬件设备,也许朋友们会有印象:当我们在安装某些设备时,经常会看到一个“创建驱动程序信息库”的窗口,此时Windows便正在生成这两个二进制文件。

      Windows 9x专门提供有“添加新硬件向导”(以下简称硬件向导)来帮助使用者安装硬件驱动程序,使用者的工作就是在必要时告诉硬件向导在哪儿可以找到与硬件型号相匹配的.inf文件,剩下的绝大部分安装工作都将由硬件安装向导自己完成。

      给硬件设备安装驱动程序对Windows 9x用户来说并不是一件陌生事,在安装或重装Windows时需要安装驱动程序,在购买了某些新硬件之后也需要安装驱动程序。如果驱动程序安装不正确,系统中某些硬件就可能无法正常使用。虽然Windows 9x支持即插即用,能够为用户减轻不少工作,但由于PC机的设备有非常多的品牌和型号,加上各种新产品不断问世,Windows不可能自动识别出所有设备,因此在安装很多设备时都需要人工干预。

    展开全文
  • 为什么指令重排序和屏障的作用

    千次阅读 2014-11-04 21:34:21
    内存屏障是一个很神奇的东西,之前翻译了linux内核文档...为什么会乱序 现在的CPU一般采用流水线来执行指令。一个指令的执行被分成:取指、译码、访存、执行、写回、等若干个阶段。然后,多条指令可以同时存在于流水
  • 作为一名入世未深的程序员,一直很好奇编写的一行行代码是如何实现对电脑硬件的驱动,明明一个感觉是虚拟的东西,而另一个是实实在在的存在,观念上感觉压根就不是一个时空的东西,他们却偏偏能产生关系,并且能如此...
  • linux内核中的copy_to_user和copy_from_user(一) Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blog.csdn.net/ce123) ...在学习Linux内核驱动的时候,经常会碰到copy_from_u
  • linux里的nvme驱动代码分析(加载初始化)

    万次阅读 多人点赞 2016-06-04 16:17:51
    基于qemu2.5 + linux4.5.3学习nvme驱动
  • DHT11模块简介 DHT11是一款价格便宜,易于使用的温度湿度测量二合一传感器。...本文将以DFRobot开源硬件平台的DHT11模块和DFRduino开发板来演示,讲解DHT11的驱动和使用。 DHT11电气参数 电源电压:3~5.5...
  • 我就在想指令到底是什么? 网络上说:“高级语言被翻译成汇编指令,汇编指令又被转换为可执行机器码。” 那么,汇编指令到底是什么? 汇编里的mov,add,sub,到底是什么? 书上说汇编指令就是机器码,那机器码又是...
  • linux 在线调试摄像头驱动

    千次阅读 2018-04-24 11:07:36
    图像处理和图像传输是在应用层完成,在应用层写代码和调试代码都是比较容易的。但是如果需要调试摄像头驱动的一些参数,涉及到驱动层的东西就会比较的麻烦。在我使用的这个平台,假如我要调试摄像头驱动gc0308的...
  • Linux设备驱动程序和设备文件

    千次阅读 2018-01-14 18:25:10
    驱动程序在设备可理解的硬件指令和内核使用的固定编程接口之间起转换作用。驱动程序层的存在有助于内核合理地保持设备独立性。 在大多数情况下,设备驱动程序是内核的组成部分,它们不是用户进程。不过,一个驱动...
  • 驱动是硬件和高层系统之间通讯的桥梁,驱动其实也是一种程序,它包含了系统对硬件正常 工作的各种指令,这些指令经过cpu处理后能得到硬件能够识别的数据代码,而这些代码就是硬件完成对应职能的钥匙,所以高层系统...
  • 1 什么是Linux驱动? 做过嵌入式的都知道裸机程序和带操作系统的程序,这里就不展开讲了,初学者最开始接触的都是裸机程序,main中while大循环跑天下。实际上,掌握了操作系统后,我们会发现基于操作系统的开发更...
  • 指令流水线

    千次阅读 2013-06-05 15:25:44
    最近在看反汇编与逆向的书,有关一些编译优化的知识得到了增长,查阅相关资料,...指令流水线(英语:Instruction pipeline)是为了让计算机和其它数字电子设备能够加速指令的通过速度(单位时间内被运行的指令数量)
  • Linux平台PCIe驱动编写

    千次阅读 2019-03-21 10:27:58
    以前文章分析了PCIe...从应用层编写驱动主要是使用pcilib库和/dev/mem接口,下面开始分析代码。根据pcie设备的厂家ID和设备ID初始化设备,并且返回访问设备指针描述符,pci_dev指针指向我们需要访问的设备。 ...
  • ARM指令集 和 条件执行 详解

    千次阅读 2014-04-07 10:57:19
    算术和逻辑指令 ADC : 带进位的加法 (Addition with Carry) ADC{条件}{S} , , dest = op_1 + op_2 + carry ADC 将把两个操作数加起来,并把结果放置到目的寄存器中。它使用一个进位标志位,这样就...
  • 浅谈 Vue 指令

    千次阅读 2018-11-07 15:41:26
    指令是告诉计算机从事某一特殊运算的代码。如:数据传送指令、算术运算指令、位运算指令、程序流程控制指令、串操作指令、处理器控制指令。 那么 Vue 指令又是什么呢?是用来干什么的?作为一名攻城狮的我们又如何去...
  • 一、为什么要阅读源代码?很多作家成名之前都阅读过大量的优秀文学作品,经过长期的阅读和写作积累,慢慢的才有可能写出一些好的、甚至是优秀的文学作品。 而程序员与此类似,很多程序员也需要阅读大量的优秀程序或...
  • ARM指令系统

    万次阅读 2017-08-19 22:22:24
    第3章 ARM指令系统 3.1 ARM处理器的指令格式 ...ARM内核属于RISC结构,所以其指令集有着一些独特的特点:指令长度固定,指令格式的种类少,寻址方式简单。由于ARM处理器采用固定长度的32位指令,因此处理器内部
  • 恶意代码分析实战

    千次阅读 2014-05-28 13:29:14
    恶意代码分析实战(最权威的恶意代码分析指南,理论实践分析并重,业内人手一册的宝典) 【美】Michael Sikorski(迈克尔.斯科尔斯基), Andrew Honig(安德鲁.哈尼克)著  诸葛建伟 姜辉 张光凯 译 ISBN 978-7-...
  • 鸿蒙驱动框架

    千次阅读 2020-12-21 08:18:45
    鸿蒙驱动是基于HDF(Harmony Driver Foundation)驱动框架,开发者提供了一系列统一接口供其调用,包括驱动加载、驱动服务管理和驱动消息机制。我们要做的,是学习如何使用这些接口,并基于这些接口的使用实现某些...
  • 这里做个摘抄和总结,和大家分享下,希望大家能够指令重排序有个形象的认识,不至于在并发编程中犯一些简单的错误。如果理解有错误,希望看到的大神指正。 从源码变成可以被机器(或虚拟机)识别的程序,至少要经过...
  • 这是作者网络安全自学教程...这篇文章将详细总结恶意代码检测技术,包括恶意代码检测的对象和策略、特征值检测技术、校验和检测技术、启发式扫描技术、虚拟机检测技术和主动防御技术。基础性文章,希望对您有所帮助~
  • Linux内核:驱动程序

    千次阅读 2016-06-05 06:43:01
    本文译自Linux.orgDevynCJohnson的系列文章... 在上一篇文章Linux内核:源代码中我们探讨了源代码的组成结构以及各个部分的功能,今天我们来介绍一下Linux的驱动驱动是使内核能够与硬件或协议进行通信或控制的程
  • GNU风格 ARM 汇编指令语法总结

    千次阅读 2016-08-24 15:28:08
    这些初始化工作完成后就可以跳转到C代码main函数中执行。 1、 GNU汇编语言语句格式  任何Linux汇编行都是如下结构:[:][instruction or directive or pseudo-instruction>} @comment l 
  • a. Linux 内核简介 b. Linux 内核 下载 配置 编译 c. 设备驱动模块介绍
  • 过滤驱动程序总结

    千次阅读 2016-04-13 18:52:16
    过滤驱动程序  过滤驱动程序可以修改已有驱动的功能,也可以对数据进行过滤加密。WDM驱动需要通过注册表记录 指定加裁的过滤驱动,OS会读取这些值完成加载,其可以是高层过滤,也可以是低层过滤。而NT...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,358
精华内容 32,143
关键字:

代码为什么能够驱动指令