linux设备模型,linux系统的开发模型

大家好,linux设备模型相信很多的网友都不是很明白,包括linux系统的开发模型也是一样,不过没有关系,接下来就来为大家分享关于linux设备模型和linux系统的开发模型的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

Linux下PCI设备驱动开发详解(六)

本章及其后续章节将深入探讨通过PCI Express总线实现CPU与FPGA之间数据通信的简单框架,并介绍Linux PCI内核态设备驱动(KMD)的实战开发。

该框架以开源界知名的RIFFA(可重用集成框架,用于FPGA加速器)为基础,这是一个针对FPGA加速器的可重用集成框架,同时也是一款第三方开源的PCIe框架。

该框架需要使用支持PCIe的工作站以及带有PCIe连接器的FPGA板卡。RIFFA支持Windows、Linux操作系统,以及altera和xilinx的FPGA,可以通过c/c++、python、matlab、java等编程语言实现数据的发送和接收。驱动程序可在Linux或Windows系统上运行,每个系统最多支持5个FPGA设备。

在用户端,存在独立的发送和接收端口,用户只需编写少量代码即可实现与FPGA IP内核的通信。

RIFFA使用直接存储器访问(DMA)传输和中断信号传输数据,从而在PCIe链路上实现高带宽,运行速率可达到PCIe链路的饱和点。

开源地址:github.com/KastnerRG/ri...

一、Linux下PCI驱动结构

在《Linux下PCI设备驱动开发详解(四)》中,我们了解到,通常用模块方式编写PCI设备驱动,至少需要实现以下几个部分:初始化设备模块、设备打开模块、数据读写模块、中断处理模块、设备释放模块、设备卸载模块。通常的编写方式如下:

好的,带着这个框架,我们将进入RIFFA框架的driver源代码分析。

二、初始化设备模块

我们直接给出源代码:

OK,我们已经看到了几个关键词,驱动程序、字符设备、class、文件节点。在《Linux下PCI设备驱动开发详解(三)》中,我们知道总线、设备、驱动模型:

硬件拓扑描述Linux设备模型中四个重要概念:

三、probe探测硬件设备

这个fpga_probe函数非常重要和关键:

四、写操作

基本的读写操作通过ioctl来调用对应的driver驱动的实现。我们补充一下,ioctl是设备驱动程序中设备控制接口函数,一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能,通常以增设ioctl()命令的方式实现。

直接给出代码:

在处理ioctl_send的时候,我们发现实现用户数据拷贝到内核态之后,调用了chnl_send_wrapcheck,将api层打包过来的参数一一传递过去。

直接给出chnl_send_wrapcheck():

这段代码主要做了一些避免错误的判断,值得一提的就是通过自旋锁避免了多线程错误的判断,其实我们可以知道riffa架构支持多线程,之后调用了chnl_send。

将数据写入指定的FPGA通道。除非配置了非零超时,否则将阻塞,直到所有数据都发送到FPGA。如果超时不为零,则该函数将阻塞,直到发送所有数据或超时毫秒过去。来自bufp指针的用户数据将被发送,最多len字(每个字==32位)。通道将被告知预期数据量和偏移量。如果last==1,则FPGA通道将在发送后将此事务识别为完成。如果last==0,则FPGA通道将需要额外的事务。

成功后,返回发送的字数。出错时,返回负值。

核心思想就是,初始化sg_maps,通过bar空间告知FPGA通道号、长度、大小等信息、使用通用buffer发送数据、更新sg_mapping,最后进入到while(1)的循环函数中。

while(1)大循环,只有当处理完Tx数据完成中断或出错时函数才会返回。在每一轮执行中,首先执行内嵌的小while,在小while中首先读取对应通道上的send消息队列,若返回值为0说明成功出队,小while运行一遍后就会执行下面的代码;若返回值为1说明队列可能是空的,也就是还没有中断到来,此时调用prepare_to_wait函数将本进程添加到等待队列里,然后执行schedule_timeout休眠该进程(有阻塞时间限制),此时在用户看来表现为ioctl函数阻塞等待,但中断还能在后台运行(中断也是一个进程)。

若此时驱动接收到一个该通道的Tx中断,那么在中断回调函数里将中断信息推入消息队列后就会唤醒chnl_send所在的进程。进程唤醒后调用finish_wait函数将本进程pop出等待队列并用signal_pending查看是否因信号而被唤醒,如果是需要返回给用户并让其再次重试。如果不是被信号唤醒,则再去读一下消息队列,此时会将消息类型存入msg_type,消息存入msg中,然后退出小while。

接下来进入一个switch语句,这个switch是根据msg_type消息类型选择处理动作的,即中断处理的下半部。

若执行Tx SG读完成中断,则消息类型发送EVENT_SG_BUF_READ,数据填0,其实是没用的数据。在这里如果剩余长度大于0或者剩余溢出值大于0时就会重新执行上一段讲述的过程,即从上一次分配的结尾处再分配SG缓冲区,并发送SG链表给FPGA等等,不过一般不会发送这种情况,除非分配页时的get_user_pages函数锁定物理页出现了问题,少分了页才会出现这样的现象。

然后FPGA就会按SG链表一个一个SG缓存块的进行流式DMA传输,传输完毕后FPGA发送一个Tx数据读完成中断,即EVENT_TXN_DONE消息类型。这里比较好处理,调用dma_unmap_sg取消内存空间的SGDMA映射,然后释放掉页。

五、读操作

读操作和写操作类似,不再详细描述。

函数chnl_recv用于将FPGA发送的数据读到缓冲区内。

首先调用宏DEFINE_WAIT初始化等待队列项;然后把传入的参数timeout换算成毫秒,这个时间是最长阻塞时间。

剩下的就是中断处理过程,等待读完成。

六、销毁/卸载设备

释放设备模块主要是负责释放对设备的控制权,释放占用的内存和中断等,所做的事情正好和打开设备模块相反。

本文详细介绍了RIFFA框架的驱动模块,涉及的内容非常多,包括内核页面、中断处理等。

一个驱动的框架主要包括:初始化设备模块、设备打开模块、数据读写模块、中断处理模块、设备释放模块、设备卸载模块。

七、未完待续

《Linux下PCI设备驱动开发详解(七)》将详细分析RIFFA的环形通信队列,最大的好处就是不需要对后续的队列内容进行搬移,可以后续由入队(写入)覆盖。

八、参考资料

blog.csdn.net/mcupro/...

zhuanlan.zhihu.com/p/...

Linux字符设备驱动模型之设备号

在Linux系统中,硬件设备的操作主要通过/dev目录下的设备文件节点完成。这些节点与内核中的结构成员相连接,提供设备号以区分设备。设备号由主设备号和次设备号组成,主设备号用于标识设备类别,次设备号则用于区分同一类设备中的不同实例。

主设备号和次设备号共同构成设备号,其在用户空间的表示形式为设备节点文件属性中的“主设备号,次设备号”。例如,loop设备在Linux系统中存在多个相同实例,它们具有相同的主设备号7,但次设备号按节点顺序不同。

Linux内核源码使用dev_t类型定义设备号,该类型为32位的unsigned int,其中高12位存储主设备号,低20位存储次设备号。若已知主设备号和次设备号,可使用MKDEV方法宏组合成dev_t类型数据。相反,从dev_t类型数据解析出主设备号和次设备号则分别使用MAJOR和MINOR方法宏。

Linux内核提供两种方式为设备分配主设备号:静态申请和动态分配。静态申请由开发者自行选择主设备号和次设备号,通过register_chrdev_region函数向内核申请。动态分配则由内核自身分配一个可用的主设备号,使用alloc_chrdev_region函数实现。静态申请的主要问题是可能冲突已有设备号,而动态分配则避免了这一问题。

设备号的注销在Linux系统中也非常重要。无论通过静态申请还是动态分配获取的设备号,在系统不再需要相关硬件设备时,都应通过unregister_chrdev_region函数释放。此操作后,设备节点文件将不存在。

嵌入式物联网学习内容广泛,需要选择正确的学习路径和内容,以避免工资提升受阻。提供一个约150G的学习资料包,内含最新且全面的学习资料、面试经验和项目案例,有助于学习者在物联网领域快速成长。

Linux内核的稳定版本linux内核2.6

linux版本的发行版和内核版是什么意思?

Linux内核是Linux操作系统创始人主持的网站

www.kernel.org

上发布的操作系统的最基本的那些东西。

Linux发行版则是前述那些东西的基础上添加了一些工具软件的基础上构成的一套庞大复杂的操作系统。虽然内核都是一样的,但添加部分各不相同,这就构成了不同的发行版本。

Linux本身指的是一个操作系统内核,只有内核是无法直接使用的。我们需要的,可以使用的操作系统是一个包含了内核和一批有用的程序的的一个集合体,这个就是Linux发行版。

其中,Ubuntu。RedHat就是Linux的不同的发行版。

扩展资料:

Linux系统的主要特性

1、基本思想

Linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。至于说Linux是基于Unix的,很大程度上也是因为这两者的基本思想十分相近。

Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变,这让Linux吸收了无数程序员的精华,不断壮大。

3、完全兼容POSIX1.0标准

哪个版本linux内核最牛?

初代版本(麻雀虽小,五脏俱全)

在Kernel.org上可以找到最为古老的linux内核0.0.1版(有兴趣的朋友可以去看看):

linux内核由哪些部分组成?

一个完整的Linux内核一般由5部分组成,它们分别是内存管理、进程管理、进程间通信、虚拟文件系统和网络接口。

1、内存管理内存管理主要完成的是如何合理有效地管理整个系统的物理内存,同时快速响应内核各个子系统对内存分配的请求。

Linux内存管理支持虚拟内存,而多余出的这部分内存就是通过磁盘申请得到的,平时系统只把当前运行的程序块保留在内存中,其他程序块则保留在磁盘中。在内存紧缺时,内存管理负责在磁盘和内存间交换程序块。

2、进程管理进程管理主要控制系统进程对CPU的访问。当需要某个进程运行时,由进程调度器根据基于优先级的调度算法启动新的进程。:Linux支持多任务运行,那么如何在一个单CPU上支持多任务呢?这个工作就是由进程调度管理来实现的。

在系统运行时,每个进程都会分得一定的时间片,然后进程调度器根据时间片的不同,选择每个进程依次运行,例如当某个进程的时间片用完后,调度器会选择一个新的进程继续运行。

由于切换的时间和频率都非常的快,由此用户感觉是多个程序在同时运行,而实际上,CPU在同一时间内只有一个进程在运行,这一切都是进程调度管理的结果。

3、进程间通信进程间通信主要用于控制不同进程之间在用户空间的同步、数据共享和交换。由于不用的用户进程拥有不同的进程空间,因此进程间的通信要借助于内核的中转来实现。

一般情况下,当一个进程等待硬件操作完成时,会被挂起。当硬件操作完成,进程被恢复执行,而协调这个过程的就是进程间的通信机制。

4、虚拟文件系统Linux内核中的虚拟文件系统用一个通用的文件模型表示了各种不同的文件系统,这个文件模型屏蔽了很多具体文件系统的差异,使Linux内核支持很多不同的文件系统。

这个文件系统可以分为逻辑文件系统和设备驱动程序:逻辑文件系统指Linux所支持的文件系统,例如ext2、ext3和fat等;设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。

5、网络接口网络接口提供了对各种网络标准的实现和各种网络硬件的支持。网络接口一般分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。

网络设备驱动程序则主要负责与硬件设备进行通信,每一种可能的网络硬件设备都有相应的设备驱动程序。

扩展资料:

Linux操作系统的诞生、发展和成长过程始终依赖着五个重要支柱:UNIX操作系统、MINIX操作系统、GNU计划、POSIX标准和Internet网络。

1981年IBM公司推出微型计算机IBMPC。

1991年,GNU计划已经开发出了许多工具软件,最受期盼的GNUC编译器已经出现,GNU的操作系统核心HURD一直处于实验阶段,没有任何可用性,实质上也没能开发出完整的GNU操作系统,但是GNU奠定了Linux用户基础和开发环境。

1991年初,林纳斯·托瓦兹开始在一台386sx兼容微机上学习minix操作系统。1991年4月,林纳斯·托瓦兹开始酝酿并着手编制自己的操作系统。

1991年4月13日在comp.os.minix上发布说自己已经成功地将bash移植到了minix上,而且已经爱不释手、不能离开这个shell软件了。

1993年,大约有100余名程序员参与了Linux内核代码编写/修改工作,其中核心组由5人组成,此时Linux0.99的代码大约有十万行,用户大约有10万左右。

1994年3月,Linux1.0发布,代码量17万行,当时是按照完全自由免费的协议发布,随后正式采用GPL协议。

1995年1月,BobYoung创办了RedHat(小红帽),以GNU/Linux为核心,集成了400多个源代码开放的程序模块,搞出了一种冠以品牌的Linux,即RedHatLinux,称为Linux"发行版",在市场上出售。这在经营模式上是一种创举。

2001年1月,Linux2.4发布,它进一步地提升了SMP系统的扩展性,同时它也集成了很多用于支持桌面系统的特性:USB,PC卡(PCMCIA)的支持,内置的即插即用,等等功能。

2003年12月,Linux2.6版内核发布,相对于2.4版内核2.6在对系统的支持都有很大的变化。

2004年的第1月,SuSE嫁到了Novell,SCO继续顶着骂名四处强行“化缘”,Asianux,MandrakeSoft也在五年中首次宣布季度赢利。3月,SGI宣布成功实现了Linux操作系统支持256个Itanium2处理器。

linux内核操作系统有哪些?

1、veket系统

veket系统目前包括veket-x86平台系统和随身系统,还有上网本系统,分别对应veket-8系统、veket-7系统和veket-5系统。经过测试,veket-7和veket-5在使用上比较完善。veket-8目前还处于测试期,在功能上可能还不稳定。

2、Ubunto系统

这个系统又名乌班图系统,也是一个以桌面应用为主的Linux操作系统,系统分为云平台,服务器版和桌面版。可以根据需要选择相应的版本。桌面版目前最新版本好像是Ubuntu13.10版本,在虚拟机上安装过,还算可以。

3、Fedora系统

此系统,也是基于linux的一款不错的操作系统,在界面上比较美观,安装文件可能会相对较大一些,大家可以尝试一下。

4、麒麟操作系统

这个算是国产的一个自主可控的基于linux的操作系统,在功能上也算比较完善,有32位和64位的系统,想尝试的朋友可以下载安装试一下。

十大轻量级linux系统?

DamnSmallLinuxDSL是一个非常体积小的发行版。它是一个50M大小的LiveCD,也能安装到硬盘上。DSL能完全的在RAM里运行,而且你可以通过软件仓库为它安装更多的软件。DSL的推荐配置是P200和64MB内存。

PuppyLinux也是以LiveCD的开式发行,它运行的最低内存要求可以达到32M,并且它的启动速度很快,一般都能在60秒内完成启动。PuppyLinux的目标是打造一个易用的系统,不需要太多技术方面的要求。

FeatherLinux是一个大小为128M的发行版,与DSL一样,它也是基于knoppix(knoppix是基于DebianLinux)定制而成的,它集成了人们日常的常用工具。

DeLi(DeLiLinux表示“DesktopLight”Linux)它是一个针对老计算机的发行版,支持从486到PentiumIII或类似的计算机。专注于桌面用途,包括:电子邮件客户端、图形界面的网页浏览器、办公软件(文字处理、电子表格)等等。包括了Xorg和开发工具的完全安装不会需要超过750MB的硬盘空间。

VectorVectorLinuxStandardGOLD是一个完全免费下载的发行版,它包括了各种软件。VectorLinux是一下基于Slackware,而专门为低配置的老计算机设计的。在一台只有Pentium200、128内存以及3G硬盘空间的老机器上高效的运行。在即将发行的VLLight完全安装只需要350M的空间以及64M的内存来运行。

Zenwalk是另一个基于Slackware的发行版,它追求的是轻便、快速,并没有过多的软件。虽然它以i686为标准,但也是完全兼容i486的。Zenwalk的配置要求是PentiumIII处理器、128M内存和2G的硬盘空间。

Antix是一个基于Mepis定制的轻量级系统。Antix的最低配置要求是P266处理器和64M的内存。由于antiX-M7采用的i686的内核,所以不能在一些旧的处理器上运行了,如PentiumI,AMDK5,AMDK6?

PClosTinyME是一个基于PCLinuxOS定制的系统。它集成了Abiword、Opera浏览器、Audacious音乐播放器以及Sylpheed邮件客户端等程序。TinyME的配置要求是Pentium处理器、64M的内存。

Debian是一个自由的操作系统(OS)供您和您的计算机使用。一个操作系统就是让您的计算机工作的一系列基础程序和实用工具的集合。由于Debian采用了Linux内核(一个操作系统的核心),但是大部分基础的操作系统工具都来源于GNU项目,因此又称之为GNU/Linux。

SlackwareLinux是由PatrickVolkerding开发的GNU/Linux发行版。与很多其他的发行版不同,它坚持KISS(KeepItSimpleStupid)的原则,就是说没有任何配置系统的图形界面工具。一开始,配置系统会有一些困难,但是更有经验的用户会喜欢这种方式的透明性和灵活性。

阅读剩余
THE END