当前位置:  技术问答>linux和unix

linux 内核开发(零拷贝)

    来源: 互联网  发布时间:2017-04-10

    本文导语:  我正在写一个linux网卡零拷贝的驱动,是在intel e1000驱动基础之上改动。 查了查资料已经搞清楚DMA是如何运作,而且也知道如何使DMA将数据直接写入自己申请的内存空间。已经有了一个大致的解决方案,但有以下下...

我正在写一个linux网卡零拷贝的驱动,是在intel e1000驱动基础之上改动。

查了查资料已经搞清楚DMA是如何运作,而且也知道如何使DMA将数据直接写入自己申请的内存空间。已经有了一个大致的解决方案,但有以下下几个细节搞不定,请同学们帮帮。

我先说下我的思路:
首先从用户太说起,数据包从经数据线至网卡驱动至协议栈最后至用户太要经过至少两次拷贝才能完成,期间cpu参与过多,造成cpu负担过重,效率低下。

从e1000的驱动看到:pci_map_single()这个函数完成了将内核内存映射到DMA设备的过程。我所做的就是将pci_mag_single()映射的内存替换成我申请的内存。这样DMA设备就把数据直接写到指定的内存了,用户台进程读这块内存就OK了。其中没有cpu的参与。

如何替换呢?写过内核的同学们都知道skb buffer这个东西。当网卡驱动被初始化的时候,会netdev_alloc_skb这个系统函数,预先申请一堆的skb buffer。

从源码中看出,申请过程分两个过程,首先申请一个skb buffer结构。skb buffer中有一个指针类型的成员变量data,此时的data是没有指向任何有效数据块的。然后在用kmalloc()申请一块内存,赋给skb->data。网卡驱动就是用pci_map_single()将skb->data映射入DMA设备。然后DMA设备会将收到的数据直接写入skb->data指向的内存区。

所以我们只需增加一个内存分配模块,替换网卡驱动skb buffer的分配函数即可。那是DMA设备会自动的将收到的数据写入我们指定的内存中。
以上是我的思路。不对的地方请指正。

下面是我的问题。
DMA将数据写入我们分配的内存后,就需要通知用户态的进程来读取了。问题如下:

1.用户态如何读取这部分内存。
我查了查资料,有两种方式可以完成。a.使用proc的方式。b.使用ioctrl的方式。由于数据量过大,我希望采用proc的方式。但是对于proc的方式我很不理解。从资料中看到的是在驱动初始化时使用create_proc_entry这个函数,在/proc/目录下建立一个虚拟文件。用户态进程读这个虚拟文件就行了。

struct proc_dir_entry *create_proc_entry(constchar*name, mode_t mode,struct proc_dir_entry *parent)

这个函数会在/proc目录下建立一个文件,OK,没有问题。然后呢,用户态的程序去读该文件,读什么呢,文件建立后里面并没有写入任何有用的东西。我就猜也许是要我自己把我申请的物理内存首地址以及内存大小写入到这个文件中吧。用户态读取文件中的物理地址,使用mmap将物理内存地址映射入自己的进程空间。

这个想发不知对不对。如果不对,请同学给我指明一个思路,谢谢。

2.将内核空间成功映射入用户态进程空间后,网卡驱动如何同用户态的进程同步。
    我是这样实现的,我在内核申请了块内存,作为队列。接收过来的数据会被放入队列中。驱动和用户态进程肯定要竞争这个队列,如何同步呢。

3.内核中的内存形式。
   用户态进程都有自己的虚拟空间,用户态进程是否有类似的概念呢。还是说内核空间就是被所有内核模块,内核进程所共享的。我看得书中并没有类似概念的说明,请同学们给我扫扫盲。

4.一台机器上会有多块型号相同的网卡,那么这些网卡会使用同样的驱动。
比如有a,b,c三块网卡,型号相同。
a网卡首先被激活,申请一块内存。然后b,c网卡也被激活。a网卡申请的内存会被b.c网卡使用吗。


同学们一起交流,共同提高。

由于本人积分不多,所以希望大家谅解。功能完成后,分享期间我所遇到的困难以及解决问题的思路。
谢谢各位。

|
楼主的精神是值得肯定的,方法是不对的,对内核的理解是不够的。
网络数据并非单纯的原始数据,还有大量的协议包,内核协议栈的存在就是做这些打包和解析包的工作。
按楼主的方法,效率没有提高,还导致应用程序要负责协议栈的工作,这还不算,整个网卡资源就只有
这一个程序可用。

1. proc 的用法, 调用相关接口创建目录/文件以后, 还有实现对应的 read 和 write 接口,
   当用户空间的程序去读取这个文件的时候 read 接口将被调用,数据在这个时候写入文件中。
   你既然提到 mmap 接口,你就应该知道 mmap 是怎么实现的。

2. 如果你写过驱动就不会有这样的疑问了, 回去好好读一下 ldd3。  看看阻塞调用是怎么实现的,看看
   select 接口是怎么实现的。 基础不过关阿。

3. 你可以认为内核就是一个 while 循环, 空间是所有模块共享的,没有内存保护。

4. 这取决于你的驱动是怎么设计的,一个驱动可以 support 多个设备,给每个设备分配自己的内存。
 

    
 
 

您可能感兴趣的文章:

  • Linux内核中影响tcp三次握手的一些协议配置
  • 我想学习linux桌面编程,那么有没有必要学习linux的内核以及内核的相关编程呢?
  • TCP协议四次断连过程介绍及Linux内核协议栈中相关设置项
  • 现有linux内核中共享内存机制如何移植到linux0.11内核中
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • 读懂 Linux 内核代码不难,难的是读懂 Linux 内核代码背后的哲学!
  • linux内核中的likely宏和unlikely宏介绍及用法
  • Linux中内核线程不访问内核态地址空间?
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • linux为什么要升级内核?升级内核有何作用?
  • 请问linux中如何判断内核是否已经启动。(在内核中写程序)
  • 《Linux内核情景分析》值得推荐的内核学习参考两用资料
  • *******是不是对内核模块编程然后再重新编译内核就可以把此模块整合到linux系统中
  • Linux 编译内核之后 没办法选择内核版本
  • 想看linux内核源代码,另外手头上有一本《unix环境高级编程》,需要先把《unix环境高级编程》看完之后再看内核吗?
  • 请问重新编译LINUX内核是否能将没有用的外设的驱动程序删除并减少内核占有内存的资源?请好心人仕指教!
  • Linux内核工具包 TOMOYO Linux
  • 请问:构建嵌入式linux环境时,“Linux内核的移植”是达到什么目的啊?
  • 求教,Linux下键盘输入的所有数据都会经过Linux内核吗???
  • 高深问题:有了linux内核源代码如何做成一个linux操作系统
  • linux内核编译一定要在linux环境下么?
  • 关于redhat linux7.3文件拷贝:我要将/dev下的全部文件拷贝到另一个已mount的硬盘上,怎么大部分文件拷不过去呢??
  • 从Linux拷贝文件时,总出现符号链接错误时怎么回事?
  • Linux拷贝NTFS大文件
  • [Suse Linux]两台机器上怎样能快速拷贝大量的文件
  • 求教linux 拷贝重命名的问题
  • winscp windows从linux 拷贝文件的做成时间不对。。。
  • 请问在Linux中,rcp远程拷贝命令的使用方法?
  • Linux下如何拷贝屏幕上内容?(在线等待)
  • linux 从一个另一个账户下拷贝文件到当前账户的命令
  • 关于linux下文件拷贝的问题???
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux 下c++开发error while loading shared libraries问题解决
  • 我常未开发过Linux下的程序,请问Linux下可以使用那些开发工具,最好的开发工具是什么版本?
  • 嵌入式linux开发与防火墙系统linux开发
  • embedded linux开发和linux开发 要求的知识领域有什么不同?
  • linux下用java开发是不是JB就可以,JAVA在LINUX下开发有优势吧!
  • linux 嵌入式开发用不用买开发板,买什么样的开发板?
  • 谁知道国内有那些公司在linux平台上做开发的,或开发linux软件的?
  • 作 Linux/Unix开发 应该从何处入手?致力于Linux开发的迷惑???欢迎讨论。
  • 我是学习web开发的,主要是java开发SSH开发框架和ajax等。我想知道有没有必要学习一下linux相关知识。
  • 请问在Linux 下用C开发移动增值软件都有什么开发工具啊,我以前一直在Windows下用VC开发
  • 请问大家 在linux下开发嵌入式linux用什么集成开发环境?
  • linux 嵌入式开发用买开发板吗?
  • 请问LINUX下开发大家一般都是什么开发环境?
  • 我想在Linux下开发,不知道用什么工具、什么开发语言??
  • 各位设备驱动开发的朋友,请问,linux设备驱动开发和网络编程开发哪一样工资比较高呀?
  • php开源软件 iis7站长之家
  • 关于linux内核开发和应用开发的区别
  • 学习linux驱动开发,买什么开发板好?
  • 请问在哪下载嵌入式Linux开发平台???想学嵌入式开发!!!
  • 从windows开发转Linux开发 的前辈请进!!!
  • 想学习linux嵌入式开发,具体买什么开发板,请高人指点?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,