DMA模式

DMA被关闭的判断与修复
(分享)如何防止Windows自行关闭硬盘DMA模式
硬盘的DMA模式大家应该都知道吧,硬盘的PATA模式有DMA33、DMA66、DMA100和DMA133,最新的SATA-150都出来了!一般来说现在大多数人用的还是PATA模式的硬盘,硬盘使用DMA模式相比以前的PIO模式传输的速度要快2~8倍。DMA模式的起用对系统的性能起到了实质的作用。以前有很多文章介绍过如何打开DMA模式,我在这里也就不多说了。

但笔者发现一个新的“问题”——Windows 2000、XP、2003系统有时会自行关闭硬盘的DMA模式,自动改用PIO模式运行!这就造成在使用以上系统中硬盘性能突然下降,其中最明显的现象有:系统起动速度明显变慢,一般来说正常Windows XP系统启动时那个由左向右运动的滑条最多走2~4次系统就能启动,但这一问题发生时可能会走5~8次或更多!而且在运行系统时进行硬盘操作时明显感觉变慢,在运行一些大的软件时CPU占用率时常达到100%而产生停顿,玩一些大型3D游戏时(比如极品飞车6)画面时有明显停顿(很多人这时以为是自己的显卡问题,当然如果你使用的是三年前的显卡玩这些游戏是有点老了,但如果你用的是今年才买的GF显卡那就不是它的问题了),出现以上问题时大家最好看看自己硬盘的DMA模式是不是被Windows 系统自行关闭了。查看自己的系统是否打开DMA模式:2
1. 双击“管理工具”,然后双击“计算机管理”

2. 单击“系统工具”,然后单击“设备管理器
3. 展开“IDE ATA/ATAPI 控制器”节点
4. 双击您的“主要IDE控制器”
5. 点击“高级设置”
看到“设备0”,下面的传输模式应设为“DMA(若可用)”,再下面“当前传输模式”,如果是“Ultra DMA Mode *(*为数字,DMA33为2,DMA66为4,DMA100为5、DMA133为6)”,那么你的系统正常,但如果以前你自己设的是“Ultra DMA Mode 6”又没有改动,而现在是“Ultra DMA Mode 4”或“Ultra DMA Mode 2”更或者是“PIO 模式”而且改不过来!可能就是系统自行关闭了DMA模式了。

分析问题:
好了,先来说说问题是如何产生的。在Windows 2000/XP/2003中有这样一个设定: Windows IDE/ATAPI 端口驱动程序 (Atapi.sys) 累积收到总共6个超时或循环冗余检验 (CRC) 错误后,驱动程序将把通信速度(传送模式)从最快的直接内存访问 (DMA) 模式分步骤降为较慢的 DMA 模式。如果驱动程序继续收到超时或 CRC 错误,则驱动程序最终将把传送模式降为最慢的模式(PIO 模式)。 问题就在这里!一般来说一个正常的硬盘很少会有超时或循环冗余检验 (CRC) 错误,但是当我们使用这些系统里的挂起(也有叫休眠)并恢复计算机后就很容易造成超时或循环冗余检验 (CRC) 错误。因为系统设定的超时值为4秒,当系统向 ATA 磁盘发出读取请求时如果硬盘回应时间超过 4 秒的超时值时才会产生超时或循环冗余检验 (CRC) 错误,但因为系统在挂起(也有叫休眠)时硬盘是在停转状态中,恢复计算机时硬盘有个从停止到运动的过程,这就很容易造成大部分硬盘回应时间超过 4 秒的超时值。也就是说当我们使用计算机挂起6次后系统就会把通信速度(传送模式)从最快的直接内存访问 (DMA) 模式分步骤降为较慢的 DMA 模式。如果挂起6次以上则驱动程序最终将把传送模式降为最慢的模式(PIO 模式)。这就是Windows 系统突然变慢的原因。
解决问题:
若要为受影响的设备重新启用典型DMA或更快DMA的传送模式,
请执行以下操作:
1. 双击“管理工具”,然后双击“计算机管理”
2. 单击“系统工具”,然后单击“设备管理器”
3. 展开“IDE ATA/ATAPI 控制器”节点
4. 双击您要为其恢复典型 DMA 传送模式的控制器
5. 单击“驱动程序”选项卡
6. 单击“卸载”。
当此过程完成后,重新启动您的计算机。当 Windows 重新启动后,将重新枚举硬盘控制器,同时与该控制器相连的每个设备的传送模式将重置为默认值但这样只是把硬盘设备的传送模式重置为默认值,当我们再使用挂起系统时系统又会自行关闭DMA模式!所以我们还要做以下操作:

1. 单击“开始”,单击“运行”,键入 Regedit,然后单击“确定”
2. 在注册表中找到并单击以下项:
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Class/{4D36E96A-E325-11CE-BFC1-08002BE10318}/0001和HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Class/{4D36E96A-E325-11CE-BFC1-08002BE10318}/0002
3. 在“编辑”菜单上,指向“新建”,然后单击“DWORD 值”
4. 键入 ResetErrorCountersOnSuccess,然后按 Enter 键。
5. 在“编辑”菜单上,单击“修改”。
6. 键入 l,然后单击“确定”
7. 按照下列步骤操作,然后退出注册表编辑器:
注意:上面注册表最后的项“{4D36E96A-E325-11CE-BFC1-08002BE10318}”列出的带有“0001”编号的子项对应于一台仅有一个 IDE 控制器的计算机的主要 IDE 通道和次要 IDE 通道。如果您的计算机有两个 IDE 控制器,则对于每个控制器,主要 IDE 通道和次要 IDE 通道的带有编号的子项分别是:“0001、0002、0003、0004、0005、0006……”。
为检查是否找到了正确的子项,请检查子项的 DriverDesc 值是包含字符串值“主要 IDE 通道”,还是包含字符串值“次要 IDE 通道”
建立以上注册表键值的目的是:
在Windows中,使系统向 ATA 磁盘发出读取请求时的 4 秒的超时值更改为 10 秒。还实现了一种较不严格的变通策略以在发生超时错误和 CRC 错误时降低传送模式(从较快的 DMA 模式到较慢的 DMA 模式,最终降为 PIO 模式)。以前的情况是,在每当累积发生的超时错误或 CRC 错误的总数达到 6 次时,IDE/ATAPI 端口驱动程序 (Atapi.sys) 将降低传送模式。当我们建立以上注册表键值实现新的策略后,Atapi.sys 仅在连续发生 6 次超时错误或 CRC 错误后才降低传送模式。
这一新的策略实现后将大大降低系统降低或关闭DMA传送模式的机会。现在我们可以安心地使用挂起系统和高性能的DMA硬盘模式,再也不会发生系统性能突然下降的情况了。

 

 

 

 

 

 

 

 

 

 

+

+

+

+

+

+

+


硬盘DMA模式被改为PIO的解决方法

    大家都知道,硬盘必须打开DMA模式才会跑得快。而开启各种硬件设备的DMA模式的条件,除主板BIOS必须打开DMA支持选项外,Windows操作系统内的IDE设备也要设成正确的DMA模式才行。不过,据说Windows XP若发生多次存取错误(如死机后不正常关机),就会自动把硬盘降为较低速的DMA模式或更慢的PIO模式。这个问题应该如何发现并解决呢?

  近几年来生产的硬盘,大致采用Ultra DMA 33/66/100/133等几种传输模式(目前市场上所能买到的都是DMA100以上的硬盘),数字越大代表数据传输速度越快。一般情况下,Windows XP会根据硬盘本身的技术规格,自动把它设为正确的DMA模式。

  不过根据微软公司公布的一篇技术性文章( http://support.microsoft.com/?kbid=817472)指出,当XP系统发生多次错误后,硬盘的传输模式很可能会被系统自动修改降低。如果你发现硬盘速度突然变慢了,可能就是发生了此问题。下面,笔者告诉你如何强制固定硬盘的DMA模式,不让操作系统修改,从而使你的电脑一直保持在最佳状态。

  1、首先,我们如何才能知道硬盘的DMA模式是否被XP系统修改呢?在桌面“我的电脑”图标上单击鼠标右键,并于随后出现的快捷功能菜单中点选“管理”一项。


2、打开“计算机管理”窗口后,点选左边小窗口的“设备管理器”,然后展开右方小窗口的“IDE ATA/ATAPI控制器”。在“主要IDE通道”一项上双击鼠标左键,弹出“主要IDE通道属性”设置窗口,再切换到“高级设置”标签页,就可以检查XP系统中实际的DMA模式。


其中,“设备0”和“设备1”两栏分别代表IDE排线连接的第一个硬件设备和第二个硬件设备。请大家根据自己硬盘所接的位置来辨别。例如笔者电脑中的“设备0”为硬盘,“设备1”为光驱。如果电脑中的另一条IDE排线还接着另外一个硬盘,则请检查“次要IDE通道”的内容。

  至于“当前传送模式”一栏中的代号,分别为:“模式0(DMA)”、“模式2(DMA 33)”、“模式4(DMA 66)”、“模式5(DMA 100)”、“模式6(DMA 133)”,请大家自己对照电脑硬盘的技术规格来判断。

3、若上面一步中显示的系统DMA模式与你的硬盘实际规格不一样,则可能是被XP系统修改了。这时即使你现在在“当前传送模式”一栏改成正确的DMA模式,下次开机还是会跳回原设置。因此,我们必须先切换到“驱动程序”标签页,并单击“卸载”按钮,然后重新启动电脑。


4、重开机后,在XP桌面上点击“开始”→“运行”,输入“regedit”以运行“注册表编辑器”程序。然后查找下面的主键:“HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Class/{4D36E96A-E325-11CE-BFC1-08002BE10318}/0001”

  5、找到该主键后,在注册表编辑器右方窗口的空白处单击鼠标右键,点击“新建”→“DWORD值”。

 6、将此DWORD值重新命名为“ResetErrorCountersOnSuccess”(注意大小写),然后在该DWORD值上单击鼠标右键,在随后出现的快捷菜单中点“修改”一项。

  7、出现“编辑DWORD值”对话框后,将“数值数据”一栏由原本的“0”改为“1”,然后再点“确定”按钮。重新启动电脑后,现在系统可以强制改回与硬盘技术规格相符的DMA模式。


8、有一点需要补充的是,如果你的电脑包含两个以上的IDE控制器(装有两个以上的硬盘),则在“HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Class/{4D36E96A-E325-11CE-BFC1-08002BE10318}”主键下,可能还有“0002”、“0003”……等子项,代表每一组主要和次要IDE通道,请大家按相同的方法来进行修改即可。

同样,你也可以参照微软的技术文章http://support.microsoft.com/?kbid=817472,来解决此类的问题,笔者所玩的机子,很早之前就出现了这类的问题,苦于不知道从何下手解决,有时两天就要装一次系统,而且也不敢装别的软件,总以为是装了某个软件导致的,最后了现,也不是这么回事.于是找到这篇文章,现在也正在用这个方法,希望能解决.

<think>嗯,用户想了解DMA模式的工作原理和实现方式,特别是与计算机体系结构相关的部分。首先,我需要回忆一下DMA的基本概念。DMA,即直接内存访问,是一种允许外围设备直接与内存交换数据而无需CPU介入的技术,这样可以提高系统效率。 用户的问题中提到“原理”和“实现”,所以我需要分两部分来回答。首先解释DMA的工作原理,包括它的作用、基本流程和优势。然后,讨论实现方式,可能涉及DMA控制器的结构、工作模式以及总线技术的影响。 记得用户之前提供的引用中有提到Scatter-gather DMA模式和总线结构。引用[1]里提到Scatter-gather模式使用链表描述非连续存储空间,比Block DMA高效。这个点应该包含在实现方式的优化部分。引用[2]提到总线技术是连接计算机各部件的通道,虚拟化技术可能相关,但用户的问题主要围绕DMA,可能需要提到总线在DMA中的作用,比如DMA控制器通过系统总线与内存、设备通信。 用户示例中的回答结构清晰,分点说明,我需要效仿。可能的结构:工作原理部分分点讲定义、流程、优势;实现方式部分讲DMA控制器结构、工作模式(包括普通和Scatter-gather)、总线结构的影响。 还需要注意用户提到的系统级指令,比如数学表达式用$...$,但这个问题可能涉及较少数学内容,可能用到的如数据传输的公式,比如传输时间计算,如果有的话要用正确格式。但根据问题,可能更多是文字描述。 然后生成相关问题。用户之前的示例问题包括性能分析、优化方法、应用场景,所以类似的问题可能包括DMA与其他传输方式的对比、Scatter-gather的应用,或者总线竞争的影响。 检查是否有遗漏点。例如,DMA的工作流程中的三个阶段:请求、响应、传输。需要详细说明每个阶段CPU和DMA控制器的协作。另外,地址寄存器和计数器的作用,在实现方式里提到。 可能还需要提到DMA在计算机体系结构中的位置,如位于CPU和I/O设备之间,通过总线连接。引用[2]中的总线结构部分可以支持这一点,说明DMA如何利用总线进行数据传输,避免CPU的参与。 最后,确保引用正确。用户提供的引用[1]关于Scatter-gather DMA,引用[2]关于总线结构,引用[3]似乎不太相关,但可能有章节结构可以参考,不过这里可能不需要。所以主要引用[1]和[2]。 检查是否需要区分Block DMA和Scatter-gather DMA,用户的问题可能希望了解不同模式的实现方式,所以需要对比说明,引用[1]的例子正好用在这里。 确认回答是否覆盖了用户的问题点:原理、实现、计算机体系结构。是的,工作原理属于原理部分,实现方式和总线结构属于实现和体系结构部分。 可能用户的实际需求是理解DMA如何提升系统性能,尤其是在高负载情况下减少CPU占用,所以需要强调效率提升的原因,比如减少中断次数,直接内存访问等。 最后生成相关问题时,考虑DMA的应用场景、不同模式的比较、性能影响因素,以及与其他技术如中断驱动的对比。</think>### DMA模式工作原理及实现方式 #### 一、DMA模式核心原理 1. **基本定义** DMA(Direct Memory Access,直接内存访问)是一种允许外设**直接与内存交换数据**的技术,无需CPU参与数据传输过程,从而释放CPU资源[^1]。 2. **工作流程** - **阶段1:初始化** CPU配置DMA控制器的寄存器(包括内存起始地址、传输数据量、传输方向)。 - **阶段2:传输请求** 外设向DMA控制器发起传输请求(DREQ信号)。 - **阶段3:总线控制权获取** DMA控制器向CPU申请总线控制权(HRQ信号),CPU完成当前总线周期后释放控制权(HLDA信号)。 - **阶段4:数据传输** DMA控制器直接通过总线完成外设与内存间的数据传输。 - **阶段5:传输完成** DMA控制器释放总线,并通过中断通知CPU[^2]。 3. **性能优势** - 减少CPU中断次数,提升系统吞吐量。 - 数据传输速率可达总线带宽上限,例如:若总线频率为100MHz,则理论速率$R = 100 \times 10^6 \times 32\text{bit} = 3.2\text{GB/s}$。 #### 二、DMA实现关键技术 1. **DMA控制器结构** - **地址寄存器**:存储内存起始地址,支持自动递增。 - **计数器**:记录剩余传输数据量,归零时触发中断。 - **控制逻辑**:处理总线仲裁与传输协议(如突发传输、单周期传输)。 2. **工作模式** - **Block DMA** 连续传输一整块数据,适用于物理连续内存区域。 - **Scatter-Gather DMA** 通过链表描述多个非连续内存块,实现高效分散/聚集传输(减少CPU干预)[^1]。 ```c struct sg_entry { dma_addr_t addr; // 物理地址 uint32_t len; // 数据长度 struct sg_entry *next; // 下一节点 }; ``` 3. **总线架构影响** - **共享总线**:DMA控制器与CPU竞争总线使用权,需通过仲裁器协调。 - **独立I/O总线**:为DMA设计专用通道,避免总线竞争(如PCIe的Root Complex架构)[^2]。 #### 三、典型应用场景 1. **高速外设** 网络接口卡(NIC)接收数据包时,DMA直接将数据写入内核缓冲区。 2. **存储设备** SSD控制器通过DMA将数据从闪存传输到主机内存。 3. **图形处理** GPU显存与系统内存间的大规模纹理数据传输。 ```plaintext CPU <---> | DMA控制器 | <---> [总线] <---> 内存 | 地址寄存器 | | 计数器 | | 控制逻辑 | ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值