内核驱动的文件操作
来源:互联网 发布:如何投诉淘宝店家 编辑:程序博客网 时间:2024/05/18 00:49
在应用层读写文件等操作将通过 INT 2E切换到内核层。这个不用说大家都很熟悉流程。那么到了内核层又是如何处理的?就先拿 ZwReadFile,ZwWriteFile 说事。 首先将文件句柄转换成FILE_OBJECT 指针。这时 I/OMGR 收到一个 FILE I/O 请求,它将首先选择用 FASTIO 接口来进行缓冲操作(注意:FASTIO 对于FSD 来说不是必须的。且 FASTIO 并不真正读写内容)如果有 FASTIO 例程则调用FastIoRead,FastIoWrite。在它们的函数处理例程中返回 TRUE 那么则表示操作完成,继续调用 CC MGR。如果返回 FALSE 那么I/O MGR 则创建 IRP 。系统判断 FILE_OBJECT 结构中的PrivateCacheMap 项如果不为 NULL,表示已被 CC MGR映射过了,调用CcCopyRead,CcCopyWrite。如果为 NULL 那么 CC MGR 会调用 CcInitializeCacheMap来初始化,把相应的 FILE_OBJECT 映射进来。在经过 I/O MGR 处理后无论是 IRP 还是 FASTIO,怎么分支都会走到CC MGR。那么在CC MGR 中又会碰到几个状况。如 CC MGR 的 LAZY WRITETHREAD 会定期调用 MM MGR 的 MmFlushSection 将 CCMGR 中已被修改的PAGE 发送到 FSD 写盘。而 MM MGR 又有几种状况,先拿写来说。MM MGR 存在 DIRTY WRITE, 那么在这种情况下,MM MGR 则调用 IoAsynchronousPageWrite向 FSD 发送 NOCACHE IRP 即 IRP HEADER 的 FLAGS 为IRP_NOCACHE 来写盘。也就是说 CC MGR 调用 MM MGR 的 MmFlushSection 而 MM MGR则调用IoAsynchronousPageWrite 发送 NOCACHE IRP 到 FSD,那么 FSD 则直接发送到 STORAGE DRIVER进行写盘操作。这是写盘操作过程。 在走到 CC MGR 后读盘又分几种状况。在调用 CcCopyRead 时如果数据不在 CC MGR 中,则产生缺页中断(这其实也是预先读机制)。产生缺页中断后会走到MMMGR 。此时 MM MGR 调用 IoPageRead 来发送一个 PAGING I/O 的 IRP 即 IRP HEADER 中的 FLAGS为IRP_PAGING_IO 或 IRP_SYNCHRONOUS_PAGING_IO 到 FSD。还有就是用户层调用 CreateFileMapping其实是调用 NtCreateSection 一样产生缺页中断然后到MM MGR 调用MmCreateSection。其余就跟我上面提到的流程一样了。待一些读/写 IRP 发送到 FSD 时。 FSD 再调用 IoCallDriver继续传递下去。如果你对NT DRIVER 分层机制了解的话。可能就会理解为什么要有这一步。有一些不准确的地方。1.系统判断 FILE_OBJECT 结构中的PrivateCacheMap 项如果不为 NULL,表示已被 CC MGR映射过了,调用CcCopyRead,CcCopyWrite。但是如果PrivateCacheMap为null,则io mgr则就要生成irp发给文件系统驱动,由文件系统驱动去调用CcInitializeCacheMap,而不是io mgr自己调用。可以看看fastfat的Read函数2.在调用 CcCopyRead 时如果数据不在 CC MGR 中,则产生缺页中断(这其实也是预先读机制)。这个不叫预读,预读简单说比如你顺序读,读64k, cc mgr预测你还会读下一个64k,这样cc mgr一次会读128k.3.还有就是用户层调用 CreateFileMapping ,其实是调用 NtCreateSection 一样产生缺页中断然后到MM MGR 调用MmCreateSection.不知道想表达什么意思。可能是想说ntcreatesection,会调用mm mgr的mmcreatesection.mapview以后,当访问映射的地址的时候,会产生缺页中断,此时 MM MGR 调用 IoPageRead 来发送一个 PAGING I/O 的 IRP ,和上面cc copy的处理流程是一样的了。而不是在ntcreatesection的时候会产生缺页中断还是要看windows internal那本书,权威而且非常准确,有精力多看看源代码更好。
- 内核驱动的文件操作
- windows 内核驱动的文件操作(转载二)
- Windows驱动开发(4) - 内核模式下的文件操作
- Linux 内核驱动里对文件的操作
- Windows内核驱动中操作文件
- Windows内核驱动中操作文件
- Windows内核驱动中操作文件
- Win64 驱动内核编程-5.内核里操作文件
- windows内核的文件操作
- Windows内核驱动中操作文件(转载一)
- 内核驱动读写文件
- 内核中与驱动相关的内存操作之一(MMU)
- Windows驱动开发(3) - 内核模式下的字符串操作
- Windows驱动开发(5) - 内核模式下的注册表操作
- Linux内核态下的文件操作
- 内核模式下的文件操作
- Linux内核态下的文件操作
- Linux内核态下的文件操作
- Linux设备驱动程序之阻塞/非阻塞IO----等待对列
- 从资源文件中获取版本信息
- 学点C#7 IO
- ARM处理器中常量的理解
- 我脑残实验室Verilog学习笔记1
- 内核驱动的文件操作
- 简单控件的应用(二)—学生管理系统
- 我脑残实验室verilog学习笔记2
- 简单控件的应用(一)—prj计算器
- Linux+Apache+MySQL+PHP5的安装与配置与phpBB2论坛的架设
- Yahoo!团队实践分享:网站性能优化的34条黄金守则(转)
- 浅析C++中的this指针
- 如何解决局域网共享需要密码妙招
- 保持冷静