映射Linux内存管理:DMA

linux内存管理  时间:2021-01-15  阅读:()

Linux内存管理 DMA

说起DMA我们并不陌生但是实际编程中去用的人不多吧最多就是网卡驱动里的环形buffer再有就是设备的dma下面我们就分析分析.DMA用来在设备内存和内存之间直接数据交互。而无需cpu

干预

内核为了方便驱动的开发 已经提供了几个dma函数接口。dma跟硬件架构相关所以l inux关于硬件部分已经给屏蔽了有兴趣的可以深入跟踪学习.按照l inux内核对dma层的架构设计各平台dma 缓冲区映射之间的差异由内核定义的一个dma操作集include/l inux/dma-mapping.h:

来统一屏蔽实现的差异.不同差异主要来来自cache的问题Cache与dma同步问题这里不深入讨论.

另外一个常用的函数是Dma_set_mask 为了通知内核设备能够寻址的范围很多时候设备能够寻址的范围有限。

Dma映射可以分为三类

1.一致性dma映射dma_al loc_coherent 问题驱动使用的buffer 不是自身申请的而是其他模块 当驱动模块主动分配一个Dma缓冲区并且dma生存期和模块一样时

参数说明

1这个函数的返回值是缓冲的一个内核虚拟地址,它可被驱动使用

2第三个参数dma_handle 其间相关的物理地址在dma_handle中返

2.流式dma映射dma_map_single通常用于把内核一段buffer映射返回物理地址.如果驱动模块需要使用从别的模块传进来的虚拟地址空间作为dma缓冲区保证地址的线性cache一致性一致性api接口sync_single_for_cpu

3.分散/聚集映射scatter/gather map

Dma_map_sgs

有时候我们还需要1.回弹缓冲区bouncebuffer 当cpu侧物理地址不适合设备的dma操作的时候

2.DmA内存池一般dma映射都是单个page的整数倍如果驱动程序需要更小的一致性映射的dma缓冲区可以使用。类似于slab机制Dma_pool_create

下面我们就那网卡驱动的例子说说dma的具体应用参考l inux kernel e1000网卡drivers/net/ethernet/intel/e1000/*Ring buffer

Dma不能为高端内存一般为32默认低端内存 由于设备能够访问的地址范围有限。 设备使用物理地址而代码使用虚拟地址。

就看看如何发送数据包 e1000_main.c:e1000_xmit_frame:关于帧的发送流程这里不多说.

经过上次邻居子系统后数据帧已经到达驱动数据放在skb指定的内存里.看代码tx_ring=adapter->tx_ring;//获取发送的ring buffer

接着我们看关键代码 count=e1000_tx_map(adapter, tx_ring, skb,

first,max_per_txd,nr_frags,mss);

它做了什么呢

默认数据报文没有分片或者碎片什么的。 那么进入第一个whi le(len)

获取buffer_info=&am p;tx_ring->buffer_info[i];然后调用dma_map_single进行流式映射.即把skb->data(虚拟地址)和b uffer_i nfo->d m a 物理地址对应起来.操作两个地址等于操作同一片区域。

回到主发送函数

调用e1000_tx_queue把数据发送出去

我们看到它把刚才dma_map_singe里的映射赋值了tx_desc->buffer_addr=cpu_to_le64(buffer_info->dma);说明发送的时候是根据发送描述符来发送的。

然后操作寄存器 writel(i,hw->hw_addr+tx_ring->tdt);那么网卡就会自动读取tx desc然后把数据发送出去。

总结下流程 1. l inuxos会调用网卡的start_xmit  函数。在e1000里对应的函数是e1000_xmit_frame,2.e1000_xmit_frame又会调用e1000_tx_queue(adapter, tx_ring, tx_flags,count) 。 这里的tx_queue指的是发送Descriptor的queue。 3.e1000_tx_queue在检查了一些参数后最终调用writel(i,hw->hw_addr+tx_ring->tdt)。 这里的tx_ring->tdt中的tdt全写为tx_descriptor_tai l 。从网卡的开发手册中可以查到如果写了descriptor

tai l 那么网卡就会自动读取descriptor,然后把包发送出去。descroptor的主要内容是addr pointer和length。前者是要发送的包的起始物理地址。后者是包的长度。有了这些硬件就可以通过dma来读取包并发出去了。其他网卡也基本会用descriptor的结构。

虽然流程明白了但是还有几个点 1. tx_ring在哪初始化 2.网卡到底是如何操作映射的dma地址的把数据发送出去的txring在e1000_open的时候 调用

我们看它建立了一致性dma映射.desc是结构指针它的结构跟网卡寄存器结构有关 e1000_hw.h

我们稍微屡一下

那么网卡又是如何和dma地址关联的呢?

很明显它把dma地址写入了网卡dma寄存器。所以dma还需要网卡硬件的支持才行.

当然e1000这个网卡驱动还是相当的复杂,不过它把一致性映射和流式映射都用上了。

易速互联月付299元,美国独立服务器促销,加州地区,BGP直连线路,10G防御

易速互联怎么样?易速互联是国人老牌主机商家,至今已经成立9年,商家销售虚拟主机、VPS及独立服务器,目前商家针对美国加州萨克拉门托RH数据中心进行促销,线路采用BGP直连线路,自带10G防御,美国加州地区,100M带宽不限流量,月付299元起,有需要美国不限流量独立服务器的朋友可以看看。点击进入:易速互联官方网站美国独立服务器优惠套餐:RH数据中心位于美国加州、配置丰富性价比高、10G DDOS免...

青云互联:美国洛杉矶CN2弹性云限时八折,15元/月起,可选Windows/可自定义配置

青云互联怎么样?青云互联是一家成立于2020年6月的主机服务商,致力于为用户提供高性价比稳定快速的主机托管服务,目前提供有美国免费主机、香港主机、香港服务器、美国云服务器,让您的网站高速、稳定运行。美国cn2弹性云主机限时8折起,可选1-20个IP,仅15元/月起,附8折优惠码使用!点击进入:青云互联官方网站地址青云互联优惠码:八折优惠码:ltY8sHMh (续费同价)青云互联活动方案:美国洛杉矶...

老用户专享福利 腾讯云 免费领取轻量云2核4G服务器一年

感恩一年有你!免费领取2核4G套餐!2核4G轻量应用服务器2核 CPU 4GB内存 60G SSD云硬盘 6Mbps带宽领取地址:https://cloud.tencent.com/act/pro/lighthousethankyou活动规则活动时间2021年9月23日 ~ 2021年10月23日活动对象腾讯云官网已注册且完成实名认证的国内站用户(协作者与子用户账号除外),且符合以下活动条件:账号...

linux内存管理为你推荐
国际域名常用的国际顶级域名有哪些?免费美国主机谁有免费空间?给我提供一个,主机屋的就不要了,美国主机也行,但是必须得稳定,谢谢网络服务器租用网络公司租用什么服务器好(想开个网络公司,租用服务器,但是不知道哪个好?什么价位?求高手指导。)国外虚拟空间哪里买的100m海外虚拟空间便宜稳定?免费国内空间跪求国内最好的免费空间!ip代理地址IP代理什么意思?域名购买域名购买的流程是什么?网站空间商域名空间商怎么做网站空间免备案哪里能找到免费、免备案的空间?韩国虚拟主机大家用的虚拟主机是国内的还是香港的还是韩国的还是美国的
台湾主机 个人域名备案流程 adman vmsnap3 香港机房托管 2017年黑色星期五 线路工具 阿里云浏览器 gspeed cdn联盟 环聊 跟踪路由命令 服务器是干什么用的 智能dns解析 什么是web服务器 石家庄服务器托管 中国电信测速网站 杭州电信宽带优惠 镇江高防 酸酸乳 更多