发明名称 基于PIO和DMA混合的网络接口卡描述符提交方法
摘要 本发明公开了一种基于PIO和DMA混合的网络接口卡描述符提交方法,实施步骤如下:1)在网络接口卡中建立硬件发送队列,在主存建立主存发送队列;2)初始化描述符;3)用户进程以PIO方式直接访问网络接口卡将描述符写入硬件发送队列,或者将描述符提交主存发送队列,而把门铃数据写入硬件发送队列;网络接口卡顺序处理硬件发送队列的数据时,判断当前数据类型,如果是描述符,根据长度域的值从硬件发送队列读回处理;如果是门铃数据,就启动DMA从主存发送队列中取回再进行处理,并且网络接口卡执行DMA读下一个描述符的过程与处理当前描述符的过程重叠进行。本发明具有消息启动延迟小、发送队列容量大、数据处理简单高效的优点。
申请公布号 CN103150278B 申请公布日期 2014.03.05
申请号 CN201310069161.1 申请日期 2013.03.05
申请人 中国人民解放军国防科学技术大学 发明人 徐炜遐;刘路;王永庆;沈胜宇;曹继军;张鹤颖;张磊;肖灿文;庞征斌;王克非;伍楠;戴艺;高蕾
分类号 G06F13/28(2006.01)I;H04L12/863(2013.01)I 主分类号 G06F13/28(2006.01)I
代理机构 湖南兆弘专利事务所 43008 代理人 赵洪;谭武艺
主权项 一种基于PIO和DMA混合的网络接口卡描述符提交方法,其特征在于实施步骤如下:1)在网络接口卡中建立用于存储以PIO方式写入的描述符和门铃数据的硬件发送队列,在主存中建立用于存储描述符的主存发送队列;硬件发送队列以及主存发送队列的读指针均由网络接口卡维护、硬件发送队列以及主存发送队列的写指针均由用户进程维护;所述描述符的长度为32字节~128字节之间且以8字节为单位递增得到的数值,所述描述符中头1个8字节数据中包含类型域和长度域,所述类型域用于区分当前描述符的类型为描述符头数据或者门铃数据;在当前描述符为门铃数据时,所述长度域的含义是门铃数据对应主存发送队列中的描述符个数;在当前描述符为普通描述符时,所述长度域的含义是当前描述符所包含的8字节数据的个数;2)根据用户的通信请求初始化生成待发送描述符, 初始化生成描述符的类型为不携带数据的普通描述符或者携带有数据的立即数描述符;3)判断待发送描述符类型,如果待发送描述符为立即数描述符则以PIO方式写入硬件发送队列;否则将待发送描述符优先以PIO方式直接写入网络接口卡的硬件发送队列,如果硬件发送队列空间不足或者待发送描述符为连续提交描述符的第二个或后续描述符时把待发送描述符写入主存发送队列,同时根据描述符的格式生成被写入主存发送队列的描述符所对应的门铃数据,并将所述门铃数据以PIO方式直接写入网络接口卡的硬件发送队列;4)网络接口卡顺序处理硬件发送队列中的数据,判断当前数据的类型,如果是描述符,则从硬件发送队列读回一个完整的描述符进行处理;如果是门铃数据,就启动DMA从主存发送队列中取回门铃数据对应的描述符再进行处理,并且网络接口卡执行DMA读下一个描述符的过程与处理当前描述符的过程重叠进行;所述步骤3)的详细步骤如下:3.1)初始化设置用于记录硬件发送队列可用空间的信用0为硬件发送队列的深度减1,所述信用0以8字节为单位,设置用于记录主存发送队列可用空间的信用1为硬件发送队列的深度减1,所述信用1以128字节为单位;复位硬件发送队列的写指针0及读指针0、主存发送队列的写指针1及读指针1,写指针0及读指针0均以8字节为单位,写指针1及读指针1均以128字节为单位;将用于标记连续发送描述符的描述符连续发送头标志置为0;初始化设置用于判断描述符是否连续发送的间隔阈值,初始化设置用于判断硬件发送队列是否有足够可用空间来存储新描述符的半满阈值;3.2)检查信用0是否大于半满阈值,如果信用0大于半满阈值则判定硬件发送队列有足够的可用空间来存储新描述符,跳转执行步骤3.3);否则判定硬件发送队列可能没有足够的可用空间来存储新描述符,跳转执行步骤3.13);3.3)判断待发送描述符是否为立即数描述符,如果是立即数描述符则跳转执行步骤3.4),否则跳转执行步骤3.6);3.4)用户进程将待发送描述符以PIO方式直接写入网络接口卡的硬件发送队列,修改信用0将信用0减N,修改写指针0将写指针0加N,记录当前时间作为发送时间,将描述符连续发送头标志置为0,N为写入描述符的8字节数据的个数;跳转执行下一步;3.5)保存待发送描述符的状态信息,向用户进程返回成功消息并退出;3.6)读取当前时间,将当前时间减去上次发送描述符的发送时间得到当前发送描述符的发送间隔,检查发送间隔是否大于间隔阈值,如果发送间隔大于间隔阈值则判定待发送描述符为非连续提交描述符,跳转执行步骤3.4);否则跳转执行步骤3.7);3.7)检查待发送描述符连续发送头标志是否为0,如果为0则判定待发送描述符为连续提交描述符的第一个描述符,将所述描述符连续发送头标志置为1,并跳转执行步骤3.4);如果不为0,则判定待发送描述符为连续提交描述符的第二个或后续描述符,跳转执行步骤3.8);3.8)检查信用1是否大于0,如大于0则判定主存发送队列仍有可用空间,转到步骤3.9);否则判定主存发送队列已经没有可用空间,转到步骤3.11)尝试更新信用1;3.9)把待发送描述符写入主存发送队列,修改信用1将信用1减1,修改写指针1将写指针1加1,记录当前时间作为发送时间,跳转执行步骤3.10);3.10)根据描述符的格式生成被写入主存发送队列的描述符所对应的门铃数据,并将所述门铃数据以PIO方式直接写入网络接口卡的硬件发送队列;修改信用0将信用0减N,修改写指针0将写指针0加N,N为写入描述符的8字节数据的个数;跳转执行步骤3.5);3.11)用户进程执行PIO读获得读指针1的值,跳转执行步骤3.12);3.12)根据写指针1和读指针1的当前值计算信用1,检查计算得到的信用1是否大于0,如果信用1大于0则判定主存发送队列存在可用空间,跳转执行步骤3.9)重新将待发送描述符写入主存发送队列;否则判定主存发送队列完全已满,输出异常信息并退出;3.13)检查信用0是否大于0,如大于0则跳转执行步骤3.8)尝试写入主存发送队列;否则判定硬件发送队列全满,转到步骤3.14)尝试更新信用0;3.14)用户进程执行PIO读,获得读指针0的值,转到步骤3.15);3.15)根据写指针0和读指针0的当前值计算信用0,检查计算得到的信用0是否大于0,如果信用0大于0则判定硬件发送队列已经多出部分可用空间,跳转执行步骤3.2)继续尝试将待发送描述符写入硬件发送队列;否则判定更新后硬件发送队列仍然全满,输出异常信息并退出。
地址 410073 湖南省长沙市砚瓦池正街47号中国人民解放军国防科学技术大学计算机学院