CPU与IRP的一些相关函数
VOID
KiAdjustIrpCredits (
VOID
)其中 Number = KeNumberProcessors;Prcb = KiProcessorBlock[Index];
多核情况下调整每个CPU的IRP对象配额。在while (Index < Number);轮询调整1-n的CPU的配额InterlockedExchangeAdd(&Prcb->LookasideIrpFloat, Adjust),不过最后一个CPU为什么是 InterlockedExchangeAdd(&Prcb->LookasideIrpFloat, -TotalAdjust)?? PIRP
IopAllocateIrpPrivate(
IN CCHAR StackSize,
IN BOOLEAN ChargeQuota
)分配IRP首先根据IRP需要的栈单元决定是否从两个快查表中的一个分配。一个栈单元为1则为LookasideSmallIrpList ,一个栈单元小于8大于1则为LookasideLargeIrpList.然后从指定的快查表中摘除一个作为IRP的空间。如果超过8 则自行分配。没什么说的了。 里面的IopInitializeIrp倒是个需要注意的 StackSize 是IRP要分配的堆栈数目PacketSize是IRP的长度加上 StackSize *stack的长度#define IopInitializeIrp( Irp, PacketSize, StackSize ) { \
RtlZeroMemory( (Irp), (PacketSize) ); \
(Irp)->Type = (CSHORT) IO_TYPE_IRP; \
(Irp)->Size = (USHORT) ((PacketSize)); \
(Irp)->StackCount = (CCHAR) ((StackSize)); \
(Irp)->CurrentLocation = (CCHAR) ((StackSize) + 1); \
(Irp)->ApcEnvironment = KeGetCurrentApcEnvironment(); \
InitializeListHead (&(Irp)->ThreadListEntry); \
(Irp)->Tail.Overlay.CurrentStackLocation = \
((PIO_STACK_LOCATION) ((UCHAR *) (Irp) + \
sizeof( IRP ) + \
( (StackSize) * sizeof( IO_STACK_LOCATION )))); } IopFreeIrp情况类似:首先检验IRP是否是IO_TYPE_IRP,&(Irp)->ThreadListEntry为空。当前IRP的CurrentLocation大于IRP的STACKCOUNT。获取当前CPU的PKPRCB , prcb = KeGetCurrentPrcb();然后根据IRP之前是从快查表分配还是使用自行分配进行处理。 另:这里是 gussing是个错别字 的博客
http://www.cnblogs.com/gussing/archive/2011/01/18/1938140.html因为他不允许转载 所以在这里谈谈内容 也推荐大家对驱动内核有兴趣的去看下他的wdk tips IRP的创建可以为自写驱动创建和IO管理器创建,在释放上有自己释放或者由IO管理器释放两种IoAllocateIrp IoBuildAsynchronousFsdRequest属于需要自行释放,WDK帮助也有提到。( IoBuildSynchronousFsdRequest IoBuildDeviceIoControlRequest TdiBuildInternalDeviceControlIrp 属于交与IO管理器释放。 PIRP
IoBuildAsynchronousFsdRequest(
IN ULONG MajorFunction,
IN PDEVICE_OBJECT DeviceObject,
IN OUT PVOID Buffer OPTIONAL,
IN ULONG Length OPTIONAL,
IN PLARGE_INTEGER StartingOffset OPTIONAL,
IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL
)
{
PIRP irp;
PIO_STACK_LOCATION irpSp; // 分配IRP 第一个是IRP的stack数目 ,第二个参数是不改变IRP配额 irp = IoAllocateIrp( DeviceObject->StackSize, FALSE );
if (!irp) {
return irp;
} // 按推荐的博客的那个作者的意思 这里应该不设置THREAD 因为他将创建的IRP分类至NON THREAD IRP。 irp->Tail.Overlay.Thread = PsGetCurrentThread(); irpSp = IoGetNextIrpStackLocation( irp ); irpSp->MajorFunction = (UCHAR) MajorFunction; if (MajorFunction != IRP_MJ_FLUSH_BUFFERS &&
MajorFunction != IRP_MJ_SHUTDOWN &&
MajorFunction != IRP_MJ_PNP &&
MajorFunction != IRP_MJ_POWER) { // ......根据设备对象的类型来决定 BUFFER的种类是SYSBUF 还是MDL 或者原函数输入BUF...... // 代码比较简单 分配IRP并设置读写参数 if (MajorFunction == IRP_MJ_WRITE) {
irpSp->Parameters.Write.Length = Length;
irpSp->Parameters.Write.ByteOffset = *StartingOffset;
} else {
irpSp->Parameters.Read.Length = Length;
irpSp->Parameters.Read.ByteOffset = *StartingOffset;
}
} irp->UserIosb = IoStatusBlock;
return irp;
} IoBuildsynchronousFsdRequest还是调用IoBuildAsynchronousFsdRequest只不过多了一行 irp->UserEvent = Event,用于同步时候的等待。
CPU与IRP的一些相关函数的更多相关文章
- linux概念之cpu分析
http://ilinuxkernel.com/?cat=4 Linux CPU占用率原理与精确度分析1 CPU占用率计算原理在Linux/Unix 下,CPU 利用率分为用户态.系统态和空闲态,分 ...
- 绑定CPU
处理器的亲和性 软亲和性(affinity) 意味着进程并不会在处理器之间频繁迁移,而 硬亲和性(affinity) 则意味着进程需要在您指定的处理器上运行. 通常 Linux 内核都可以很好地对进程 ...
- 派遣例程与IRP结构
提到派遣例程,必须理解IRP(I/O Request Package),即"输入/输出请求包"这个重要数据结构的概念.Ring3通过DeviceIoControl等函数向驱动发出I ...
- IRP 与 派遣函数
什么是派遣函数: 派遣函数是 WIndows 驱动程序中的重要概念.驱动程序的主要功能是负责处理I/O请求,其中大部分I/O请求是在派遣函数中处理的.也就是说,派遣函数是用来处理驱动程序提交过来的 I ...
- 基于opencv的gpu与cpu对比程序,代码来自opencv的文档中
原文链接: http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/gpu/gpu-basics-similarity/gpu-basi ...
- 【转帖】ARM的两种不同的CPU docker 应该也是支持arm的
armel和armhf区别选择 知识经验 3年前 (2014-11-07) 20603浏览 1评论 目录 fpu单元 armel与armhf 安装armel和armhf arm-linux-gn ...
- [非常重要的总结] Linux C相关函数
(1)字符测试函数 isalnum(测试字符是否为英文字母或数字) isalpha(测试字符是否为英文字母) isascii(测试字符是否为ASCII码字符) isblank(测试字符是否为空格字符) ...
- 基于五阶段流水线的RISC-V CPU模拟器实现
RISC-V是源自Berkeley的开源体系结构和指令集标准.这个模拟器实现的是RISC-V Specification 2.2中所规定RV64I指令集,基于标准的五阶段流水线,并且实现了分支预测模块 ...
- 【驱动笔记9】初探IRP
文章作者:grayfox作者主页:http://nokyo.blogbus.com原始出处:http://www.blogbus.com/nokyo-logs/34005738.html 此前我们可能 ...
随机推荐
- centos7-软件安装-redis3.2
wget方式下载redis3.2 wget http://download.redis.io/releases/redis-stable.tar.gz 命令行下载redis,此命令会保存redis至当 ...
- 八皇后(DFS)
题目描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8 ...
- Pascal语言(存档)
数据类型 标准函数 运算符和表达式 输入语句 输出语句 if语句 case语句 for语句 while语句 repeat语句 函数与过程 形参与实参 全局变量与局部变量 数组 字符串 枚举 子界 集合 ...
- centos 7 安装sql 审核工具 inception + archer
系统环境: Centos7 + python2.7 + python3 .... 下载 源码地址:https://github.com/mysql-inception/inception Incept ...
- Deployment Descriptor Web.xml
Deployment Descriptor部署描述符: - 部署描述符是要部署到Web容器或EJB容器的Web应用程序或EJB应用程序的配置文件. - 部署描述符应包含EJB应用程序中所有企业bean ...
- [sql]sql函数coalesce返回第一个非空的值
下面来看几个比较有用的例子: 首先,从MSDN上看看这个函数的使用方法,coalesce函数(下面简称函数),返回一个参数中非空的值.如: SELECT COALESCE(NULL, NULL, G ...
- 爬虫:输入网页之后爬取当前页面的图片和背景图片,最后打包成exe
环境:py3.6 核心库:selenium(考虑到通用性,js加载的网页).pyinstaller 颜色显示:colors.py colors.py 用于在命令行输出文字时,带有颜色,可有可无. # ...
- 爬取WX小程序的数据
方法一: 使用TBS工具,调试跟踪获取URL https://x5.tencent.com/tbs/guide/debug/download.html https://x5.tencent.com/t ...
- 详解vue-cli脚手架项目-package.json
该随笔收藏自: 详解vue-cli脚手架项目-package.json package.json是npm的配置文件,里面设定了脚本以及项目依赖的库. npm run dev 这样的命令就写在packa ...
- win10 64位,家庭版,C++,ini配置说明
#include<windows.h> #include<iostream> #include <atlstr.h> using namespace std; ...