USB HOST驱动中的内存分配

简介:

前面遇到过一个问题, USB HUB上只能接入有限的设备, 情况描述为:

HUB上接入两个U盘,后插入的会失败于建立第二个端偶的PIPE, Debug Message显示为

-CphysMem AllocateMemory: No memory available
-TDQueue: TDQueue - no memory for TD List
-CBulkPipe::OpenPipe - no memory for TD

问题位于 driver\ohcd2\Transfer.cpp   line 298  TDQueue::QueueInit().  再进一步, hcd\common\cphysmem.cpp的函数FindFreeBlock在while循环中失败

详细记录表面现象为:
BOT + CBIT   OK
BOT + BOT   OK
BOT + BOT + MOUSE  OK
BOT + BOT + MOUSE + KBD   KBD失败
BOT + CBIT + MOUSE  MOUSE失败
CBIT + CBIT   后面一个CBIT失败

很明显是内存分配出问题了, 我在新闻组上征求意见, Bruce Eitman (eMVP) 答复如下:
CPhysMem manages a pool of memory for use within the USB Host driver, Allocations from that pool can fail if there simply isn't enough memory to allocate or if it is fragmented. You can set the amount of memory available by changing the amout requested in calls to it's constructor

里面提到了constructor, 我查到usb host 初次调用CPhysMem时, 几种内存情况为:
Total Alloc Region size = 64K
Special Alloc REgion size = 4K
HighPri Alloc Region size = 16K
Normal Alloc Region size = 44K
调用路线:
SOhcdPdd::InitializeOHCI (bul_ohci.cpp)  ->  HcdMdd_CreateMemoryObject (Hcddriv.cpp)

所以修改点在bul_ohci.cpp开头的两个全局变量上
gc_TotalAvailablePhysicalMemory
gcHighPriorityPhysicalMemory

修改后问题果然解决. 使用时故意看了一下各种USB设备占用的内存量:
Logitech MOU :  4928 byte
CBIT U盘  :  20736 byte
BOT U盘:  14944 byte
Delux USB KBD:  7776 byte


本文转自Walzer博客园博客,原文链接:http://www.cnblogs.com/walzer/archive/2006/02/05/325606.html,如需转载请自行联系原作者

相关文章
|
3月前
|
Linux Windows
反射内存卡驱动的安装
【8月更文挑战第28天】以下是反射内存卡驱动安装的一般步骤:首先确认内存卡型号及操作系统版本,并从制造商官网下载兼容的驱动程序。安装时,运行安装包,按提示接受许可协议,选择安装路径,连接内存卡,并完成安装,可能需重启计算机。最后,通过设备管理器验证安装是否成功,如遇问题可查阅相关文档或求助技术支持。
|
6月前
驱动保护 -- 向被保护的内存写数据
驱动保护 -- 向被保护的内存写数据
52 0
驱动保护 -- 向被保护的内存写数据
驱动保护 -- 向被保护的内存写数据
60 0
|
存储 索引 Windows
驱动开发:内核物理内存寻址读写
在某些时候我们需要读写的进程可能存在虚拟内存保护机制,在该机制下用户的`CR3`以及`MDL`读写将直接失效,从而导致无法读取到正确的数据,本章我们将继续研究如何实现物理级别的寻址读写。首先,驱动中的物理页读写是指在驱动中直接读写物理内存页(而不是虚拟内存页)。这种方式的优点是它能够更快地访问内存,因为它避免了虚拟内存管理的开销,通过直接读写物理内存,驱动程序可以绕过虚拟内存的保护机制,获得对系统中内存的更高级别的访问权限。
7066 1
驱动开发:内核解析内存四级页表
当今操作系统普遍采用64位架构,CPU最大寻址能力虽然达到了64位,但其实仅仅只是用到了48位进行寻址,其内存管理采用了`9-9-9-9-12`的分页模式,`9-9-9-9-12`分页表示物理地址拥有四级页表,微软将这四级依次命名为PXE、PPE、PDE、PTE这四项。关于内存管理和分页模式,不同的操作系统和体系结构可能会有略微不同的实现方式。9-9-9-9-12的分页模式是一种常见的分页方案,其中物理地址被分成四级页表:PXE(Page Directory Pointer Table Entry)、PPE(Page Directory Entry)、PDE(Page Table Entry)
10833 0
|
存储
驱动开发:内核读写内存多级偏移
让我们继续在`《内核读写内存浮点数》`的基础之上做一个简单的延申,如何实现多级偏移读写,其实很简单,读写函数无需改变,只是在读写之前提前做好计算工作,以此来得到一个内存偏移值,并通过调用内存写入原函数实现写出数据的目的。以读取偏移内存为例,如下代码同样来源于本人的`LyMemory`读写驱动项目,其中核心函数为`WIN10_ReadDeviationIntMemory()`该函数的主要作用是通过用户传入的基地址与偏移值,动态计算出当前的动态地址。
126 0
驱动开发:内核读写内存浮点数
如前所述,在前几章内容中笔者简单介绍了`内存读写`的基本实现方式,这其中包括了`CR3切换`读写,`MDL映射`读写,`内存拷贝`读写,本章将在如前所述的读写函数进一步封装,并以此来实现驱动读写内存浮点数的目的。内存`浮点数`的读写依赖于`读写内存字节`的实现,因为浮点数本质上也可以看作是一个字节集,对于`单精度浮点数`来说这个字节集列表是4字节,而对于`双精度浮点数`,此列表长度则为8字节。
258 0