自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(68)
  • 收藏
  • 关注

转载 内存屏障的作用:barrier()

在我看来,内存屏障主要解决了两个问题:单处理器下的乱序问题和多处理器下的内存同步问题。为什么会乱序?CPU的流水线机制:流水线是并行的。比如说CPU有一个加法器和一个除法器,那么一条加法指令和一条除法指令就可能同时处于“执行”阶段, 而两条加法指令在“执行”阶段就只能串行工作。相比于串行+阻塞的方式,流水线像这样并行的工作,效率是非常高的。然而,这样一来,乱序可能就产生

2013-07-07 13:18:50 3322 2

原创 从Xen源代码中的compiler.h看GNU C编译器的扩展

==

2013-07-07 00:56:00 905

转载 预处理指令之#pragma

#pragma的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。其格式一般为: #pragma Para。#pragma pack(8)先看看下面的微软面试题:#include #pragma pack(8)struct ex

2013-07-07 00:35:15 627

转载 预处理指令

我们可以在C源程序中插入传给编译程序的各种指令,这些指令被称为预处理器指令,它们扩充了程序设计的环境。现把常用的预处理命令总结如下: 1. 预处理程序按照ANSI标准的定义,预处理程序应该处理以下指令:#if #ifdef #ifndef #else #elif#endif#define#undef#line#error#pragma#include

2013-07-07 00:17:39 763

原创 CPL/DPL/RPL解惑

最近刚看到CPU的特权级别问题,发现关于关于权限级别有3个使用的地方,就是CPL,DPL和RPL。特权级是保护模式下非常重要的概念,所以有必要搞清楚。首先来看看他们的定义,根据Intel Developer‘s Menu整理:CPL:当前执行的程序或者任务的权限级别,保存在CS和SS segment registers的bit[1:0]中。DPL:一个segment或gate的

2013-07-04 22:04:22 1003

原创 hyper-v 虚拟机联网设置

1.Hyper-v管理器中的设置:  虚拟机交换机管理器...->新建一个虚拟机交换机管理器    1.连接到内部网络(外部只支持有线网卡,没有尝试;专用意思就是只在虚拟机之间建立连接)    2.为管理操作系统启用虚拟LAN标识打勾;id为2。  target虚拟机->设置 网络适配器 选择交换机  2.target虚拟机中的设置:  为了远程登陆虚拟机,如下设置

2013-06-19 12:53:55 5163

原创 windbg连接vmware或者hyper-v 的配置

1.正确配置虚拟机和target电脑  1.1.vmware虚拟机配置:    VM->Settings->Hardware      Add...->Serial Port->output to named pipe->          \\.\pipe\[pipename] 填写[pipepath]          This end is the server 选择

2013-06-19 12:50:19 1835

原创 表驱动法(决策表、查询表)介绍

概念:  一种编程模式,从表里面查找信息而不使用逻辑语句if,else。  优点是比复杂逻辑代码更简单、更容易修改、效率更高。  表查询方法:    1.直接访问 Direct access    2.索引访问 Indexed access    3.阶梯访问 Stair-step access方法介绍1.直接访问表  确定各月天数做法:daysPerM

2013-06-19 12:44:54 1306

原创 gcc和g++区别,使用g++编译多个文件

误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的

2013-05-09 21:30:53 664

原创 chapter 9.6:格式化I/O请求

在发送I/O请求前经常必须格式化请求,设置I/O栈位置及其他信息(如完成回调)情形:    1.接受从framework来的请求,并发送到I/O target,此时需要设置buffer offset或者更改数据长度或内容。    2.驱动把自己创建的I/O请求发送给I/O target    3.驱动为请求设置完成回调函数驱动必须格式化所有请求,除了一种情况:从framewor

2013-04-01 23:36:24 1371

原创 chapter 9.5: memory object和buffer allocation

创建mem obj和buffer的方法    1.一个函数同时分配buffer和memory obj    2.创建一个memory obj,然后把它和一个已存在的buffer关联创建请求时,驱动可以同时创建mem obj,也可以关联一个已存的mem objmem obj默认的父亲是创建它的驱动,若需要,则手动设置父亲为I/O request/device obj

2013-04-01 23:33:43 1186

原创 chapter 9.4: Driver创建I/O请求的Memory Object和buffer

三个对象的关系图:图9.2Memory objects的重要性:具有reference count    1.mem obj无法被释放,直到request不用了为止(保证pending时,memory没有free)    2.cleanup方法被简化,会延迟至请求完成再删除对象。buffer没有counter    buffer的生命周期如下:

2013-04-01 23:30:57 743

原创 chapter 9.3: 创建I/O request

种类:read, write, or device I/O control request创建request时,不包括memory object和其他任何信息KMDF驱动可以定义内部IOCTL,参数自定义,支持3种memory object和offset structuresKMDF例子:创建WDF I/O RequestWdfRequestCreate:创建WDF I/O

2013-04-01 23:29:21 824

原创 chapter 9.2: I/O Target创建及管理

driver可以直接调用framework方法访问默认I/O target:WdfDeviceGetIoTarget KMDF:Remote I/O target 创建驱动需要创建并打开I/O target。WdfIoTargetCreate:创建,并不关联特定I/O target(WDF_OBJECT_ATTRIBUTES)WdfIoTargetOpen:关联目标设备/设

2013-04-01 23:25:48 1633

原创 chapter 9.1: I/O targets

WDF对象,表示了目标设备:UMDF/KMDF driver, 和其他KM driver支持的操作:    1.格式化请求    2.target的PnP/Power state    3.请求及控制target和request完成:支持同步及非同步完成操作。默认I/O target默认是下一层的驱动。I/O target对象是设备对象的子对象。

2013-04-01 23:22:23 684

原创 chapter 8.10:self-managed I/O

不和queued I/O请求power management,或必须和设备站同步操作的请求:如Pcidrv例子的timer,或驱动在启动或关闭设备的特定时间点需要与驱动联系。例子:Timer

2013-04-01 23:18:43 873

原创 chapter 8.9:Adaptive Time-outs in UMDF

待整理。。

2013-04-01 23:17:43 598

原创 chapter 8.8: canceled and suspended requests

驱动可以在任何时间停止处理I/O请求:    1.发起request的线程或进程取消或离开    2.PnP和Power事件,例如睡眠    3.设备移除驱动在收到请求时对请求取消(STATUS_CANCELLED)或完成error。驱动应该为需要很长时间或不定时间的请求提供回调,比如非同步的input请求。Request cancellationWDF取消请求

2013-04-01 23:16:45 772

原创 chapter 8.7: 完成I/O请求

当驱动完成了I/O请求,设置status,传输的number of bytes,发起请求线程的priority boost下表是WDF驱动可以调用的完成方法(UMDF的接口为IWDFIoRequest)Action UMDF methodKMDF methodCompletes an I/O request wit

2013-04-01 23:15:14 887

原创 chapter 8.6: I/O事件回调函数

接收带I/O请求时framework可以做的事:    1.把request放入queue    2.调用callback而不是放入queue    3.代driver处理请求    4.转发到默认I/O target    5.标记请求为失败为了I/O的文件对象从应用程序角度,所有I/O都是通过文件句柄执行的。从驱动角度看,文件不重要,除非需要执行多客户端的会

2013-04-01 19:32:48 1692

原创 chapter 8.5: I/O Queues

为driver控制I/O请求流,跟踪活动的请求状态,支持取消请求、管理请求的并发、能选择性同步关于设备PnP和Power状态的操作。创建queue:    1.UMDF,调用IWDFDevice::CreateIoQueue    2.KMDF,调用WdfIoQueueCreate驱动可以创建一至多个queue,对于每个queue的配置:    1.接收quests的types

2013-04-01 19:28:39 1307

原创 chapter 8.4: I/O 请求对象

driver处理的请求对象,由I/O handler创建。请求对象通过callback函数的参数或者调用queue方法创建。UMDF:请求对象导出IWDFIoRequest接口KMDF:WDFREQUEST导出WdfRequestXxx方法驱动可以获得类型、参数、数据和关联的file object请求对象具有reference count,但IRP没有驱动可以创建请求对象,

2013-04-01 19:25:08 1517

原创 chapter 8.3: I/O request Flow

I/O request路径:图8.11.应用程序调用Windows API建立请求2.WinAPI调用kernel-mode subsystems,kernel-mode subsystems调用I/O manager3.I/O manager构建IRP,发送至KM的设备栈的top driver。4.向下传递直到设备栈中的driver完成IRP5.I/O manager调用

2013-04-01 19:17:25 1086

原创 chapter 8.2: I/O transfer types

3类:1.buffered I/O,复制用户的数据2.Direct I/O,通过MDLs和KM pointer访问用户数据3.Neither I/O,使用UM pointer访问用户数据应避免使用Neither I/O**IOCTLs可以使用任何类型,所有I/O request必须使用同样的类型(驱动相关)KMDF驱动在EvtDriverDeviceAdd回

2013-04-01 19:13:45 645

原创 chapter 8.1 I/O flow and dispatching

常用I/O请求类型:    决定哪种请求类型必须处理,哪些请求可以由framework代为处理最常用的请求:    创建/关闭/读/写/ device I/O control创建请求CreateFile返回的是进程句柄而不是线程句柄。应用程序调用CreateFile时,I/O manager创建file object,并向设备栈发送一个create request。

2013-04-01 19:11:40 661

原创 chapter 7.5 software-Only驱动的PnP和电源管理

============简要归纳,待整理要对所有queue在创建时禁用power managementToaster Filter例子,里面创建了两个PnP/电源管理的特性:一个可选的设备对象cleanup事件回调函数一个non-power-managed I/O queueNTSTATUS FilterEvtDriverDeviceAdd(

2013-03-10 16:50:27 911

原创 chapter 7.4:如何在WDF驱动中实现PnP和电源管理

============待整理

2013-03-10 16:47:44 829

原创 chapter 7.3 PnP和电源管理的回调的顺序

=============待整理

2013-03-10 16:47:11 683

原创 chapter 7.2: WDF的PnP和Power管理支持

WDF默认假设:    1.设备支持D0和D3    2.设备和驱动不支持idle和wake    3.FDO或PDO的I/O queue能被电源管理。状态机模型:    在WDF中支持PnP,power,power policy,idle logic,I/O callbackI/O queue和power管理framework实现了对I/O queue

2013-03-10 16:46:18 2059

原创 chapter 7.1: PnP和电源管理

WDM驱动同时需要跟踪系统的状态和设备的状态。需要对所有状态处理请求,包括不需要驱动产生动作的请求。 WDF实现了智能的默认的行为,导出一系列状态相关的回调来定制PnP和power行为。跟踪系统和设备状态,维护信息。管理I/O queue关于设备power state的行为,比如I/O request来时,framework可以启动设备。 WDF提供的PnP和power管理选项:

2013-03-10 16:44:13 1188

原创 chapter 6.7: KMDF设备对象的创建和初始化

所有支持PnP的KMDF驱动不许有EvtDriverDeviceAdd回调函数。用于创建和初始化device对象和相关资源。系统在发现驱动控制的一个设备时会调用它的EvtDriverDeviceAdd。EvtDriverDeviceAdd创建了一个WDFDEVICE对象,用来表示设备和通过大量初始化任务让framework提供信息来创建它自己的内部结构。EvtDriverDevic

2013-03-05 22:27:35 1298

原创 chapter 6.6: UMDF 设备对象的创建和初始化

=========待整理

2013-03-05 21:04:46 689

原创 6.5 Device Interface

想device发送I/O请求的用户模式的应用程序和系统组件为了打开设备,必须能识别设备Device Interface是一个设备支持的逻辑上的I/O操作集,每个device interface class有一个GUID,可以定义自己的GUIDdriver通过创建一个device interface把设备注册为a member of a device interface class,填写上合

2013-03-05 21:00:47 850

原创 chapter 6.4: Queue和其他支持对象

用来控制设备,处理I/O请求,它们组成了驱动的工作结构如下是经常创建的object(通常是device的子孙):Object DescriptionSupporting frameworkI/O queue objectManages the flow of I/O requests to the

2013-03-05 20:41:24 567

原创 chapter 6.3: Device Objects

设备对象:当PnP manager发现一个驱动控制的设备,它会通知framework。framework反过来调用driver来初始化设备数据结构。device object是驱动对象管理设备的角色,包含状态,是I/O请求的target。而windows不把请求发送给driver。device包含驱动要使用的device相关信息,支持设备相关事件的回调函数。DO的类型1

2013-03-05 20:37:44 1399

原创 chapter 6.2: 驱动对象

驱动对象支持add-device事件,存储全局数据,并支持一个在卸载时清除数据的回调函数UMDF Driver Callback Object创建==========KMDF Driver Object创建DriverEntry只被调用一次:    1.创建WDFDRIVER,表示内存中的驱动,并在framework注册    2.注册驱动的EvtDrive

2013-03-05 20:34:09 831

原创 chapter 6.1: driver 需要的组件

任何driver必须包含如下:    1.driver载入时的entry point    2.driver object    3.一至多个device    4.其他用来管理device和管理流向device的I/O request的object    5.event callbacksUMDF driver 结构和需求======KMDF dr

2013-03-05 20:32:59 781

原创 chapter 5.6: Object context area

是driver定义的由object使用的存储区域,UMDF和KMDF有不同的使用方式:    UMDF:存储在callback object中,也能按需要在object中创建    KMDF:driver通常在object中使用context areaUMDF object context Data=====UMDF context info in callba

2013-03-05 13:24:03 628

原创 chapter 5.5: 对象层次及生命周期

KMDF和UMDF都使用引用计数,所有的对象都有引用计数:    UMDF使用AddRef和Release来管理引用计数;    KMDF使用WdfObjectReferenceXxx和WdfObjectDereferenceXxx维护引用计数对象层次:        如图,驱动对象是根,其它都是它的后代。设备总是驱动的儿子,queue通常是设备的儿子,也可能是a late

2013-03-05 02:31:33 629

原创 chapter 5.4: 创建对象

UMDF:先按需要创建callback object,再调用create方法KMDF:先初始化object attributes structure和object configuration structure,再调用create方法创建UMDF对象UMDF对每种object提供了不同的创建方法:device, file, I/O request, memory, queue ob

2013-03-04 20:43:28 356

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除