- 博客(68)
- 收藏
- 关注
转载 内存屏障的作用:barrier()
在我看来,内存屏障主要解决了两个问题:单处理器下的乱序问题和多处理器下的内存同步问题。为什么会乱序?CPU的流水线机制:流水线是并行的。比如说CPU有一个加法器和一个除法器,那么一条加法指令和一条除法指令就可能同时处于“执行”阶段, 而两条加法指令在“执行”阶段就只能串行工作。相比于串行+阻塞的方式,流水线像这样并行的工作,效率是非常高的。然而,这样一来,乱序可能就产生
2013-07-07 13:18:50
3322
2
转载 预处理指令之#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.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.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
原创 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关注的人
RSS订阅