CPU与IRP的一些相关函数

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

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的一些相关函数,布布扣,bubuko.com

时间: 2024-10-29 19:06:20

CPU与IRP的一些相关函数的相关文章

派遣例程与IRP结构

提到派遣例程,必须理解IRP(I/O Request Package),即"输入/输出请求包"这个重要数据结构的概念.Ring3通过DeviceIoControl等函数向驱动发出I/O请求后,在内核中由操作系统将其转化为IRP的数据结构,并"派遣"到对应驱动的派遣函数中,如图21.1.6所示. Ring3程序调用kernel32.dll导出的DeviceIoControl函数后,会调用到ntdll.dll导出的NtDeviceIoControlFile函数,进而调用

Linux内核中的jiffies及其作用介绍及jiffies等相关函数详解

在LINUX的时钟中断中涉及至二个全局变量一个是xtime,它是timeval数据结构变量,另一个则是jiffies,首先看timeval结构struct timeval{time_t tv_sec; /***second***/susecond_t tv_usec;/***microsecond***/}到底microsecond是毫秒还是微秒?? 1秒=1000毫秒(3个零),1秒=1000 000微秒(6个零),1秒=1000 000 000纳秒(9个零),1秒=1000 000 000

IRP 与 派遣函数

什么是派遣函数: 派遣函数是 WIndows 驱动程序中的重要概念.驱动程序的主要功能是负责处理I/O请求,其中大部分I/O请求是在派遣函数中处理的.也就是说,派遣函数是用来处理驱动程序提交过来的 I/O 请求. 那什么是 I/O 请求呢? 上层程序与驱动程序之间通信时,上层会发出I/O请求,即输入输出请求包(I/O Request package) 用户模式下(上层)与所有驱动程序之间的I/O请求,全部由操作系统转化为一个叫 IRP 的数据结构,不同的 IRP 会被派遣到不同的派遣函数(Dis

ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现

ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现 承接 http://www.wowotech.net/pm_subsystem/suspend_and_resume.html Linux电源管理(6)_Generic PM之Suspend功能一文中的下图. 本文主要分析平台相关的CPU睡眠和唤醒,即下电和上电流程,以及ARM底层汇编代码实现. 内核版本:3.1.0               CPU:ARM Cortex-A7 1 平台相关函数执行流程

void *memmove( void* dest, const void* src, size_t count );数据拷贝,不需要CPU帮助

分享到 腾讯微博 QQ空间 新浪微博 人人网 朋友网 memmove 编辑词条 编辑词条 --> memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中.但复制后src内容会被更改.但是当目标区域与源区域没有重叠则和memcpy函数功能相同. 快速导航 目录 1函数简介 2程序示例 大事记 光影集锦 图册集锦 花絮视频 1函数简介 原型:void *memmove( void* dest,

linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁【转】

转自:http://blog.csdn.net/goodluckwhh/article/details/9005585 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 一每CPU变量 二原子操作 三优化和内存屏障 四自旋锁 自旋锁 自旋锁的数据结构和宏函数 读写自旋锁 读写自旋锁的相关函数 linux内核中的各种“任务”都能看到内核地址空间,因而它们之间也需要同步和互斥.linux内核支持的同步/互斥手段包括: 技术 功能 作用范围 每CPU变量 为每个CPU复制一份数据

linux概念之cpu分析

http://ilinuxkernel.com/?cat=4 Linux CPU占用率原理与精确度分析1  CPU占用率计算原理在Linux/Unix 下,CPU 利用率分为用户态.系统态和空闲态,分别表示CPU 处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间. 下面是top显示的值1.1%us,  1.6%sy,  0.0%ni, 97.2%id,  0.0%wa,  0.0%hi,  0.1%si,  0.0%st      us: User time         用

win10驱动下获取cpu信息

entry.c #include "Driver.h" NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath) { NTSTATUS status; //判断CPU类型 CPUType(); KdPrint(("Enter DriverEntry\n")); //DbgBreakPoint(); //设置卸载函数 pDriverObject-&g

linux查看cpu个数,核数,逻辑cpu个数

物理CPU:物理CPU是相对于虚拟CPU而言的概念,指实际存在的处理器,就是我们可以看的见,摸得着的CPU,就是插在主板上面的. 物理核:CPU中包含的物理内核个数,比如我们通常说的双核CPU,单核CPU. 在linux系统下面的/proc/cpuinfo文件的条目中: 1.有多少个不同的physical id就有多少个物理CPU. 2.cpu cores记录了对应的物理CPU(以该条目中的physical id标识)有多少个物理核,现在我们个人使用的单机PC大部分使用的都是双核CPU. 逻辑C