windows驱动开发-32位和64位

这部分其实是过时的知识点,毕竟win 11之已经不支持32位系统了,但是还是列出来吧。

32位主要是指x86体系,在早期,32位的应用程序和系统只支持4GB的内存地址寻址,这也是最大的特色之一,在那个时代,由于对内存限制导致出现了许多精巧的设计,这个体系也称为一个经典的体系,然而时代变了,64位出现之后,内存不再是一个问题,这也导致了后续很多编程都开始向64位转移,这篇文档主要侧重点也是讲32位驱动如何升级到64位驱动。

32位和64位的区别

32位和64位的本质区别就是指针长度的不一样,32位的指针是4字节,64位指针是8字节,大部分和指针长度无关的程序都能直接在64位下编译成功,唯一的例外是,用32位无符号整数和指针进行互相转换,这种情况下需要将32位无符号整数换成64位无符号整数。

对于用户模式应用程序,64 位 Windows 包括 Windows 上的 Windows (WOW64) thunking 层 ,使 32 位应用程序能够在 64 位版本的 Windows 上执行,虽然会有一定的性能下降。 它通过截获 32 位函数调用,并在转换到 64 位内核之前根据需要将指针精度参数类型转换为固定精度类型来执行此操作。 此转换过程称为 thunking。注意 此 thunking 仅适用于 32 位 应用程序;64 位版本的 Windows 不支持 32 位 驱动程序 。

在 32 位 Windows 上,整型、长整型和指针数据类型的大小都相同,即 32 位。 这种便捷的数据类型大小统一性对聪明的 C 程序员来说是一个福音,他们中的许多人都将其视为理所当然。

但是,在 64 位 Windows 上,这种统一性假设不再有效。 指针的长度现在为 64 位,但整数和长数据类型的大小仍与之前相同32 位。 这是因为,虽然需要 64 位指针来容纳具有多达 16 TB 虚拟内存的系统,但大多数数据仍然适合 32 位整数。 对于大多数应用程序,将默认整数大小更改为 64 位只会浪费空间。

在 32 位 Windows 平台上,操作系统会自动修复内核模式内存对齐错误,并使它们对应用程序不可见。 它对调用进程和任何后代进程执行此操作。 此功能通常会大幅降低性能,但尚未在 64 位 Windows 中实现。 因此,如果 32 位驱动程序包含不对齐 bug,则需要在移植到 64 位 Windows 时修复它们。

在 64 位 Windows 中执行 DMA

向驱动程序添加 64 位寻址支持可以显著提高整体系统性能。 对于 DMA这样执行直接内存访问的设备驱动程序来说,这一点尤其重要。 在 64 位 Microsoft Windows 中,执行 DMA 但不支持 64 位寻址的设备驱动程序是双缓冲的,这会导致相对性能降低。

尽管双缓冲通常 在8 GB 系统上),造成的单个百分点的影响相对较小,但这足以影响 I/O 密集型任务,例如数据库活动。 随着物理内存量的增加,这种负面的性能影响也会增加。

若要支持 64 位 DMA,驱动程序应遵循以下准则:

  • 使用 PHYSICAL_ADDRESS 结构进行物理地址计算;
  • 将整个 64 位地址视为有效的物理地址。 例如,驱动程序不应在锁定的缓冲区上调用 MmGetPhysicalAddress 、放弃高 32 位,并将截断的地址传递给 32 位组件适配器。 这会导致内存损坏、I/O 丢失和系统故障;
  • 使用在 Windows 2000 中添加 (GetScatterGatherList 和 PutScatterGatherList) 的高性能Scatter/Gather例程;
  • 检查 Mm64BitPhysicalAddress 全局系统变量的值。 如果为 TRUE,则系统支持 64 位物理寻址;
  • 将 DEVICE_DESCRIPTION 结构的 Dma64BitAddresses 成员设置为 TRUE 以指示驱动程序支持 64 位 DMA 地址;

32 位 Windows 中的 DMA 例程是 64 位就绪的。 如果设备驱动程序正确使用这些例程,则 DMA 代码应在 64 位 Windows 上无需修改即可正常工作。

在 64 位驱动程序中支持 32 位 I/O

Windows 上的 Windows (WOW64) 使 Microsoft Win32 用户模式应用程序能够在 64 位 Windows 上运行。 在转换到 64 位内核之前,它通过截获 Win32 函数调用并将参数从 32 位指针类型转换为 64 位指针类型来执行此操作。 对于所有 Win32 函数,此转换称为 thunking,它会自动完成,但有一个重要例外:传递给 DeviceIoControl 的数据缓冲区。 这些缓冲区的内容(由 InputBuffer 和 OutputBuffer 参数指向)不会被处理,因为它们的结构特定于驱动程序。

注意 尽管缓冲区内容未受到限制,但缓冲区指针将转换为 64 位指针。

用户模式应用程序调用 DeviceIoControl 以将 I/O 请求直接发送到指定的内核模式驱动程序。 此请求包含 I/O 控制代码 (IOCTL) 或文件系统控制代码 (FSCTL) 和指向输入和输出数据缓冲区的指针。 这些数据缓冲区的格式特定于 IOCTL 或 FSCTL,后者又由内核模式驱动程序定义。 由于缓冲区格式是任意的,并且驱动程序知道它,而不是 WOW64,因此将数据转换的任务留给驱动程序。

如果满足以下所有条件,则 64 位驱动程序必须支持 32 位 I/O:

  • 驱动程序向用户模式应用程序公开 IOCTL (或 FSCTL) ;
  • IOCTL 使用的至少一个 I/O 缓冲区包含指针精度数据类型;
  • 无法轻松重写 IOCTL 代码,以消除指针精度缓冲区数据类型的使用;
驱动程序如何识别 32 位调用方

驱动程序可通过两种方式来确定 IOCTL 或 FSCTL 请求的发起方是 32 位还是 64 位应用程序。 第一种是让应用程序标识自身。 第二种是让驱动程序自行确定应用程序是 32 位还是 64 位。

第一种方法涉及在 IOCTL 或 FSCTL 控制代码中定义“64 位”字段。 此字段包含仅为 64 位调用方设置的单个位。 因此,64 位调用方通过使用设置此位的一组单独的 64 位控制代码来标识自己。 32 位调用方使用一组类似的控制代码,其中未设置此位。

第二种方法允许 32 位和 64 位应用程序继续使用相同的 IOCTL 或 FSCTL 代码。 相反,驱动程序通过调用 IoIs32bitProcess 来确定用户模式进程是 32 位还是 64 位。

第一种方法更有效,因为驱动程序会检查位标志,而不是调用内核模式例程。 但是,第二种方法不需要更改用户模式代码。 应使用哪种技术取决于驱动程序的要求以及向其发送 I/O 请求的应用程序。

x64 驱动程序的限制

在基于 x64 的系统上,内核代码和某些内核数据结构受到保护,防止修改。 任何尝试修改此类代码或数据的驱动程序都将导致系统检查 (CRITICAL_STRUCTURE_CORRUPTION) 。

基于 x64 的系统驱动程序必须避免可能触发此 bug 的操作检查。 具体而言,驱动程序不得:

  • 尝试在运行时修改内核代码;
  • 实现和使用自己的堆栈;
  • 修改硬件调度表,例如中断调度表 (IDT) 或全局描述符表 (GDT) ;
  • 修改未记录的内核数据结构;

即使上述操作不会在基于 x86 或基于 Itanium 的系统上触发 bug 检查,驱动程序也不应在任何平台上执行这些操作。 这些操作在 Microsoft Windows 操作系统的未来版本中可能不起作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/605278.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

并发问题系统学习(更新中)

进程、线程 进程:进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。可以理解为一个java应用。 线程:线程是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的资源。…

java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条

今天遇到一个问题 系统线上问题,经常出现这样的问题,刚重启系统时不报错了,可是运行一段时间又会出现。sql已经写了limit 1,mybatis的debug日志也返回total为1,可是却报错返回了1805条数据 乍一看,感觉太不…

Elasticsearch的基本使用

Elasticsearch的基本使用 1.基本概念1.1 文档和字段1.2 索引和映射1.3 mysql与elasticsearch对比 2.索引库2.1 es中mapping映射属性2.2.es中索引库的增删改查 3.文档3.1 新增文档3.2 查询文档3.3 删除文档3.4 修改文档3.4.1 全量修改3.4.2 增量修改3.5 总结 4.DSL查询语法4.1 D…

Redis如何保证数据一致性?

Redis如何保证数据一致性? Redis通常作为持久层数据库(例如MySQL)的缓存层,如果缓存或者数据库数据发生改变,如何保证双方的数据是一致的? 这其实是要分情况讨论滴,对数据一致性不同的要求有不…

08.图形化界面字体问题处理

图形化界面字体问题处理 发现图形存在乱码,不显示文字 zabbix服务器的字符集所在的路径下: /usr/share/zabbix/assets/fonts 将本地windows系统的字体进行上传,选择一个自己喜欢的字体 上传到系统路径下并且直接覆盖掉 回到web浏览器界面…

什么是Facebook付费广告营销?

Facebook作为全球最大的社交平台之一,成为了跨境卖家不可或缺的营销阵地。它不仅拥有庞大的用户基数,还提供了丰富的广告工具和社群互动功能,让商家能够精准触达目标市场,提升品牌影响力。云衔科技通过Facebook付费广告营销的专业…

【CSS基础--CSS选择器的常见用法】

CSS选择器的常见用法 1.CSS介绍1.1 基本语法规范1.2 引入样式1.3 规范 2. CSS选择器2.1 标签选择器2.2 类选择器2.3 ID选择器2.4 复合选择器 1.CSS介绍 CSS(Cascading Style Sheet),层叠样式表,由于控制页面的样式。CSS能够对网页…

HTML批量文件上传2——进度条显示

作者:私语茶馆 非常多的云应用中需要上传文本,包括图片,文件等等,这些批量文件上传,往往涉及到进度条显示,多文件上传等,这里分享一个非常好的案例,来自BootStrapfriendly.com&#…

kubernetes附加组件—图形化管理工具Dashboard

一、介绍 Dashboard是k8s集群管理的一个WebUi,它是k8s的一个附加组件,需要单独部署。 我们可以通过图形化的方法,创建、删除、修改、查询k8s资源。 二、安装部署dashboard组件 Github地址:GitHub - kubernetes/dashboard: Gen…

物联网实战--平台篇之(四)账户后台交互

目录 一、交互逻辑 二、请求验证码 三、帐号注册 四、帐号/验证码登录 五、重置密码 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631…

自动驾驶中常见坐标系极其转换

各个传感器坐标系 相机坐标系统 摄像头的作用是把三维世界中的形状、颜色信息,压缩到一张二维图像上。基于摄像头的感知算法则是从二维图像中提取并还原三维世界中的元素和信息,如车道线,车辆、行人等,并计算他们与自己的相对位置。 感知算法和相机相关的坐标系有图像坐…

javaWeb入门(自用)

1. vue学习 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script src"https://unpkg.com/vue2"></script> </head> <body><div id"…

大语言模型入门介绍(附赠书)

自2022年底ChatGPT的震撼上线以来&#xff0c;大语言模型技术迅速在学术界和工业界引起了广泛关注&#xff0c;标志着人工智能技术的又一次重要跃进。作为当前人工智能领域的前沿技术之一&#xff0c;代表了机器学习模型在规模和复杂性上的显著进步。它们通常由深度神经网络构成…

解决微信小程序电脑能正常使用,手机端无法正常访问的SSL证书问题

目录 前言1 问题描述与调试2 探索问题根源2.1 用户反馈收集2.2 尝试手机端访问2.3 PC端调试 3 确认问题与解决方案3.1 检查SSL证书3.2 重新部署SSL证书3.3 测试修复效果 4 SSL&#xff08;Secure Sockets Layer&#xff09;证书中间证书4.1 SSL证书链的构成4.2 中间证书的作用 …

MindSponge分子动力学模拟——定义一个分子系统

技术背景 在前面两篇文章中&#xff0c;我们分别介绍了分子动力学模拟软件MindSponge的软件架构和安装与使用。这里我们进入到实用化阶段&#xff0c;假定大家都已经在本地部署好了基于MindSpore的MindSponge的编程环境&#xff0c;开始用MindSponge去做一些真正的分子模拟的工…

04、Kafka集群安装

03、Kafka 集群安装 1、准备工作 首先准备一台虚拟机&#xff0c;centos7系统&#xff0c;先在一台上配置安装后&#xff0c;最后克隆成多台机器。 1.1 安装JDK &#xff08;1&#xff09;下载JDK&#xff0c;上传到 /root/software 路径 下载地址&#xff1a;https://www…

DELL EMC unity存储系统如何初始化

在客户的存储使用过程中&#xff0c;经常会碰到一些场景需要对存储系统做重新初始化&#xff0c;就是回到出厂时候的配置。比如&#xff0c;客户设备要利旧&#xff0c;二次使用&#xff0c;一般都要回到出厂状态做重新配置的动作。存储严重故障&#xff0c;没有能力修复或者数…

现货黄金今日行情分析:昨日高低点法

进行交易之前&#xff0c;投资者要对现货黄金今日行情进行一波分析&#xff0c;我们交易决策应该建立在合理分析的基础之上。那么打开市场交易软件看到现货黄金今日行情之后&#xff0c;该如何着手进行分析呢&#xff1f;下面我们就来讨论一下具体的方法。 要进行现货黄金今日行…

【QuikGraph】C#调用第三方库实现迪杰斯特拉(Dijkstra)算法功能

QuikGraph库介绍 项目地址&#xff1a;https://github.com/KeRNeLith/QuikGraph QuikGraph为.NET提供了通用的有向/无向图数据结构和算法。 QuikGraph提供了深度优先搜索、广度优先搜索、A*搜索、最短路径、k最短路径&#xff0c;最大流量、最小生成树等算法。 QuikGraph最初…

大模型的不足与解决方案

文章目录 ⭐ 不具备记忆能力 上下文窗口受限⭐ 实时信息更新慢 新旧知识难区分⭐ 内部操作很灵活 外部系统难操作⭐ 无法为专业问题 提供靠谱的答案⭐ 解决方案的结果 各有不同的侧重 在前面三个章节呢&#xff0c;为大家从技术的角度介绍了大模型的历程与发展&#xff0c;也为…
最新文章