当前位置:文档之家› MDL(内存描述符表) 详解

MDL(内存描述符表) 详解

MDL(内存描述符表) 详解
MDL(内存描述符表) 详解

MDL(内存描述符表)详解

分类:初学驱动2013-01-25 18:07 308人阅读评论(0) 收藏举报mdl

以下的虚拟内存可以理解成逻辑内存,因为我觉得只有这样才能讲通下面所有的东西。以下的“未分页”指没有为页进行编码。

以下为MDL结构体(我很郁闷,我在MSDN上没有找到这个结构体)

typedef struct _MDL {

struct _MDL *Next; //下一个MDL

CSHORT Size; //大小

CSHORT MdlFlags; //标志,保护属性等

struct _EPROCESS *Process;//

PVOID MappedSystemVa;

PVOID StartVa;

ULONG ByteCount;

ULONG ByteOffset;

} MDL, *PMDL;

如何使用MDL:

一个连续的虚拟内存地址范围可能是由多个分布(spread over)在不相邻的物理页所组成的。系统使用MDL(内存描述符表)结构体来表明虚拟内存缓冲区的物理页面布局。我们应该避免直接访问MDL。我们可以使用MS-Windows提供的宏,他们提供了对这个结构体基本的访问。

·MmGetMdlVirtualAddress 获取缓冲区的虚拟内存地址

·MmGetMdlByteCount 获取缓冲区的大小(字节数)

·MmGetMdlByteOffset 获取缓冲区开端的物理页的大小(字节数)·MmGetMdlPfnArray 获取记录物理页码的一个数组指针。

我们可以用IoAllocateMdl函数来分配一个MDL。如果要取消分配,可是使用IoFreeMdl 函数。或者,可以使用MmInitializeMdl来把一个之前定义的缓冲区定制成一个MDL。但是以上两种方式都不能初始化物理页码数组。

对于在未分页池中分配的缓冲区,可以用MmBuidlMdlForNonpagedPool函数来初始化页码数组。对于可分页的内存,虚拟内存和物理内存之间的联系是暂时的,所以MDL的页码数组只在特定的环境和时间段有效,因为很可能其他的程序对它们进行重新分配,为了使其

他的程序无法对他们进行修改和重新分配(在我们释放之前),我们就需要把这段内存锁定,防止其他程序修改,我们可以用MmProbeAndLockPages来实现,这个函数同时还为当前的布局初始化了页码数组。当我们用MmUnlockPages来释放被锁定的内存时,页码数组也会随之无效。

假如MDL指定的是映射一块内核级别的虚拟地址空间,那么我们要用MmGetSystemAddressForMdlSafe ,这样我们就能防止映射目标是来自用户模式的空间,而来自用户模式空间的物理页只能在用户模式上下文环境中使用,并且随时可能被清空。用函数进行申明后,就可以防止以上情况发生了。

以下这个函数是用于新创建一个MDL的:参数详解可翻阅MSDN

PMDL IoAllocateMdl(

IN PVOID VirtualAddress,

IN ULONG Length,

IN BOOLEAN SecondaryBuffer,

IN BOOLEAN ChargeQuota,

IN OUT PIRP Irp OPTIONAL

);

最后一个参数是指IRP(输入输出请求包),也就是将新建的这个MDL缓冲区和指定的IRP 关联,为什么要关联?举个例子,比如网络驱动中就应该为每一个发送到本机的IP数据报建立一个临时缓冲区,而最终用户——应用程序要读取这个缓冲区的数据,必须使用IRP

请求驱动程序来完成,所以要提取某个IP数据报,只要发送相关IRP给驱动程序,驱动程序遍历其创建的MDL链找到相应的MDL,然后进行数据提取和发送,请求处理完之后,驱动程序会自动清除这个MDL。一个IRP可以关联多个MDL,就像上面举的例子一样,一个IRP 关联到多个IP数据报(也就是多个MDL)。当应用成语的某个IRP要求一个新的请求(可能是一个新的IP地址的IP数据报)时,驱动程序发现没有MDL与之联,这个时候该IP发送来一个IP数据报,这时驱动程序便建立一个MDL与之关联,如果这是第一个新建的与这个IRP关联的MDL,那么驱动程把该MDL的地址赋值给MdlAddress。如果不是第一个,那么将把新建的MDL放到上一个MDL的下一个单位,形成MDL 链。这就是MDL结构体中的第一个成员的含义所在。

总结:MDL就是描述一块虚拟内存的结构体,里面有个成员记录了多个页码,这些页码即处于各个不同物理地址的物理块的页号。

所以要对一块受系统保护的区域进行写操作的话,可以这样来修改它的保护属性:

1.创建一个MDL,显然里面的物理页号数组没有初始化 IoAllocateMdl

2.初始化页码数组,使之成为实际有效的MDL MmBuildMdlForNonPagedPool

3.进行锁定,并且重新赋值新的保护属性为可读 MmProbeAndLockPages

4.获得我们所映射后的实际内存区域的虚拟地址 MmMapLockedPagesSpecifyCache

网上的很多代码是用于2000和其之前的OS的,很多函数都改了,方式也不一样了,以下代码用于在SSDT表所在的内核区映射一个MDL,并且修改其只读属性为可写的,然后固定这块内存,防止它被其他应用程序修改。

g_pmdlSystemCall =IoAllocateMdl

(KeServiceDescriptorTable.ServiceTableBase,KeServiceDescriptorTable.NumberOfSer vices*4,FALSE,FALSE,NULL);

if(!g_pmdlSystemCall)

return STATUS_UNSUCCESSFUL;

MmBuildMdlForNonPagedPool(g_pmdlSystemCall);//初始化MDL页码数组

//g_pmdlSystemCall->MdlFlags = g_pmdlSystemCall->MdlFlags |

MDL_MAPPED_TO_SYSTEM_VA;// 改变MDL的flags为可读状态

MmProbeAndLockPages(g_pmdlSystemCall,KernelMode,IoWriteAccess);//在内存中锁定,并且指

明对它的改写权力

MappedSSDT=MmMapLockedPagesSpecifyCache( //映射被锁定内存,所谓映射,就是创建原来内存区的一个联合体,你

//修改了这个MDL,就是修改了它所描述的内存区

g_pmdlSystemCall,

KernelMode,

MeNonCached,//是否允许用作CPU缓冲区

FALSE,//当第二个参数为UserMode的时候才有效

NULL,//如果发生错误,直接返回NULL

); //MappedSSDT即映射后的SSDT地址

【注意】最后一个函数其实是大材小用了,只不过2000之后能得到映射缓冲区地址的函数中这个函数是最先进的被支持者,2000用的是MmMapLockedPages;

MC9S12XS128 AD转换详解

A/D转换模块详解 1、A/D转换原理 A/D转换的过程是模拟信号依次通过取样、保持和量化、编码几个过程后转换为数字格式。 a)取样与保持 一般取样与保持过程是同时完成的,取样-保持电路的原理图如图16所示,由输 入放大器A 1、输出放大器A 2 、保持电容C H 和电子开关S组成,要求 A V1 * A V2 = 1。原 理是:当开关S闭合时,电路处于取样阶段,电容器充电,由于 A V1 * A V2 = 1,所以 输出等于输入;当开关S断开时,由于A 2输入阻抗较大而且开关理想,可认为C H 没有 放电回路,输出电压保持不变。 图16 取样-保持电路 取样-保持以均匀间隔对模拟信号进行抽样,并且在每个抽样运算后在足够的时间内保持抽样值恒定,以保证输出值可以被A/D 转换器精确转换。 b)量化与编码 量化的方法,一般有舍尾取整法和四舍五入法,过程是先取顶量化单位Δ,量化单位取值越小,量化误差的绝对值就越小,具体过程在这里就不做介绍了。将量化后的结果用二进制码表示叫做编码。 2、A/D转换器的技术指标 a)分辨率 分辨率说明A/D转换器对输入信号的分辨能力,理论上,n位A/D转换器能区分的输入电压的最小值为满量程的1/2n 。也就是说,在参考电压一定时,输出位数越多,量化单位就越小,分辨率就越高。S12的ATD模块中,若输出设置为8位的话,那么转换器能区分的输入信号最小电压为19.53mV。 b)转换时间

A/D转换器按其工作原理可以分为并联比较型(转换速度快ns级)、逐次逼近型(转换速度适中us级)、双积分型(速度慢抗干扰能力强)。 不同类型的转化的A/D转换器转换时间不尽相同,S12的ATD模块中,8位数字 量转换时间仅有6us,10位数字量转换时间仅有7us。 S12内置了2组10位/8位的A/D模块:ATD0和ATD1,共有16个模拟量输入通道,属于逐次逼近型A/D转换器(这个转换过程与用天平称物的原理相似)。 1、功能结构图 图17 A/D 模块功能结构图 图17所示的是A/D 模块的功能结构,这个功能模块被虚线划分成为图示所示的虚线所隔离的三个部分:IP总线接口、转换模式控制/寄存器列表,自定义模拟量。 IP 总线接口负责该模块与总线的连接,实现A/D 模块和通用I/O 的目的,还起 到分频的作用; 转换模式控制寄存器列表中有控制该模块的所有的寄存器,执行左右对齐运行和连 续扫描。 自定义模拟量负责实现模拟量到数字量的转换。包括了执行一次简单转换所需的模 拟量和数字量。 2、HCS12中A/D转化模块特点 8/10 位精度;7 us, 10-位单次转换时间.;采样缓冲放大器;可编程采样时间;左/ 右对齐, 有符号/无符号结果数据;外部触发控制;转换完成中断;模拟输入8 通道复用;模拟/数字输入引脚复用;1到8转换序列长度;连续转换模式;多通道扫描方式。 ATD 模块有模拟量前端、模拟量转换、控制部分及结果存储等四部分组成。其中模拟前端包括多路转换开关、采样缓冲器、放大器等,结果存储部分主要有8个16 位的存储器和反映工作状态的若干标志位。 A/D转换应用实例 要让ATD 开始转换工作,必须经过以下三个步骤: 1.将ADPU 置1,使ATD 启动;

HID 报告描述符终极解析

USB HID Report终极解析 HID的报告描述符巨难懂,关键是数据格式与每一位代表的意思。经过三天的研究,终于将HID Report的每一个数据位的含义弄清楚了,现将数据解析如下,最后附上了一个HID 通信的Report例子。以一个键盘的HID Report为例: 键盘的HID报告描述符: code char KeyBoardReportDescriptor[63] = { 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x06, // USAGE (Keyboard) 0xa1, 0x01, // COLLECTION (Application) 0x05, 0x07, // USAGE_PAGE (Keyboard) 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x08, // REPORT_COUNT (8) 0x81, 0x02, // INPUT (Data,V ar,Abs) 0x95, 0x01, // REPORT_COUNT (1) 0x75, 0x08, // REPORT_SIZE (8) 0x81, 0x03, // INPUT (Cnst,V ar,Abs) 0x95, 0x05, // REPORT_COUNT (5) 0x75, 0x01, // REPORT_SIZE (1) 0x05, 0x08, // USAGE_PAGE (LEDs) 0x19, 0x01, // USAGE_MINIMUM (Num Lock) 0x29, 0x05, // USAGE_MAXIMUM (Kana) 0x91, 0x02, // OUTPUT (Data,V ar,Abs) 0x95, 0x01, // REPORT_COUNT (1) 0x75, 0x03, // REPORT_SIZE (3) 0x91, 0x03, // OUTPUT (Cnst,V ar,Abs) 0x95, 0x06, // REPORT_COUNT (6) 0x75, 0x08, // REPORT_SIZE (8) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0xFF, // LOGICAL_MAXIMUM (255) 0x05, 0x07, // USAGE_PAGE (Keyboard) 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) 0x81, 0x00, // INPUT (Data,Ary,Abs)

服务器内存条的插法

DELL PowerEdge R710服务器支持DDR3 的DIMM (RDIMM) 或ECC 非缓冲的DIMM(UDIMM)。单列和双列DIMM 可以是1067 MHz 或1333 MHz,四列DIMM 可以是1067 MHz。 DELL PowerEdge R710服务器含18 个内存插槽,分为两组,每组九个插槽,分别用于一个处理器。每组插槽(9 个)分为三个通道,每个通道有三个内存插槽。每个通道的第一个插槽上都标有白色释放拉杆。 DELL PowerEdge R710服务器支持的最大内存取决于所用的内存模块类型和大小: ? 对于大小为2-GB、4-GB 和8-GB (如果有)的单列和双列RDIMM,支持的总量最大为144 GB。 ? 对于四列RDIMM (每个通道两个),支持的总量最大为96 GB。 ? 对于1 GB 和2 GB 的UDIMM,支持的最大总容量为24 GB。 内存一般安装原则 为确保获得最佳系统性能,请在配置系统内存时遵守以下通用原则: 注:未遵循这些原则的内存配置会导致系统在启动时停机,并且无任何系统消息的视频输出。 ? 不能混合安装RDIMM 和UDIMM。 ? 每个通道不得安装两个以上UDIMM。 ? 除了未使用的内存通道之外,所有被占用的内存通道的配置必须相同。 ? 在双处理器配置中,每个处理器的内存必须配置相同。 ? 大小不同的内存模块可以在一个内存通道中混用(如2-GB、8-GB 和4-GB),但所有被占用的通道的配置必须相同。 ? 对于优化器式,内存模块按照插槽的数字顺序安装,以A1 或B1开始。 ? 对于内存镜像模式或高级ECC 模式,离处理器最远的三个插槽不使用,内存模块首先从插槽A2 或B2 开始安装,然后按剩下插槽的数字顺序安装(如A2、A3、A5、A6、A8 和A9)。 ? 高级ECC 模式需要x4 或x8 DRAM 设备宽度。

《8259中断控制器实验》的实验报告

实验六8259中断控制器实验 6.1 实验目的 (1) 学习中断控制器8259的工作原理。 (2) 掌握可编程控制器8259的应用编程方法。 6.2 实验设备 PC微机一台、TD-PIT+实验系统一套。 6.3 实验内容 1. 单中断应用实验 (1)编写中断处理程序,利用PC机给实验系统分配的中断线,使用单次脉冲单元的KK1+按键模拟中断源,每次PC机响应中断请求,在显示器上显示一个字符。 (2)编写中断处理程序,利用PC机给实验系统分配的中断线,使用单次脉冲单元的KK1+按键模拟中断源,每次PC机响应中断请求,在显示器上显示“Hello”,中断5次后退出。 2.扩展多中断源实验 利用实验平台上8259控制器对扩展系统总线上的中断线INTR进行扩展。编写程序对8259控制器的IR0和IR1中断请求进行处理。 6.4 实验原理 1. 8259控制器的介绍 中断控制器8259A是Intel公司专为控制优先级中断而设计开发的芯片。它将中断源优先级排队、辨别中断源以及提供中断矢量的电路集于一片中,因此无需附加任何电路,只需对8259A进行编程,就可以管理8级中断,并选择优先模式和中断请求方式,即中断结构可以由用户编程来设定。同时,在不需增加其他电路的情况下,通过多片8259A的级连,能构成多达64级的矢量中断系统。它的管理功能包括:1)记录各级中断源请求,2)判别优先级,确定是否响应和响应哪一级中断,3)响应中断时,向CPU传送中断类型号。8259A的内部结构和引脚如图6-1所示。 8259A的命令共有7个,一类是初始化命令字,另一类是操作命令。8259A的编程就是根据应用需要将初始化命令字ICW1-ICW4和操作命令字OCW1-OCW3分别写入初始化命令寄存器组和操作命令寄存器组。ICW1-ICW4各命令字格式如图6-2所示,

MDL(内存描述符表) 详解

MDL(内存描述符表)详解 分类:初学驱动2013-01-25 18:07 308人阅读评论(0) 收藏举报mdl 以下的虚拟内存可以理解成逻辑内存,因为我觉得只有这样才能讲通下面所有的东西。以下的“未分页”指没有为页进行编码。 以下为MDL结构体(我很郁闷,我在MSDN上没有找到这个结构体) typedef struct _MDL { struct _MDL *Next; //下一个MDL CSHORT Size; //大小 CSHORT MdlFlags; //标志,保护属性等 struct _EPROCESS *Process;// PVOID MappedSystemVa; PVOID StartVa; ULONG ByteCount; ULONG ByteOffset; } MDL, *PMDL; 如何使用MDL: 一个连续的虚拟内存地址范围可能是由多个分布(spread over)在不相邻的物理页所组成的。系统使用MDL(内存描述符表)结构体来表明虚拟内存缓冲区的物理页面布局。我们应该避免直接访问MDL。我们可以使用MS-Windows提供的宏,他们提供了对这个结构体基本的访问。 ·MmGetMdlVirtualAddress 获取缓冲区的虚拟内存地址 ·MmGetMdlByteCount 获取缓冲区的大小(字节数) ·MmGetMdlByteOffset 获取缓冲区开端的物理页的大小(字节数)·MmGetMdlPfnArray 获取记录物理页码的一个数组指针。 我们可以用IoAllocateMdl函数来分配一个MDL。如果要取消分配,可是使用IoFreeMdl 函数。或者,可以使用MmInitializeMdl来把一个之前定义的缓冲区定制成一个MDL。但是以上两种方式都不能初始化物理页码数组。 对于在未分页池中分配的缓冲区,可以用MmBuidlMdlForNonpagedPool函数来初始化页码数组。对于可分页的内存,虚拟内存和物理内存之间的联系是暂时的,所以MDL的页码数组只在特定的环境和时间段有效,因为很可能其他的程序对它们进行重新分配,为了使其

DL380_G6_内存的插法详解

138211130@https://www.doczj.com/doc/0112650772.html, 信息 Intel xeon 5500系列处理器集成3个内存控制器,每个控制器控制一个通道,组成3通道内存,对内存的插法也有很多种情况,根据不同的插法可以达到性能和安全不同的效果,本文主要介绍HP ProLiant DL380G6 服务器内存的插法。 详细信息 内存槽位描述 如下图 内存选件 注 : 服务器不支持RDIMM 和UDIMM混插。如混插会导致服务器在BIOS初始化时停机。

服务器的内存子系统同时支持RDIMM 和UDIMM两种类型。如果提到DIMM时下面的信息适用于这两种类型。当特指RDIMM或UDIMM时,提到的信息只使用于那种类型。安装在服务器中的内存必须同种型号。 服务器支持下面的内存速率: 1. 单-rank和双-rank PC3-10600(DDR-1333) 内存运行在1333和1066MHz 2. 4- rank PC3-8500(DDR-1067)运行在1066MHz 根据处理器类型,安装的内存数量和安装的是UDIMM或者RDIMM,内存时钟速率可能会降低到1066或800MHz。更多的安装内存槽位影响信息,查看下面信息。 内存子系统架构 服务器的内存子系统划分为channels.每个处理器支持3个channel.每个channel支持3个内存。请看下面的表格 在Advanced ECC 模式中这种多channel 的架构提供了增强的性能。这种架构在 Mirrored 和 Lockstep 内存模式中同样适用。服务器支持RDIMM 和UDIMM。 通用内存安装准则 在所有的AMP模式中遵守下面的准则: 1.只有安装处理器对应的内存槽可以安装内存。 2.在多处理配置的机型中,为达到最大化性能的目的,尽可能均匀地分配所有处理器对应的内存总 容量。 3.不要混插UDIMM和RDIMM。 4.每个channel 最多支持两个UDIMM。 5.如果一个处理器安装了4-rank的内存,那么那个处理器的每个channel最多只能安装2条内存。 6.如果一个channel 包含4-rank的内存,那么4-rank的内存必须首先被安装在这个channel上。内存频率请看下图

微机接口实验报告-8259中断控制器应用实验

姓名 院专业班 年月日实验内容8259中断控制器实验指导老师 【实验目的】 (1)学习中断控制器8259的工作原理。 (2)掌握可编程控制器8259的应用编程方法。 【试验设备】 PC微机一台、TD-PIT+实验系统一套。 【实验内容】 (1) 编写中断处理程序,利用PC机给实验系统分配的中断线,使用单次脉冲单元的KK1+按键模拟中断源,每次PC机响应中断请求,在显示器上显示一个字符。 (2) 编写中断处理程序,利用PC机给实验系统分配的中断线,使用单次脉冲单元的KK1+按键模拟中断源,每次PC机响应中断请求,在显示器上显示“9”,中断显示6次后退出。 【实验原理】 1. 8259控制器的介绍 中断控制器8259A是Intel公司专为控制优先级中断而设计开发的芯片。它将中断源优先级排队、辨别中断源以及提供中断矢量的电路集于一片中,因此无需附加任何电路,只需对8259A进行编程,就可以管理8级中断,并选择优先模式和中断请求方式,即中断结构可以由用户编程来设定。同时,在不需增加其他电路的情况下,通过多片8259A的级连,能构成多达64级的矢量中断系统。它的管理功能包括:1)记录各级中断源请求,2)判别优先级,确定是否响应和响应哪一级中断,3)响应中断时,向CPU传送中断类型号。8259A的内部结构和引脚如图6-1所示。 8259A的命令共有7个,一类是初始化命令字,另一类是操作命令。8259A的编程就是根据应用需要将初始化命令字ICW1-ICW4和操作命令字OCW1- OCW3分别写入初始化命令寄存器组和操作命令寄存器组。ICW1-ICW4各命令字格式如图6-2所示,OCW1-OCW3各命令字格式如图6-3所示,其中OCW1用于设置中断屏蔽操作字,OCW2用于设置优先级循环方式和中断结束方式的操作命令字,OCW3用于设置和撤销特殊屏蔽方式、设置中断查询方式以及设置对8259内部寄存器的读出命令。 图6-1 8259内部结构和引脚图

USB HID设备报告描述符详解

USB HID设备报告描述符详解 概述: 报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输的数据作用途(usage)上的说明。 USB通讯协议的规范是以1ms产生一个USB帧(frame),USB设备可以每一个帧中发送和接收一个交换(transaction)。交换是由几个封包(packet)组成,而传输是由一个或几个交换来完成传送一口中有效的数据。在这里,传输和报告的意思相类似。传输方式有四种,初始学一般只要了解控制型传输(control transfer)和中断型传输(interrupt transfer)即可。控制型传输是当需要时才执行传输要求,是最一般的传输方式,组态、命令和状态的通讯都可以使用控制型传输;控制型传输主要用于消息型数据(message-type data)。中断型传输目的在做重复的数据更新(recurring data)传输,精确一点而言,即是在每个有限有周期内(bounded period)作至少一次的小量数据发送或接收;所以适用于流动型数据(stream-type data),注意这里所谓的周期时间就是在端点描述符中的轮询间隔时间。报告有三种:input,output,和Feature.后面将作进一步介绍。中断型输入管线(interrupt in pipe)仅可以传送input报告;中断型输出管线(interrupt out pipe)仅可以传送output报告;但是控制型管线(control pipe)可以传送input,out put和feature报告。端点描述符有声明所使用的端点为何种管线。 数据本身没有任何意义,要赋于用途才能明确其为控制什么(control);例如设备上的按钮指示灯和X与Y轴的位移等都通称控制,数据则为按钮和指示灯的开关状态或X与Y轴的位移量。为了这个目的应运而生报告描述符,其将数据的操控与它的用途作一对一的对应,所以解读报告后就可以知道每个数据作何种操作。所以“传输的数据”和“操作”只是一事件的两种描述方式。用途是以一个32位卷标(称作usage tag)来表示,高16位称作usage page(用途类页),低16位称为usage DI(用途识别名): Usage = (usage page:usage ID) 举例说明:二个字节分别为x和y轴的位移数据,因此第一个字节的usage =(generic desktop:X),而第二个字节的usage = (generic desktop:Y),其中gen

8259中断控制实验

本科实验报告 课程名称:接口实验 姓名: 学院: 系: 专业: 学号: 指导教师: 2015年12 月26 日

浙江大学实验报告 课程名称:接口实验实验类型:普通实验 实验项目名称:8259中断控制实验 学生姓名:专业:学号: 同组学生姓名:指导老师: 实验地点:实验日期:2015年12月22日 一、实验目的和要求: 1.掌握中断的工作原理及编程方式,掌握8259中断控制器工作原理,了解中断控制芯片的初始化及工作方式的设定,熟悉实验中涉及到的各寄存器的使用方法,学会中断程序的编写。 2.学会中断控制器8259接口电路的应用和中断服务程序的编写。 3.了解PCI总线目标接口适配器PCI9052的使用,学会其中断及状态的控制。 二、实验内容和原理 8259中断控制电路: 在PC机中,主板上的两片8259可编程中断控制芯片以主从结构为系统提供了15级中断(每片8级,其中一级作为级联)。从片的中断请求信号INT 与主片的IRQ2相连。其中给用户保留的中断号有IRQ10、IRQ11、IRQ12、和IRQ15,这些中断级都设置在从片上。 主片:IRQ0——T/C0 IRQ1——键盘中断 IRQ2——8259从片 IRQ3——串口2 IRQ4——串口1 IRQ5——并行口2 IRQ6——软盘控制器 IRQ7——并行口1

从片:IRQ8——实时时钟中断 IRQ9——RE —DTNECT IRQA ——保留 IRQB ——保留 IRQC ——保留 IRQD ——协处理器 IRQE ——硬盘控制器 IRQF ——保留 70H 73H 77H 76H 75H 74H 72H 71H PC 机中8259中断管理设有相应的矢量地址,主片的IRQ0—IRQ7对应为08H —0FH ,从片的IRQ8—IRQ15对应为70H —77H 。主片的中断控制寄存器ISR 和中断屏蔽寄存器IMR 的端口地址分别为20H 和21H ,从片的中断控制寄存器ISR 和中断屏蔽寄存器IMR 的端口地址分别为0A0H 和0A1H 。 中断初始化编程时,若使用主片中的中断级,只需打开主片屏蔽寄存器的相应屏蔽级,并在中断处理完毕后发中断结束命令EOI ;而使用从片中的中断级,除对从片相应的级作出处理,还需打开主片IRQ2相应的屏蔽寄存器位,并在中断处理完毕后对主片和从片都要发中断结束命令EOI 。 9052的中断控制寄存器: 偏移地址为4CH 的32位寄存器。其中高19位为保留位,低13位可根据需要进行8位、16位操作。实验仪上的中断源信号必须通过9052控制器

飞思卡尔MC9S12XS128技术手册翻译AD

飞思卡尔MC9S12XS128技术手册(AD转换部分) 英文资料:飞思卡尔MC9S12XS256RMV1官方技术手册 1.1 XS12系列单片机的特点 XS12系列单片机特点如下: ·16位S12CPU —向上支持S12模糊指令集并去除了其中的MEM, WAV, WAVR, REV, REVW 五条指令; —模块映射地址机制(MMC); —背景调试模块(BDM); ·CRG时钟和复位发生器 —COP看门狗; —实时中断; ·标准定时器模块 —8个16位输入捕捉或输出比较通道;; —16位计数器,8位精密与分频功能; —1个16位脉冲累加器; ·周期中断定时器PIT —4具有独立溢出定时的定时器; —溢出定时可选范围在1到2^24总线时钟; —溢出中断和外部触发器; ·多达8个的8位或4个16位PWM通道 —每个通道的周期和占空比有程序决定; —输出方式可以选择左对齐或中心对其; —可编程时钟选择逻辑,且可选频率范围很宽; ·SPI通信模块 —可选择8位或16位数据宽度;

—全双工或半双工通信方式; —收发双向缓冲; —主机或从机模式; —可选择最高有效为先输出或者最低有效位先输出; ·两个SCI串行通信接口 —全双工或半双工模式 ·输入输出端口 —多达91个通用I/O引脚,根据封装方式,有些引脚未被引出; —两个单输入引脚; ·封装形式 —112引脚薄型四边引线扁平封装(LQFP); —80引脚扁平封装(QFP); —64引脚LQFP封装; ·工作条件 —全功率模式下单电源供电范围3.15V到5V; —CPU总线频率最大为40MHz —工作温度范围–40 C到125 C 第十章模拟—数字转换 10.1 介绍 ADC12B16C是一个16通道,12位,复用方式输入逐次逼近模拟—数字转换器。 ATD的精度由电器规格决定。 10.1.1 特点 ·可设置8位、10位、12位精度 ·在停止模式下,ATD转换使用内部时钟 ·转换序列结束后自动进入低耗电模式 ·可编程采样时间 ·转化结果可选择左对齐或右对齐

USB HID报告描述符详解

USB 之人性化接口装置的报告描述元(1) 作者: 林锡宽 e-mail: sklin@https://www.doczj.com/doc/0112650772.html,.tw (原文刊于e 科技杂志vol. 30,2003 年6 月号) 关于USB 的标准描述元已经在 e 科技杂志的第24 和25 期中作了完整的介绍。有些读者来函希望能早日刊出报告描述元的介绍。人性化接口装置HID 的类别 特定描述元有三种,其中HID 描述元因为需要连接在接口描述元(标准描述元 之一)之后,所以也已经在前文介绍了。其他二个HID 类别特定描述元为报告 描述元和实体描述元。实体描述元几乎很少使用到,所以不拟介绍,虽然它不会 很复杂。本文仅专注介绍报告描述元。相对来说,报告描述元最复杂,也不容易 理解,可是却最重要,因为HID 装置与主机间的经常性数据传输都由报告描述 元来规范。因为报告描述元的复杂和难理解,使得此文的编撰花了不少时间,因 此无法在上次刊完USB 标准描述元后,接着刊出。 由于内容篇幅颇长,所以仅能分为三篇陆续刊出。本期的第一篇中仅介绍到区域 性项目,下期的第二篇再继续介绍全局性项目和主项目。这三类项目构成一个报 告描述元。最后仍需要以一个实际的范例来解说使用方法,所以第三篇文章将提 供一个实际的范例:整合鼠标的键盘装置。此外,也会将该范例的韧体程序代码提 供给有兴趣的读者。这个韧体程序代码不只是该范例的报告描述元,也含括了它的 标准描述元。 概述 报告(report)在这里意指数据传输(data transfer),而报告描述元则是对这些传输的 数据作用途(usage)的说明。 USB 通讯协议的规范是以1 毫秒产生一个USB 讯框(frame),USB 装置可以在每 一个讯框中传送和接收一个交易(transaction)。交易是由数个封包(packet)组成, 而传输是由一或数个交易来完成传递一串有意义的数据。在这里,传输和报告的 意义大同小异。传输方式有四种,初学者只要了解控制型传输(control transfer) 和中断型传输(interrupt transfer)即可。控制型传输是当需要时才执行传输要求, 是最一般的传输,组态、命令和状态的通讯都可以使用,主要用于讯息型数据(message-type data)。中断型传输目的在做重复的数据更新(recurring data)传输, 精确一点而言,即是在每个有限的周期内(bounded period)作至少一次的小量数据 传送或接收﹔所以适用于流动型数据(stream-type data),注意这里所谓的周期时

实验二:8259 中断控制器实验

实验二 8259A中断控制器实验 1、编制程序:拨动单脉冲开关,“”送给8259A的IR0,触发中断, 8088计数中断次数,显示于G5区的数码管上 2、运行程序 3、上下拨动单脉冲开关,拨动二次,产生一个“”,观察结果, 数码管上显示的次数与拨动开关次数是否对应。 .MODEL TINY EXTRN DISPLAY8:NEAR IO8259_0 EQU 0F000H IO8259_1 EQU 0F001H .STACK 100 .DATA BUFFER DB 8 DUP(?) COUNTER DB ? REDISPLAYFLAG DB 0 .CODE START: MOV AX,@DATA MOV DS,AX MOV ES,AX NOP CALL INIT8259 CALL WRIINTVER MOV COUNTER,0 MOV REDISPLAYFLAG,1 STI ;?a?D?? START1: CMP REDISPLAYFLAG,0 JZ START1 CALL LEDDISPLAY MOV REDISPLAYFLAG,0 JMP S TART1 INIT8259 PROC NEAR MOV DX,IO8259_0 MOV AL,13H OUT DX,AL MOV DX,IO8259_1 MOV AL,08H OUT DX,AL MOV AL,09H OUT DX,AL MOV AL,0FEH OUT DX,AL

RET INIT8259 ENDP WRIINTVER PROC NEAR PUSH ES MOV AX,0 MOV ES,AX MOV DI,20H LEA AX,INT_0 STOSW MOV AX,CS STOSW POP E S RET WRIINTVER ENDP LEDDISPLAY PROC NEAR MOV AL,COUNTER MOV AH,AL AND AL,0FH MOV BUFFER,AL AND AH,0F0H ROR A H,4 MOV BUFFER + 1,AH MOV BUFFER + 2,10H ;??áù??2?Dèòa??ê? MOV BUFFER + 3,10H MOV BUFFER + 4,10H MOV BUFFER + 5,10H MOV BUFFER + 6,10H MOV BUFFER + 7,10H LEA SI,BUFFER CALL DISPLAY8 RET LEDDISPLAY ENDP INT_0: PUSH DX PUSH AX MOV AL,COUNTER ADD AL,1 DAA MOV COUNTER,AL MOV REDISPLAYFLAG,1 MOV DX,IO8259_0 MOV AL,20H

USB的描述符详解总结

USB的描述符与命令请求详解 一、描述符 1.什么是描述符 所谓描述符,就是用于描述设备特性的具有特定格式排列的一种数据组织结构。 2.描述符的作用 描述符的作用在于设备向主机汇报自己的信息、特征,主机根据这些信息从而加载相应的驱动程序。 3.描述符的分类 描述符分为三大类:标准描述符、设备类描述符、厂商描述符。 除字符串描述符可选外,任何设备都必须包含剩下的几种标准描述符。 在USB1.0中规定了5种标准的描述符: 设备描述符 配置描述符 接口描述符 端点描述符 字符串描述符 规定的设备类描述符有:集线器类描述符、人机接口类描述符。 下表是三种描述符的类型值: 4.使用的几种类 设备类DeviceClass 下表是设备类值的含义。

接口类InterfaceClass 下表是接口类值的含义。 类的交叉与独享 在描述符中,只有设备描述符和接口描述符中会有类别之分,即只有设备和接口会分 类使用,不过有些类别的使用只需经过设备或接口的区分就可彻底清楚明白,这说明在设备类别和接口类别的定义上会有共同的类别名称。而有些类别则是设备或接口独享的,下表是与使用设备相关的类别划分交叉或共享情况:

(此表也适用于标准命令Get_Descriptor中wValue域高字节的取值含义) 【说明:】在设备或接口分类上均可彻底分清使用的(Usage = Both),即在任一处描述符中定义即可的分清楚使用的类(Usage = Both)的基本类有: 02h ------------- 通信及CDC控制类; DCh ------------ 诊断设备类; EFh ------------- 混杂设备类; FFh ------------- 厂商定义的设备类。 5.标准描述符 设备描述符

8259A中断实验

实验8259单级中断控制器实验 一、实验目的 ⒈掌握8259中断控制器的接口方法。⒉ 掌握8259中断控制器的应用编程。 二、实验内容 利用8259实现对外部中断的响应和处理,要求程序对每次中断进行计数,并将计数结果送数码显示。 三、实验接线图 图6-6 四、编程指南 ⑴8259芯片介绍 中断控制器8259A是专为控制优先级中断而设计的芯片。它将中断源优先级排队、辨别中断源以及提供中断矢量的电路集于一片中。因此无需附加任何电路,只需对8259A进行编程,就可以管理8级中断,并选择优先模式和中断请求方式。即中断结构可以由用户编程来设定。同时,在不需要增加其它电路的情况下,通过多片8259A的级联,能构成多达64级的矢量中断系统。

⑵本实验中使用3号中断源IR3,“”插孔和IR3相连,中断方式 为边沿触发方式,每拨二次AN开关产生一次中断,满5次中断,显示“8259——good”。如果中断源电平信号不符合规定要求,则自动转到7号中断,显示“Err”。 五、实验程序框图 IR3中断服务程序: IR7中断服务程序: 六、实验步骤 1、按图6-6连好实验线路图。

⑴8259的INT连8088的INTR;⑵8259的INTA连8088的INTA;⑶“” 插孔和8259的3号中断IR3插孔相连,“”端初始为低电平;⑷8259的CS端接FF80H孔。 2、运行实验程序,在系统处于命令提示符“P.”状态下,按SCAL键,输入12D0,按EXEC键,系统显示8259-1。 3、拨动AN开关按钮,按满l0次显示good。 七、实验程序清单 CODE SEGMENT ;H8259.ASM ASSUME CS: CODE INTPORT1 EQU 0FF80H INTPORT2 EQU 0FF81H INTQ3 EQU INTREEUP3 INTQ7 EQU INTREEUP7 PA EQU 0FF20H ;字位口 PB EQU 0FF21H ;字形口 PC EQU 0FF22H ;键入口 ORG 12D0H START: JMP START0 BUF DB ?,?,?,?,?,? intcnt db ? data1: db0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h, 0c6h,0a1h db 86h,8eh,0ffh,0ch,89h,0deh,0c7h,8ch,0f3h,0bfh,8FH START0: CLD ;递加 CALL BUF1 ;写显示缓冲初值 CALL WRINTVER ;写中断向量 MOV AL,13H ;写ICW1 MOV DX,INTPORT1 OUT DX,AL MOV AL,08H ;写ICW2 MOV DX,INTPORT2 OUT DX,AL MOV AL,09H ;写ICW4 OUT DX,AL MOV AL,0F7H ;写OCW1 OUT DX,AL MOV intcnt,01H ;中断计数初值 STI ;开中断 WATING: CALL DISP ;DISP 8259-1

MC9S12XS128终极例程

SCI程序 串行通信时MCU与外部设备之间进行通信的一种简单而有效的硬件方法。 无论用查询方式还是中断方式进行串行通信编程,在程序初始化时均必须对SCI进行初始化。初始化主要包括波特率设置、通信格式的设置、发送接收数据方式的设置等。 对SCI进行初始化,需要设置如下几部分: (1)定义波特率 一般选内部总线时钟为串行通信的时钟源。通过设置SCI波特率寄存器SCI0BD的波特率选择位SBR[12:0],来选择合适的分频系数。 (2)写控制字到SCI控制寄存器1(SCI0CR1) 设置是否允许SCI、数据长度、输出格式、选择唤醒方法、是否校验等。 (3)写控制字到SCI控制寄存器2(SCI0CR2) 设置是否允许发送与接收、是中断接收还是查询接收等。 串行通信程序如下: /** write in “Init.h” **/ #include /* common defines and macros */ #include "derivative.h" /* derivative-specific definitions */ //void InitBusClk(void); //可以不使用锁相环 void InitSci(void); /** write in “Init.c” **/ //初始化程序 #include "Init.h" /* //------------初始化Bus Clock------------// void InitBusClk(void) { DisableInterrupts; CLKSEL=0X00; //PLLSEL 1 : Bus Clock=PLLCLK/2 // 0 : Bus Clock=OSCCLK/2 PLLCTL_PLLON=1; //开启PLL SYNR=0; //OSCCLK=16MHz REFDV=0X0F; //PLLCLK=2*OSCCLK*[(1+SYNR)/(1+REFDV]=32/16=2MHz while(!(CRGFLG_LOCK==1)); //直到LOCK=1,when PLL is ready,退出循环 CLKSEL_PLLSEL=1; //PLLSEL 1 : Bus Clock=PLLCLK/2=2MHz/2=1MHz // 0 : Bus Clock=OSCCLK/2=16M/2=8MHz } */

USB_HID设备报告描述符详解

概述 报告在这里意思是数据传输(data transfer),而报告描述符是对这些传输的数据作用途(usage)上的说明。USB通讯协议的规范是以1ms产生一个USB 帧(frame),USB设备可以每一个帧中发送和接收一个交换(transaction)。交换是由几个封包(packet)组成,而传输是由一个或几个交换来完成传送一口中有效的数据。在这里,传输和报告的意思相类似。传输方式有四种,初始学一般只要了解控制型传输(control transfer)和中断型传输(interrupt transfer)即可。控制型传输是当需要时才执行传输要求,是最一般的传输方式,组态、命令和状态的通讯都可以使用控制型传输;控制型传输主要用于消息型数据(message-type data)。中断型传输目的在做重复的数据更新(recurring data)传输,精确一点而言,即是在每个有限有周期内(bounded period)作至少一次的小量数据发送或接收;所以适用于流动型数据(stream-type data),注意这里所谓的周期时间就是在端点描述符中的轮询间隔时间。报告有三种: input,output,和Feature.后面将作进一步介绍。中断型输入管线(interrupt in pipe)仅可以传送input报告;中断型输出管线(interrupt out pipe)仅可以传送output报告;但是控制型管线(control pipe)可以传送input,output和feature报告。端点描述符有声明所使用的端点为何种管线。 数据本身没有任何意义,要赋于用途才能明确其为控制什么(control);例如设备上的按钮指示灯和X与Y轴的位移等都通称控制,数据则为按钮和指示灯的开关状态或X与Y轴的位移量。为了这个目的应运而生报告描述符,其将数据的操控与它的用途作一对一的对应,所以解读报告后就可以知道每个数据作何种操作。所以“传输的数据”和“操作”只是一事件的两种描述方式。用途是以一个32位卷标(称作usage tag)来表示,高16位称作usage page(用途类页),低16位称为usage DI(用途识别名): Usage=(usage page:usage ID) 主项目全域项目区域项目 标签代码标签代码标签代码Input0X8?Usage Page0x0?Usage0x0? 0x1? Output0x9?Logical Minimum0x1?Usage Minimum 0x2? Feature0xb?Logical Maximum0x2?Usage Maximum Physical Minimum0x3?Designator0x3?

8259中断实验

XX学院 实验报告 实验名称 姓名 学号 班级 教师 日期

一、实验内容与要求 1.1 实验内容 本次实验分为如下3个子实验: (1)单中断请求实验:利用系统总线上中断请求信号MIR7,设计一个单一中断请求实验; (2)双中断优先级实验:利用系统总线上中断请求信号MIR6和MIR7,设计一个双中断优 先级应用实验,观察8253对中断优先级的控制; (3)级联中断实验:利用系统总线上中断请求信号MIR7和SIR1,设计一个级联中断应用 实验。 1.2 实验要求 本次实验中三个子实验的实验要求如下: (1)单中断请求实验:单脉冲KK1+与主片8259的IR7相连。每按KK1+,进入一次中断, 输出7; (2)双中断优先级实验:单脉冲KK1+连主片8259的IR7,KK2+连其IR6。每当KK1+按 下时显示“7”,每当KK2+按下显示“6”; (3)级联中断实验:单脉冲KK1+连主片8259的IR7,KK2+连从片的IR1。每当KK1+按 下时显示“M7”,每当KK2+按下显示“S1”。 二、实验原理与硬件连线 2.1 实验原理 (1)中断控制器8259简介 在Intel 386EX芯片中集成有中断控制单元(ICU),该单元包含有两个级联中断控制器,一个为主控制器,一个为从控制器。该中断控制单元就功能而言与工业上标准的82C59A是一致的,操作方法也相同。从片的INT连接到主片的IR2信号上构成两片8259的级联。 在TD-PITE实验系统中,将主控制器的IR6、IR7以及从控制器的IR1开放出来供实验使用,主片8259的IR4供系统串口使用。8259的内部连接及外部管脚引出如图1-1:

socket原理详解

socket原理详解 1、什么是socket 我们知道进程通信的方法有管道、命名管道、信号、消息队列、共享内存、信号量,这些方法都要求通信的两个进程位于同一个主机。但是如果通信双方不在同一个主机又该如何进行通信呢?在计算机网络中我们就学过了tcp/ip协议族,其实使用tcp/ip协议族就能达到我们想要的效果,如下图(图片来源于《tcp/ip协议详解卷一》第一章1.3) 、 图一各协议所处层次 当然,这样做固然是可以的,但是,当我们使用不同的协议进行通信时就得使用不同的接口,还得处理不同协议的各种细节,这就增加了开发的难度,软件也不易于扩展。于是UNIX BSD就发明了socket这种东西,socket屏蔽了各个协议的通信细节,使得程序员无需关注协议本身,直接使用socket提供的接口来进行互联的不同主机间的进程的通信。这就好比操作系统给我们提供了使用底层硬件功能的系统调用,通过系统调用我们可以方便的使用磁盘(文件操作),使用内存,而无需自己去进行磁盘读写,内存管理。socket其实也是一样的东西,就是提供了tcp/ip

协议的抽象,对外提供了一套接口,同过这个接口就可以统一、方便的使用tcp/ip协议的功能了。百说不如一图,看下面这个图就能明白了。 图二 socket所处层次 那么,在BSD UNIX又是如何实现这层抽象的呢?我们知道unix中万物皆文件,没错,bsd在实现上把socket设计成一种文件,然后通过虚拟文件系统的操作接口就可以访问socket,而访问socket时会调用相应的驱动程序,从而也就是使用底层协议进行通信。(vsf也就是unix提供给我们的面向对象编程,如果底层设备是磁盘,就对磁盘读写,如果底层设备是socket就使用底层协议在网中进行通信,而对外的接口都是一致的)。下面再看一下socket的结构是怎样的(图片来源于《tcp/ip协议详解卷二》章节一,1.8描述符),注意:这里的socket是一个实例化之后的socket,也就是说是一个具体的通信过程中的socket,不是指抽象的socket结构,下文还会进行解释。

相关主题
文本预览
相关文档 最新文档