文档库 最新最全的文档下载
当前位置:文档库 › Linux实时操作系统定制及设备驱动开发

Linux实时操作系统定制及设备驱动开发

Linux实时操作系统定制及设备驱动开发
Linux实时操作系统定制及设备驱动开发

分类号学号M201070480 学校代码10487 密级

硕士学位论文Linux实时操作系统定制及设备驱动开发

学位申请人:刘慧双

学科专业:机械电子工程

指导教师:宋宝副教授

唐小琦教授

答辩日期:2013年1月15日

A Thesis Submitted in Partial Fulfillment of the Requirements

for the Degree of Master of Engineering

Real-time Operating System Customization of Linux and Development of Device Driver

Candidate : Liu Huishuang

Major : Mechanical and Electronic Engineering

Supervisor : Associate Prof. Song Bao

Prof. Tang Xiaoqing

Huazhong University of Science and Technology

Wuhan, Hubei 430074, P. R. China

January, 2013

独创性声明

本人声明所呈交的学位论文是我个人在导师指导下进行的研究工作及取得的研究成果。尽我所知,除文中已经标明引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写过的研究成果。对本文的研究做出贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律结果由本人承担。

学位论文作者签名:

日期:年月日

学位论文版权使用授权书

本学位论文作者完全了解学校有关保留、使用学位论文的规定,即:学校有权保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权华中科技大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。

保密□,在年解密后适用本授权书。

本论文属于

不保密□。

(请在以上方框内打“√”)

学位论文作者签名:指导教师签名:

日期:年月日日期:年月日

华中科技大学硕士学位论文

摘要

Linux操作系统具有代码开源、易于移植等优点,在嵌入式数控系统中得到了广泛应用。本文针对Linux操作系统本身实时性不高、应用针对性强等特点,对Linux实时操作系统的定制及关键设备驱动技术进了研究开发。论文的主要研究内容有:研究了Linux+Xenomai实时Linux操作系统架构及工作原理,和RTDM实时驱动模型。针对ARM+FGA硬件平台,定制了通用Bootloader U-Boot、Linux-2.6.33内核和yaffs文件系统。通过对内核的定制,使内核支持yaffs格式的文件系统,使用MTD技术,定制NAND Flash分区。

分析了Xenomai工作原理,采用Linux+Xenomai的架构对Linux操作系统进行实时化定制。根据系统需求,基于Linux实时操作系统及U-Boot相关技术,定制启动logo 及系统软件的自动化下载工具。

研究了基于ARM的Linux操作系统设备地址分区及Linux设备驱动开发方法,分析了设备驱动中ioctl系统调用原型,基于RTDM模型开发运动控制子系统设备驱动,为实时任务控制轴、I/O、模拟量等寄存器开发了接口函数。研究了人机交互接口LCD 屏工作原理及驱动框架,开发LCD控制器驱动程序,使系统支持8寸以下LCD屏。

以本文设计的硬件平台为测试环境,基于ioctl系统调用编写实时任务周期函数,对系统实时性能、运动控制子系统伺服轴、I/O、模拟量等接口等进行了测试。测试结果表明达到了设计要求。

关键词:Linux ,实时,定制,设备驱动,操作系统,数控系统

华中科技大学硕士学位论文

Abstract

Linux operating system has the advantage of open source,easy to transplant etc,so has been applied widely in the field of embedded NC system. According to the characteristics of low real-time,targeted application etc,the thesis researches and develops customization of real-time operating system of Linux and development of key equipment drive technology. The main research contents of thesis are listed as follows:

Research the structure and principle of real-time Linux operating system based on Linux + Xenomai and real-time drive model of RTDM.According to the hardware platform based on ARM+FPGA,customise the universal Bootloader U-Boot,Linux-2.6.33 kernel and yaffs filesystem.Through the customization of the kernel,make the kernel support filesystem of yaffs https://www.wendangku.net/doc/7d4875222.html,ing MTD technology customise partition of NAND Flash.

Analysis of Xenomai working principle,and customise real-time of Linux operating system based on the Linux + Xenomai architecture.Customise startup logo and automation download of system software based on Linux real-time operating system and U - Boot technologies.

Research on Device address partition of Linux operating system based on ARM and development method of device drivers.Analysis of ioctl system call prototype of the device driver,and develop device drivers of motion control subsystem based on the RTDM model. Offer interface function to control registers of Axis,I/O,analog.Research the working principle and driven framework of man-machine interactive interface LCD screen. Develop the driver of the LCD controller,and make system support the LCD screen below 8 inches.

With hardware platform as test environment, program real-time tasks periodic function based on the ioctl system call.The system real-time performance and interface of servo axis, I/O, simulation etc of motion control subsystem have been tested. Test results show that meet the design requirements. Test results show that design meet the requirements.

Keywords: Linux, Real-time, Customization,Device Driver,OS,NC System

华中科技大学硕士学位论文

目录

摘要 ...................................................................................................... I Abstract ..................................................................................................... II 1 绪论 .. (1)

1.1课题来源、研究背景与意义 (1)

1.2L INUX实时操作系统及驱动 (2)

1.3国内外发展及研究现状 (4)

1.4本文研究的主要内容 (5)

2 嵌入式数控及L INUX实时操作系统 (7)

2.1嵌入式数控系统功能需求 (7)

2.2嵌入式数控系统组成 (8)

2.3L INUX实时操作系统及设备驱动模型 (9)

2.4本章小结 (13)

3 L INUX实时操作系统定制 (14)

3.1L INUX实时操作系统架构及启动过程 (14)

3.2L INUX操作系统的定制 (16)

3.3L INUX实时操作系统启动LOGO及软件自动下载定制 (25)

3.4本章小结 (32)

4 L INUX实时操作系统外设驱动 (33)

4.1基于ARM与L INUX实时操作系统的外设管理 (33)

4.2关键设备驱动程序开发 (35)

4.3本章小结 (45)

5 系统测试与应用 (46)

5.1实时性测试 (46)

5.2启动LOGO定制测试 (47)

华中科技大学硕士学位论文

5.3软件自动下载定制测试 (48)

5.4基于RTDM的运动控制子系统接口驱动测试 (48)

5.5LCD屏驱动测试 (51)

5.6本章总结 (52)

6总结与展望 (53)

6.1本文总结 (53)

6.2研究展望 (54)

致谢 (55)

参考文献 (56)

附录1 攻读学位期间发表学术论文目录 (60)

华中科技大学硕士学位论文

1 绪论

1.1 课题来源、研究背景与意义

1.1.1 课题来源

本课题得到以下项目支持:

1)国家“高档数控机床与基础制造装备”科技重大专项“开放式高档数控系统、伺服装置和电机成套产品开发与综合验证”(2012ZX04001012);

2)国家支撑计划面向机械设备的开放式数控系统与专用伺服驱动及电机的研发与应用2012BAF13B01;

3)广东省部产学研重大专项课题,高性能锂离子动力电池关键材料、设备与工艺集成研发及产业化(2012A090300012)。

1.1.2 课题研究的背景与意义

随着计算机技术的发展,无论是在运动控制领域还是在人们的日常生活,嵌入式设备随处可见,这种设备也就是通常所说的嵌入式系统[1],其具有很高的自动化性能及一定程度的智能化。

数控系统需具有高速、高精、高可靠性以及对复杂曲线的计算能力,同时能够提供人性化的操作界面,因此,数控系统日趋复杂。当前,数控系统的发展趋势是采用高速CPU芯片、或RISC芯片、或多CPU的控制系统[2]以及具有高分辨率检测元件的交流伺服驱动系统,使得数控机床的高速、高精度等性能指标得到大大提高。在设计方式上,采用模块化设计,方便扩展和裁减,以满足不同用户需求;在体系结构上,采用高度集成化CPU、大规模可编程集成电路FPGA(Field-Programmable Gate Array)以及专用集成电路ASIC芯片相结合的方式,以提高数控系统的集成度和软硬件的运行速度[3];在操作系统的选择上,要求操作系统具备小巧、实时性、可装卸、代码可固化、弱交互、强稳定、统一接口等特征。目前常用的嵌入式操作系统包括Linux、VxWorks、Windows

华中科技大学硕士学位论文

CE、μC/OS-II等。Linux系统以其开源、易移植、免费等被广泛使用。

Linux系统本身不具备实时性,目前已经有多种实时化的改造方法,一种是选择RTAI、Xenomai、RTLinux[4]等实时子系统与Linux并行运行在硬件上;一种是直接修改Linux源码,使其本身成为一个实时系统。对Linux实时操作系统也提供了对应的API 接口,便于设备驱动程序及应用程序的开发。随着嵌入式数控系统的种类越来越多[5],根据具体用户需求对Linux操作系统进行定制化设计也是非常重要的。

本文设计了一种基于RISC架构的ARM微处理器和可编程器件FPGA的嵌入式数控系统,并在此平台上定制了Linux实时操作系统,进行关键。

1.2 Linux实时操作系统及驱动

1.2.1 Linux实时操作系统

嵌入式系统硬件以嵌入式处理器为核心[3]。嵌入式处理器的体系结构经历了从复杂指令集到精简指令集的转变,位数也从4位、8位、16位、32位发展到64位,微处理器核也有ARM、MIPS、PPC[6]等多种。ARM架构支持32位的ARM指令集和16位的Thumb指令集,处理器以其高速度、低功耗、低价格等优点得到广泛应用。目前已经占有70%以上的32位嵌入式产品市场[4][5]。目前ARM处理器分为8个系列:ARM7,ARM9,ARM9E,ARM10E,ARM11,Cortex、SecurCore和Optim0DE Data Engines,其中ARM9系列微处理器有ARM920T和ARM922T两种类型,S3C2410和S3C2440芯片都属于ARM920T系列。

嵌入式系统软件则以嵌入式操作系统为核心。运行在嵌入式硬件平台上,对整个系统及其部件、装置等资源进行统一协调、指挥和控制的系统软件叫嵌入式操作系统[7]。在嵌入式系统中,如果我们选择的操作系统除具备可裁剪、低功耗的特点外,还满足用户的实时性要求,我们称这样的系统为嵌入式实时操作系统。基于嵌入式系统硬件特点和应用环境的多样性,嵌入式操作系统需具备微型化、实时性、高可靠性、易移植性等特点。在嵌入式领域可选的操作系统有很多,比如:Linux、VxWorks、Windows CE、μC/OS-II等。Linux系统在嵌入式领域越来越流行,是因为其具备以下优点[8][9]:(1)程序代码的质量与可靠度:开放源码的开发模型让许多人可以为开发项目编

华中科技大学硕士学位论文

写程序、找出既有问题、讨论可能的解决方案,以及有效率的修正问题。在开发模型以及“许多眼睛”的协助下,保证了其质量和可靠度;

(2)程序代码的可用性:最重要的Linux组建,包括内核本身,都是在GNU通用公共许可证的保护下发行,可以随意获取源码及生成的工具;

(3)广泛的硬件支持:Linux支持各种不同类型的硬件平台与设备,Linux平台上所编写的软件可以轻易移植到Linux运行的另一平台上;

(4)广泛的通信协议及软件标准支持;

(5)编译、调试等各种可用工具;

(6)社群的支持:有庞大的开发人员群体,有数量众多的技术论坛,只要将一封电子邮寄往正确的邮件论坛,通常你就可以直接联络写软件的那个人,大多说问题可以得到快速而免费的解答;

(7)源码开放,使用时无需缴纳许可费用。

所谓实时操作系统是指系统中计算结果的正确性不仅取决于计算逻辑的正确性,还取决于产生结果的时间[10][11]。其关键在于保证完成时间,而不在于原始速速[12]。Linux 本身并不提供任何实时保证,必须通过为标准的Linux加入实时的支持来解决,即构建实时Linux操作系统。Linux支持Co-Kernel(辅助内核)和完整的抢占式内核两种实时解决方案。

Co-Kernel是指在相同的硬件中加入一个与Linux同时运行的小型的实时内核,实时进程会交给小型的Co-Kernel处理,Co-Kernel会对他们做适当的调度,而一般的GPOS 工作仍交给标准的Linux内核处理。在这一方案中,所有的设备中断必须先送往Co-Kerne 处理,然后送往标准Linux内核处理。Co-kernel内核的运行是透明的,Linux内核几乎不知道它的存在,而且不知道在它有机会处理中断之前,中断实际上已送往Co-Kernel。典型的实时系统有:RTAI、Xenomai、RTLinux等。这种方法对内核的修改较小,使用方便,而且兼容原有设备驱动程序和应用程序,目前应用广泛[13],也是本文Linux操作系统实时化采用的方案,即采用Linux+Xenomai的结构构建实时Linux操作系统。

完整的抢占式内核解决方案就是将Linux内核转成一个完整的RTOS(real-time operating system),即改变Linux内核,让实时进程的执行不受到非实时进程进行的不可

华中科技大学硕士学位论文

预测的干扰。直接修改linux内核源代码中的数据结构、进程调度函数和中断方式,使其能够处理实时进程。

1.2.2 Linux设备驱动

设备驱动是硬件的接口,操作系统通过这个接口来控制硬件设备。驱动与硬件设备直接打交道,根据设备的工作方式,开读写对应寄存器,实现对硬件设备的控制。设备驱动程序在Linux内核中扮演特殊的角色,是内核的一部分,是操作系统内核和设备之间的接口[14],是应用程序与具体硬件的桥梁[15],为应用程序屏蔽了硬件的细节,在应用程序看来,设备本身就是一个文件,可以像操作文件一样来控制硬件设备。

Linux的外设分为字符设备(character device)、块设备(block device)和网络接口(network interface)[16]。字符设备是以字节为单位进行读写,块设备上的数据是以块的形式存放,在驱动中都提供了open、close、read、write等系统调用。网络接口不同于字符设备、块设备,库、内核提供了一套数据包传输函数。驱动程序可以静态编译进内核也可以作为模块使用时再加载,Linux设备驱动程序的动态可加载基于Linux内核可以在运行时进行扩展这一特性[17],嵌入式系统开发中,为避免资源浪费,保证内核的小尺寸和灵活性,一般将驱动程序编译为独立的模块,当使用时,通过命令insmod向内核注册,连接正在运行的内核,当不再需要时。使用rmmod命令将驱动程序从内核中移除。

1.3 国内外发展及研究现状

1.3.1实时操作系统发展及现状

实时操作系统要求事件产生时,要以足够的速度来处理,而产生的结果又要在规定的时间内做出相应的响应。与普通操作系统相比,实时操作系统强调在要求的时间内完成指定的任务。

实时操作系统从上世纪六十年代开始研究[18],经历了早期、专用、通用实时操作系统几个阶段。早期实时操作系统是一个小、简单,且带有一定专用性的软件,功能弱,可认为是一种实时监控程序,为用户提供对系统的初始化管理以及简单的实时时钟管理,也有部分引入了任务调度及简单的任务间协调等功能包括有RTM X 等;随着应用

华中科技大学硕士学位论文

的不断发展,早期的实时操作系统越来越不能满足要求,一些实时系统的开发者开始研制并开发与特定的硬件相匹配的专用实时操作系统,在国外称为Real-T ime Operating Syst em Developed in House,一般只能适用于特定的硬件环境,缺乏严格的评测,移植性也不太好,属于这类实时操作系统的有Inte l公司的iMAX86 等。在各种专用RTO S 中,一些多任务的机制如基于优先级的调度、实时时钟管理、任务间的通信、同步互斥机构等基本上是相同的,不同的只是面向各自的硬件环境与应用目标,因此可以形成一个通用的实时操作内核。用户可根据不同的实时应用要求及硬件环境选择不同的软组件, 也使得实时操作系统开发商在开发过程中减少了重复性工作[18]。目前国内外比较流行的是通用实时操作系统。

而在嵌入式领域目前主流的实时操作系统有VxWorKs、PSOS、Windows CE、RTAI、Xenomai、RTLinux等,其中将普通Linux操作系统打上RTAI、Xenomai、RTLinux等实时系统补丁成为发展趋势。

1.3.2 Linux设备驱动程序发展及现状

Linux设备驱动程序是Linux内核中非常重要的部分,是内核与外设的接口。Linux 开源和可移植的特点也促进了驱动程序的开发,目前为止,大多数硬件设备都有开源的驱动程序模板,开发人员只需要根据硬件做适当的修改。

Linux操作系统应用越来广泛,外设种类也越来越多,在开源爱好者和各界人士的支持下已经有很好的积累[19],但相对于Windows下的驱动仍要慢一些,仍需要所有的Linux爱好者共同努力。

1.4 本文研究的主要内容

本文通过分析嵌入式数控系统功能需求,构建了以ARM和FPGA为核心芯片的嵌入式硬件平台,以Linux和实时子系统Xenomai构建的实时操作系统为基础的嵌入式软件平台,详细研究了Xenomai的实时工作原理,定制了Linux实时操作系统,实现了关键设备驱动程序,并对嵌入式系统进行相关测试应用。具体研究工作主要包括:(1)基于ARM ARM和实时Linux的嵌入式数控系统的整体方案设计,在分析目前通同用数控系统对Linux操作系统需求的基础上,设计基于ARM和FPGA的硬件平

华中科技大学硕士学位论文

台以及基于Linux和Xenomai实时操作系统的软件平台,分析RTDM实时驱动模型。

(2)定制Linux实时操作系统,基于硬件平台详细介绍启动加载程序u-boot-1.3.4及内核linux-2.6.33的定制和开发,阐述了根文件系统的制作过程并制作yaffs2形式文件系统。定制启动logo和操作系统软件的自动化下载。

(3)Linux操作系统的实时化,阐述Xenomai实时系统工作原理,分析RTDM实时驱动模型,实现Linux+Xenomai架构的实时操作系统。

(4)开发FPGA运动控制子系统接口驱动,实现应用程序对轴、IO、模拟量等运动接口的控制;开发人机交互接口LCD驱动程序,使操作系统支持群创7.0 TFT LCD 屏。

(5)以本文设计的数控系统硬件平台为测试环境,对Linux操作系统实时性能、运动控制子系统接口驱动、LCD控制器驱动、启动logo定制等进行测试。并给出嵌入式系统的在数控领域的成功应用案例。

华中科技大学硕士学位论文

2 嵌入式数控及Linux实时操作系统

2.1 嵌入式数控系统功能需求

随着技术的发展及人们需求的增加,数控系统功能从简单到复杂,功能可分为必选功能和可选功能两部分。必选功能是指数控系统拥有的功能,可选功能是依具体设备特点和使用需求增加的功能[20]。数控系统通常必须拥有的功能为控制功能、准备功能、插补功能、进给辅助功能、主轴功能、刀具功能、补偿功能、字符和图形显示功能、自诊功能能、通信功能、人机交互图形编程功能等[21]。数控系统设计者将这些功能有机的组合可以设计出不同的嵌入式数控系统以满足不同的用户需求。

数控系统是一个典型的多任务复杂系统,可分为主控制和运动控制两大部分,其丰富的功能,使得普通的单核处理器很难满足需求,多处理器的选择成为必然。主控制模块完成程序存储管理、显示管理等功能,选择ARM作为微处理器,外接SDRAM、NAND Flash、SPI、USB、LCD等模块;运动控制模块主要完成对伺服轴的控制、PLC的控制等,以FPGA (Field-Programmable Gate Array)为核心处理芯片,外接轴、I/O、AD/DA 等接口模块。

图2.1 数控系统任务划分

通过以上分析,数控系统硬件功能越来越多,相应的软件也越来越复杂,因此,必须使用操作系统。数控系统在性能上一方面要求能对某些外部信号做出及时响应;另一方面在伺服控制中,数控系统需要计算,发送指令,以减小插补误差,伺服控制周期必须准确且微小,一般应控制在10ms以内[10]。这就要求选择的操作系统应具备强稳定性,

华中科技大学硕士学位论文

弱交互性,强实时性,可伸缩性以及统一接口的特点。数控系统根据用户需求开发不同的应用程序,应用在不同机床上,如车床系统、玻璃刻花机、钻孔攻丝机等,系统启动时候的logo定制显得尤为重要。一般系统程序的烧录是通过终端、网络工具及操作系统支持的一些命令来手动完成,这显然是不科学也是不可取的,特别是在产品的批量化生产中,耗时耗力,开发一种软件来实现系统程序的自动下载成为一种必要。

Linux操作系统功能强大、设计完善、源代码开放、可以定制、支持多平台、免费,且具备多种实时化改造方案,在嵌入式操作系统中越来越流行。选择Linux操作系统,要对其进行实时化改造,使其具备实时性,要完成ARM微处理器对应外设的驱动开发,包括NAND Flash、SDRAM、USB、串口、LCD控制器及外接的FPGA运动控制设备等。并在实时操作系统的基础上完成logo定制及软件自动下载等定制化设计。

通过嵌入式数控系统的功能需求分析,本文要解决的关键技术包括:

(1)定制Linux实时操作系统;

(2)完成启动logo的定制化及下载软件的自动化开发;

(3)完成实时Linux操作系统关键外设驱动的开发。

2.2 嵌入式数控系统组成

本文硬件结构采用ARM+FPGA双处理架构,ARM做主控制部分处理器,负责运行数控系统软件,完成文件管理、加工程序解释、插补和系统诊断等功能、人机交互界面以及通讯管理等;采用可并行计算和可编程配置的FPGA作为辅助处理器,完成运动控制任务。

外围电路包括SDRAM、NAND Flash、显示器接口电路、以太网接口电路、USB 接口电路、串口接口电路,数字输入输出电路、轴控制电路、编码器反馈电路、模拟输入输出电路等。系统硬件框图如图2.2所示。

华中科技大学硕士学位论文

图2.2 系统硬件框图

其中ARM作为主控制芯片,外接一片SDRAM和两片NAND Flash作为存储部分,SDRAM作为操作系统和应用软件运行的空间,NAND Flash用来存储各种镜像文件。同时设计了外围接口LCD、键盘、串口等,方便数控系统的人机交互以及系统调试;网络接口用于实现数控系统的网络功能,便于多台设备间的通信及数控代码的传输;USB 接口实现U盘的读写及外接标准USB键盘。FPGA外接在ARM外部存储器上。

FPGA作为ARM的辅助处理器,扩展数字输入输出、轴控制、模拟量输入输出等接口,可实时完成数字输入输出的扫描和刷新、模拟输入输出的扫描和刷新、编码器计数和产生控制驱动器的PWM波等,由于FPGA并行计算的特点,这些模块都是同时、独立工作的,没有相互干扰,可以保证系统的精度。

ARM和FPGA之间通过高速并行总线通信,它们之间通过FPGA内部嵌入式双口RAM交换数据,FPGA上连接的所有接口资源对ARM来说都是一组寄存器,ARM只需要通过高速总线来访问这些寄存器,这样可以极大的减轻主处理器的负担,提高系统性能。

2.3 Linux实时操作系统及设备驱动模型

本文的嵌入式控系统需要具备访问硬件接口、图形显示、实时任务调度、USB下载、网络传输等功能。数控系统软件开发主要包括基于Linux实时操作系统的人机界面程序

华中科技大学硕士学位论文

开发、应用程序开发、以及各种Linux驱动程序的开发和移植。可以分为实时操作系统层,包括Linux实时系统及开发的相关驱动程序;数控核心库层(nck),包括数控核心库及图形库等;接口层(ncapi)和应用层(app)这几个层次。实时操作系统层采用Linux+Xenomai的双内核机制实现。Linux实时操作系统通过驱动程序来访问硬件,驱动程序屏蔽硬件细节为上层应用提供统一接口,FB driver为图形显示模块驱动程序,nc_driver.ko为轴、IO等运动端口驱动模块。图形引擎指图形库,nck则指函数库以及数控系统函数接口、字符库等。ncgui与ncapi是为应用程序提供的接口。Gui app则是基于gui的应用程序。

图2.3 系统软件框图

Xenomai是一个可紧密地与Linux内核整合在一起的实时子系统,是一种采用双内核机制的Linux内核的强实时扩展。支持在具有“存储器管理单元”(MMU)保护的用户空间执行实时程序。Xenomai创建于2001年[22],可以执行在若干架构的嵌入式平台,可以跟两个主要的Linux内核版本(2.4和2.6)结合。它与Linux内核共同运行在硬件平台上,优先级高于Linux内核,负责处理实时任务。Xenomai 基于Adeos(Adaptive Domain Environment for Operating System)实现双内核机制,Adeos是在已有的操作系统

华中科技大学硕士学位论文

下插入的一个软件层,通过向上层多个操作系统提供某些原语和机制而实现硬件共享,为操作系统提供一个灵活的、可扩展的自适应环境[23]。使Linux和Xenomai双系统可以共同运行在硬件之上。Adeos 的设计目标是为操作系统提供一个灵活的、可扩展的自适应环境。为了实现对中断的管理和域之间的优先级控制,Adeos 使用了中断管道(Interrupt Pipe)的概念。Adeos先调度Xenomai 对中断进行处理、执行中断相应的实时任务,只有当Xenomai 没有实时任务和中断需要处理的时候,Adeos 才会调度Linux 运行。

Linux+Xenomai实时系统组织架构如图2.4所示。

图2.4 Linux+Xenoami实时系统组织架构

Linux与Xenomai双系统通过ADEOS层共同运行在硬件平台之上,Linux负责用户程序的标准Linux调度,处理普通的Linux任务;Xenomai则负责用户空间的实时任务调度,处理系统中的实时任务。基于Xenomai、Linux和Adeos的Linux实时操作系统软件层次关系如图2.5所示。

ADEOS直接工作在硬件之上,管理硬件中断;位于Adeos之上的是硬件与系统抽象层,包括了Xenomai移植时需要用到的所有CPU及平台相关的程序代码。系统的核心部分是实时操作系统内核,提供了一系列的通用RTOS服务,这些服务可由Xenomai 的本地API或建立在实时内核之上针对其它传统RTOS的客户API提供,如:VxWorks、pSOS、VRTX、POSIX、RTDM等。Xenomai系统为用户程序提供了用户空间和内核空间两种模式,保证了系统的软实时性和硬实时性[24][26]。

华中科技大学硕士学位论文

图2.5 实时操作系统软件层析关系

一个Xenomai线程,在任何特定的时刻,若不是完全受到Xenomai Co-Kernel的控制,就是完全受到Linux内核的控制。实时任务的双内核支持如图2.6所示,它们之间传递的是各种中断、系统调用以及请求它们提供服务的其它事件,这些信号首先被Xenomai实时系统域拦截,判断是否为实时任务调度,若不是实时任务则会进入Linux 域,被当做普通任务来处理。

图2.6 实时任务双核支持

RTDM(Real-Time Driver Model)即实时驱动模型,为Linux实时操作系统下的驱动开发提供了标准框架。为实时Linux设备驱动程序以及应用程序的开发提供统一的接口。RTDM相当于连接应用程序与设备驱动程序的中介层。Xenomai支持RTDM实时驱动模块,后文中对FPGA运动控制模块的驱动开发就是基于此模型。RTDM在实时操作系统中所处的位置如图2.7所示。

华中科技大学硕士学位论文

图2.7 RTDM在实时系统中的位置

RTDM是在普通设备驱动程序之上,基于Xenomai抽象出来的接口函数,为用户空间的实时任务调度提供标准函数接口。

2.4 本章小结

本章首先分析了嵌入式数控系统功能需求,然后对系统硬件进行了设计,包括核心芯片的选择及外围电路的设计。分析了Xenomai实时子系统工作原理,研究了Linux+Xenomai的实时操作系统组成架构及RTDM实时驱动模型,为下文基于RTDM 的驱动程序开发提供依据。

Linux设备驱动程序举例

Linux设备驱动程序设计实例2007-03-03 23:09 Linux系统中,设备驱动程序是操作系统内核的重要组成部分,在与硬件设备之间 建立了标准的抽象接口。通过这个接口,用户可以像处理普通文件一样,对硬件设 备进行打开(open)、关闭(close)、读写(read/write)等操作。通过分析和设计设 备驱动程序,可以深入理解Linux系统和进行系统开发。本文通过一个简单的例子 来说明设备驱动程序的设计。 1、程序清单 //MyDev.c 2000年2月7日编写 #ifndef __KERNEL__ #define __KERNEL__//按内核模块编译 #endif #ifndef MODULE #define MODULE//设备驱动程序模块编译 #endif #define DEVICE_NAME "MyDev" #define OPENSPK 1 #define CLOSESPK 2 //必要的头文件 #include //同kernel.h,最基本的内核模块头文件 #include //同module.h,最基本的内核模块头文件 #include //这里包含了进行正确性检查的宏 #include //文件系统所必需的头文件 #include //这里包含了内核空间与用户空间进行数据交换时的函数宏 #include //I/O访问 int my_major=0; //主设备号 static int Device_Open=0; static char Message[]="This is from device driver"; char *Message_Ptr; int my_open(struct inode *inode, struct file *file) {//每当应用程序用open打开设备时,此函数被调用 printk ("\ndevice_open(%p,%p)\n", inode, file); if (Device_Open) return -EBUSY;//同时只能由一个应用程序打开 Device_Open++; MOD_INC_USE_COUNT;//设备打开期间禁止卸载 return 0; } static void my_release(struct inode *inode, struct file *file)

(整理)嵌入式系统的以太网接口设计及linux内核网络设备驱动.

嵌入式系统的以太网接口设计及linux驱动 1 以太网概述 以太网(Ethernet)是当今局域网采用的最通用的通信协议标准。在以太网中,所有计算机被连接在一条电缆上,采用带冲突检测的载波侦听多路访问(CSMA/CD)方法,采用竞争机制和总线拓扑结构。基本上,以太网由共享传输媒体,如双绞线电缆或同轴电缆、多端口集线器、网桥或交换机构成。 按照OSI(Open System Interconnection Reference Model,开放式系统互联参考模型)7层参考模型,以太网定义的是物理层(PHY)和数据链路层(对应以太网的MAC层)的标准。 2 嵌入式处理器上扩展以太网接口 以太网接口控制器主要包括MAC乘PHY两部分,如图1所示为嵌入式处理器集成MAC层控制器。 MAC层控制器和PHY的连接是通过MII、RMII等接口实现的。在IEEE802的标准系列中,数据链路层包括LLC和MAC两个子层。其中MAC负责完成数据帧的封装、解封、发送和接受功能。PHY层的结构随着传输速率的不同而有一定的差异。对于1OBaseT等网络,从以太网PHY芯片输出的就是传输所需的差分信号。但是还需要一个网络隔离变压器组成图2的结构。网络隔离变压器可起到抑制共模干扰、隔离线路以及阻抗匹配等作用。 本文介绍一种新款网络接口芯片DM9000A,它可以很方便的实现与嵌入式CPU的接口,实现扩展以太网口的功能。DM9000A是中国台湾DAVICOM公司推出的一款高速以太网接口芯片,其基本特征是:集成10/100M物理层接口;内部带有16K字节SRAM用作接收发送的FIFO缓存;支持8/16bit两种主机工作模式:

linux驱动开发的经典书籍

linux驱动开发的经典书籍 结构、操作系统、体系结构、编译原理、计算机网络你全修过 我想大概可以分为4个阶段,水平从低到高 从安装使用=>linux常用命令=>linux系统编程=>内核开发阅读内核源码 其中学习linux常用命令时就要学会自己编译内核,优化系统,调整参数 安装和常用命令书太多了,找本稍微详细点的就ok,其间需要学会正则表达式 系统编程推荐《高级unix环境编程》,黑话叫APUE 还有《unix网络编程》 这时候大概还需要看资料理解elf文件格式,连接器和加载器,cmu的一本教材中文名为《深入理解计算机系统》比较好 内核开发阅读内核源码阶段,从写驱动入手逐渐深入linux内核开发 参考书如下《linux device drivers》,黑话叫ldd 《linux kernel development》,黑话叫lkd 《understading the linux kernel》,黑话叫utlk 《linux源码情景分析》 这四本书为搞内核的必读书籍 最后,第三阶段和第四阶段最重动手,空言无益,光看书也不罩,不动手那些东西理解不了 学习linux/unix编程方法的建议 建议学习路径: 首先先学学编辑器,vim, emacs什么的都行。 然后学make file文件,只要知道一点就行,这样就可以准备编程序了。 然后看看《C程序设计语言》K&R,这样呢,基本上就可以进行一般的编程了,顺便找本数据结构的书来看。 如果想学习UNIX/LINUX的编程,《APUE》绝对经典的教材,加深一下功底,学习《UNP》的第二卷。这样基本上系统方面的就可以掌握了。 然后再看Douglus E. Comer的《用TCP/IP进行网际互连》第一卷,学习一下网络的知识,再看《UNP》的第一卷,不仅学习网络编程,而且对系统编程的一些常用的技巧就很熟悉了,如果继续网络编程,建议看《TCP/IP进行网际互连》的第三卷,里面有很多关于应用

Linux网络设备驱动开发实验

实验三:Linux网络设备驱动开发实验 一、实验目的 读懂linux网络设备驱动程序例子,并且实际加载驱动程序,加载进操作系统以后,会随着上层应用程序的触发而执行相应动作,具体执行的动作可以通过代码进行改变。 ●读懂源码及makefile ●编译驱动程序 ●加载 ●多种形式触发动作 二、预备知识 熟悉linux驱动基本原理,能读懂简单的makefile。 三、实验预计时间 80-120分钟左右 四、驱动程序部分具体步骤 要求读懂一个最简单的驱动程序,在驱动程序的诸如“xxx_open”、“xxx_read”等标准接口里面加入打印语句。可参考多模式教学网上的驱动样例。 五、用于触发驱动动作的应用程序及命令 驱动程序就是以静态的标准接口库函数形式存在,网络设备驱动会受到两大类情况的触发,一种是linux里面的控制台里面的命令,另一种是套接口应用程序,首先要搞清都有哪些具体的命令和应用程序流程,应用程序参考多模式教学网的例子。 六、运行测试 提示:需要将驱动程序以dll加载进系统中,并且触发应用程序调用各种文件操作的接口函数,使得驱动有所动作,打印出相关信息。 1.编译驱动: cd /某某目录/vnetdev/ make clean make 2.加载驱动与打开网卡: insmod netdrv.ko

ifconfig vnet0 up 3.运行应用程序 ../raw 4.通过命令“修改网卡MTU”触发驱动执行动作: ifconfig vnet0 mtu 1222 5.显示内核打印: cat /var/log/messages 6.卸载: ifconfig vnet0 down rmmod netdrv.ko 7.修改代码中的某些函数中的打印信息,重新试验上述流程。 至此大家都应该真正理解和掌握了驱动程序-操作系统-应用程序的三者联动机制。 七、实验结果 由图可知能正常加载网卡驱动,并且能够打印调试信息。

linux设备驱动中常用函数

Linux2.6设备驱动常用的接口函数(一) ----字符设备 刚开始,学习linux驱动,觉得linux驱动很难,有字符设备,块设备,网络设备,针对每一种设备其接口函数,驱动的架构都不一样。这么多函数,要每一个的熟悉,那可多难啦!可后来发现linux驱动有很多规律可循,驱动的基本框架都差不多,再就是一些通用的模块。 基本的架构里包括:加载,卸载,常用的读写,打开,关闭,这是那种那基本的咯。利用这些基本的功能,当然无法实现一个系统。比方说:当多个执行单元对资源进行访问时,会引发竞态;当执行单元获取不到资源时,它是阻塞还是非阻塞?当突然间来了中断,该怎么办?还有内存管理,异步通知。而linux 针对这些问题提供了一系列的接口函数和模板框架。这样,在实际驱动设计中,根据具体的要求,选择不同的模块来实现其功能需求。 觉得能熟练理解,运用这些函数,是写号linux设备驱动的第一步。因为是设备驱动,是与最底层的设备打交道,就必须要熟悉底层设备的一些特性,例如字符设备,块设备等。系统提供的接口函数,功能模块就像是工具,能够根据不同的底层设备的的一些特性,选择不同的工具,方能在linux驱动中游刃有余。 最后就是调试,这可是最头疼的事。在调试过程中,总会遇到这样,那样的问题。怎样能更快,更好的发现并解决这些问题,就是一个人的道行咯!我个人觉得: 发现问题比解决问题更难! 时好时坏的东西,最纠结! 看得见的错误比看不见的错误好解决! 一:Fops结构体中函数: ①ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); 用来从设备中获取数据. 在这个位置的一个空指针导致 read 系统调用以-EINVAL("Invalid argument") 失败. 一个非负返回值代表了成功读取的字节数( 返回值是一个 "signed size" 类型, 常常是目标平台本地的整数类型). ②ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); 发送数据给设备. 如果 NULL, -EINVAL 返回给调用 write 系统调用的程序. 如果非负, 返回值代表成功写的字节数 ③loff_t (*llseek) (struct file *, loff_t, int); llseek 方法用作改变文件中的当前读/写位置, 并且新位置作为(正的)返回值. loff_t 参数是一个"long offset", 并且就算在 32位平台上也至少 64 位宽. 错误由一个负返回值指示. 如果这个函数指针是 NULL, seek 调用会以潜在地无法预知的方式修改 file 结构中的位置计数器( 在"file 结构" 一节中描述). ④int (*open) (struct inode *, struct file *);

linux驱动程序的编写

linux驱动程序的编写 一、实验目的 1.掌握linux驱动程序的编写方法 2.掌握驱动程序动态模块的调试方法 3.掌握驱动程序填加到内核的方法 二、实验内容 1. 学习linux驱动程序的编写流程 2. 学习驱动程序动态模块的调试方法 3. 学习驱动程序填加到内核的流程 三、实验设备 PentiumII以上的PC机,LINUX操作系统,EL-ARM860实验箱 四、linux的驱动程序的编写 嵌入式应用对成本和实时性比较敏感,而对linux的应用主要体现在对硬件的驱动程序的编写和上层应用程序的开发上。 嵌入式linux驱动程序的基本结构和标准Linux的结构基本一致,也支持模块化模式,所以,大部分驱动程序编成模块化形式,而且,要求可以在不同的体系结构上安装。linux是可以支持模块化模式的,但由于嵌入式应用是针对具体的应用,所以,一般不采用该模式,而是把驱动程序直接编译进内核之中。但是这种模式是调试驱动模块的极佳方法。 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。同时,设备驱动程序是内核的一部分,它完成以下的功能:对设备初始化和释放;把数据从内核传送到硬件和从硬件读取数据;读取应用程序传送给设备文件的数据和回送应用程序请求的数据;检测和处理设备出现的错误。在linux操作系统下有字符设备和块设备,网络设备三类主要的设备文件类型。 字符设备和块设备的主要区别是:在对字符设备发出读写请求时,实际的硬件I/O一般就紧接着发生了;块设备利用一块系统内存作为缓冲区,当用户进程对设备请求满足用户要求时,就返回请求的数据。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。 1 字符设备驱动结构 Linux字符设备驱动的关键数据结构是cdev和file_operations结构体。

一个简单的演示用的Linux字符设备驱动程序.

实现如下的功能: --字符设备驱动程序的结构及驱动程序需要实现的系统调用 --可以使用cat命令或者自编的readtest命令读出"设备"里的内容 --以8139网卡为例,演示了I/O端口和I/O内存的使用 本文中的大部分内容在Linux Device Driver这本书中都可以找到, 这本书是Linux驱动开发者的唯一圣经。 ================================================== ===== 先来看看整个驱动程序的入口,是char8139_init(这个函数 如果不指定MODULE_LICENSE("GPL", 在模块插入内核的 时候会出错,因为将非"GPL"的模块插入内核就沾污了内核的 "GPL"属性。 module_init(char8139_init; module_exit(char8139_exit; MODULE_LICENSE("GPL"; MODULE_AUTHOR("ypixunil"; MODULE_DESCRIPTION("Wierd char device driver for Realtek 8139 NIC"; 接着往下看char8139_init( static int __init char8139_init(void {

int result; PDBG("hello. init.\n"; /* register our char device */ result=register_chrdev(char8139_major, "char8139", &char8139_fops; if(result<0 { PDBG("Cannot allocate major device number!\n"; return result; } /* register_chrdev( will assign a major device number and return if it called * with "major" parameter set to 0 */ if(char8139_major == 0 char8139_major=result; /* allocate some kernel memory we need */ buffer=(unsigned char*(kmalloc(CHAR8139_BUFFER_SIZE, GFP_KERNEL; if(!buffer { PDBG("Cannot allocate memory!\n"; result= -ENOMEM;

《Linux设备驱动开发详解:基于最新的Linux 4.0内核》19. Linux电源管理系统架构和驱动

以下电子书来源于宋宝华《Linux设备驱动开发详解:基于最新的Linux 4.0内核》第19章《Linux电源管理系统架构和驱动》 本章导读 Linux在消费电子领域的应用已经铺天盖地,而对于消费电子产品而言,省电是一个重要的议题。 本章将介绍Linux设备树(Device Tree)的起源、结构和因为设备树而引起的驱动和BSP 变更。 19.1节阐述了Linux电源管理的总体架构。 19.2~19.8节分别论述了CPUFreq、CPUIdle、CPU热插拔以及底层的基础设施Regulator、OPP以及电源管理的调试工具PowerTop。 19.9节讲解了系统Suspend to RAM的过程以及设备驱动如何提供对Suspend to RAM的支持。 19.10节讲解了设备驱动的Runtime suspend。 本章是相对《Linux设备驱动开发详解(第2版)》全新的一章内容,也是Linux设备驱动工程师必备的知识体系。

第十九章Linux电源管理系统架构和驱动 1.Linux电源管理全局架构 Linux电源管理非常复杂,牵扯到系统级的待机、频率电压变换、系统空闲时的处理以及每个设备驱动对于系统待机的支持和每个设备的运行时电源管理,可以说和系统中的每个设备驱动都息息相关。 对于消费电子产品来说,电源管理相当重要。因此,这部分工作往往在开发周期中占据相当大的比重,图19.1呈现了Linux内核电源管理的整体架构。大体可以归纳为如下几类: 1.CPU在运行时根据系统负载进行动态电压和频率变换的CPUFreq 2.CPU在系统空闲时根据空闲的情况进行低功耗模式的CPUIdle 3.多核系统下CPU的热插拔支持 4.系统和设备对于延迟的特别需求而提出申请的PM QoS,它会作用于CPUIdle的具体 策略 5.设备驱动针对系统Suspend to RAM/Disk的一系列入口函数 6.SoC进入suspend状态、SDRAM自刷新的入口 7.设备的runtime(运行时)动态电源管理,根据使用情况动态开关设备 8.底层的时钟、稳压器、频率/电压表(OPP模块完成)支撑,各驱动子系统都可能用 到 图19.1 Linux电源管理系统架构 2.CPUFreq驱动 CPUFreq子系统位于drivers/cpufreq目录,负责进行运行过程中CPU频率和电压的动态

Linux驱动工程师成长之路

本人此刻还不是什么驱动工程师,连入门都谈不上,但我坚信在未来的3-5年我肯定能成为我想像中的人,因为我马上就要进入这一行工作了。写下这个日志来记录我是怎么最后成为我想像中的人才的,呵呵。 《Linux驱动工程师》这个东西是我在大二的时候看到有一篇讲如何学习嵌入式的,点击这里下载PDF,里面讲到嵌入式分为四层:硬件,驱动,系统,应用程序;还说linux驱动最难然后工资也最高就冲着他这句话我就决定我大学毕业的时候要去做这个linux驱动工程师,随后我就先后买了51单片机,ARM7,ARM9还有一大堆的视频教程准备来进行学习。我还跟我旁边那个哈工大哥们说:“我们学校像我这样的人很少,你们学校呢?”他说:“太少了,不过我们学校都是做这种板子卖的人比较多!”。行,你们牛!即使是买了这些东西,从大二到现在都快毕业了但感觉还是没有入门。回想一下我都学过什么啊:1:自己在ARM9上写bootloader(主要锻炼了三方面的知识:C语言应该写了有近万行的代码,ARM9的外设的基本操作方法如UART,LCD,TOUCH,SD,USB,ETHERNET...,makefile);2:移植和学习linux驱动。下面我说一下我学习Linux驱动的一个思路这也是我在面试的时候自我介绍中最重要的部分;1:硬件知识学习Linux驱动首先得了解这个驱动对应的硬件的一些基本原理和操作方法比如LCD你得了解它的场同步,行同步,像素时钟,一个像素的表示模式,还有就是这个LCD是怎么把图像显示在屏幕上的。如果是USB,SD卡就得了解相关协议。可以通过spec(协议)、datasheet来了解,这就是传说中的Linux驱动开发三件宝之二,还有一个就是linux相关源码。2:了解linux驱动框架linux下的每一类驱动差不多都是一个比较完善的子系统,比如FLASH的驱动它就属于MTD子系统从上到下分为四层:设备节点层,设备层,原始设备层,最下面的与具体硬件相关的硬件驱动层,通常要我们自己来实现就是最下面这个与具体硬件相关那部分代码。3:了解这个驱动的数据流。这个过程与第二个过程紧密相关,如果了解了驱动的框架差不多这个过程也算了解了。比如flash.在/dev/目录下有对应flash的字符设备文件和块设备文件,用户对这些文件进行读、写、ioctl操作,其间通过层层的函数调用最终将调用到最下面的硬件驱动层对硬件进行操作。了解这个过程我相信在调试驱动的时候是很有帮助。3:分析与硬件相关通常需要我们实现的那部分源代码。4:三板子上将驱动调试出来。每次调试都会出问题,但我买的板子提供的资料比较全调试过程中遇到的问题都比较浅显,即使是浅显的问题也要把它记录下来。(这个是我上次在华为面试的时候,那个人问我你调试驱动遇到过什么问题吗?你是如何解决的。当时我学习还没有到调试驱动这一步,所以那次面试也惨败收场)。 好像说了这么多,还没有进入正题《工作的选择》。在年前去了龙芯,实习2.8K,转正3.5k,环境还是不错,经理很好,头儿也很帅都是中科院的硕士。不过去了两周我就没去了身边的人都不太理解,我也一度有过后悔的时候,从龙芯出来应该是1月6号,也就是从那个时候开始我就没有再找工作,转而学习linux驱动。一直到上周日。上周日的晚上我就开始投简历一开始要找linux驱动,在智联里面输入linux驱动出来500来个职位,点开一看没有一个自己符合要求的,差不多都要3-5年经验本科,有时候好不容易有个实习的关键字在里面,一看要求硕士,严重打击了我的信心,哎不管了随便投,最后又投了一下嵌入式关键字的职位。最后就瞎申请,看看职位要求差不多就申请。周一来了,这周一共来了6个面试,创下了我求职以来的历史新高。周一下午面了一家感觉还不错不过到现在也没有给我一个通知,估计当时我要了4500把他给要跑了,这家是做测量的不是Linux驱动,差不多是把ARM当单片机用。周二上午一家也是要招linux驱动面了估计不到二分钟,他

从零开始搭建Linux驱动开发环境

参考: 韦东山视频第10课第一节内核启动流程分析之编译体验 第11课第三节构建根文件系统之busybox 第11课第四节构建根文件系统之构建根文件系统韦东山书籍《嵌入式linux应用开发完全手册》 其他《linux设备驱动程序》第三版 平台: JZ2440、mini2440或TQ2440 交叉网线和miniUSB PC机(windows系统和Vmware下的ubuntu12.04) 一、交叉编译环境的选型 具体的安装交叉编译工具,网上很多资料都有,我的那篇《arm-linux- gcc交叉环境相关知识》也有介绍,这里我只是想提示大家:构建跟文件系统中所用到的lib库一定要是本系统Ubuntu中的交叉编译环境arm-linux- gcc中的。即如果电脑ubuntu中的交叉编译环境为arm-linux-

二、主机、开发板和虚拟机要三者互通 w IP v2.0》一文中有详细的操作步骤,不再赘述。 linux 2.6.22.6_jz2440.patch组合而来,具体操作: 1. 解压缩内核和其补丁包 tar xjvf linux-2.6.22.6.tar.bz2 # 解压内核 tar xjvf linux-2.6.22.6_jz2440.tar.bz2 # 解压补丁

cd linux_2.6.22.6 patch –p1 < ../linux-2.6.22.6_jz2440.patch 3. 配置 在内核目录下执行make 2410_defconfig生成配置菜单,至于怎么配置,《嵌入式linux应用开发完全手册》有详细介绍。 4. 生成uImage make uImage 四、移植busybox 在我们的根文件系统中的/bin和/sbin目录下有各种命令的应用程序,而这些程序在嵌入式系统中都是通过busybox来构建的,每一个命令实际上都是一个指向bu sybox的链接,busybox通过传入的参数来决定进行何种命令操作。 1)配置busybox 解压busybox-1.7.0,然后进入该目录,使用make menuconfig进行配置。这里我们这配置两项 一是在编译选项选择动态库编译,当然你也可以选择静态,不过那样构建的根文件系统会比动态编译的的大。 ->Busybox Settings ->Build Options

Linux网络设备驱动

嵌入式培训专家
Linux网络设备驱动
主讲:宋宝华
https://www.wendangku.net/doc/7d4875222.html,

华清远见
今天的内容
vLinux网络设备驱动架构 vLinux网络设备驱动数据流程
? NON-NAPI模式数据接收流程 ? NAPI模式数据接收流程 ? 数据发送流程
vLinux网络协议栈的实现
? TCP/UDP/IP/MAC各层数据传递 ? 网络系统调用与socket

华清远见
Linux网络设备驱动架构

华清远见
net_device
struct net_device_ops { int (*ndo_open)(struct net_device *dev); int (*ndo_start_xmit) (struct sk_buff *skb, struct net_device *dev); int (*ndo_set_mac_address)(struct net_device *dev, void *addr); int (*ndo_do_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd); void (*ndo_tx_timeout) (struct net_device *dev); ... }
struct net_device { struct net_device_stats stats; const struct net_device_ops *netdev_ops; const struct ethtool_ops *ethtool_ops; ... }
struct ethtool_ops { int (*get_settings)(struct net_device *, struct ethtool_cmd *); int (*set_settings)(struct net_device *, struct ethtool_cmd *); void (*get_drvinfo)(struct net_device *, struct ethtool_drvinfo *); int (*get_regs_len)(struct net_device *); ... }

Linux设备驱动程序简介

第一章Linux设备驱动程序简介 Linux Kernel 系统架构图 一、驱动程序的特点 ?是应用和硬件设备之间的一个软件层。 ?这个软件层一般在内核中实现 ?设备驱动程序的作用在于提供机制,而不是提供策略,编写访问硬件的内核代码时不要给用户强加任何策略 o机制:驱动程序能实现什么功能。 o策略:用户如何使用这些功能。 二、设备驱动分类和内核模块 ?设备驱动类型。Linux 系统将设备驱动分成三种类型 o字符设备 o块设备 o网络设备 ?内核模块:内核模块是内核提供的一种可以动态加载功能单元来扩展内核功能的机制,类似于软件中的插件机制。这种功能单元叫内核模块。 ?通常为每个驱动创建一个不同的模块,而不在一个模块中实现多个设备驱动,从而实现良好的伸缩性和扩展性。 三、字符设备 ?字符设备是个能够象字节流<比如文件)一样访问的设备,由字符设备驱动程序来实现这种特性。通过/dev下的字符设备文件来访问。字符设备驱动程序通常至少需要实现 open、close、read 和 write 等系统调用 所对应的对该硬件进行操作的功能函数。 ?应用程序调用system call<系统调用),例如:read、write,将会导致操作系统执行上层功能组件的代码,这些代码会处理内核的一些内部 事务,为操作硬件做好准备,然后就会调用驱动程序中实现的对硬件进 行物理操作的函数,从而完成对硬件的驱动,然后返回操作系统上层功 能组件的代码,做好内核内部的善后事务,最后返回应用程序。 ?由于应用程序必须使用/dev目录下的设备文件<参见open调用的第1个参数),所以该设备文件必须事先创建。谁创建设备文件呢? ?大多数字符设备是个只能顺序访问的数据通道,不能前后移动访问指针,这点和文件不同。比如串口驱动,只能顺序的读写设备。然而,也 存在和数据区或者文件特性类似的字符设备,访问它们时可前后移动访

linux驱动基础试题

L i n u x驱动基础试题(时间:1个小时) 一、选择题(每题4分,共40分,包括单选和多选,多选、少选均不得分) 1.Linux系统中将设备进行分类管理,下列设备中(ACD)属于字符设备,(BC)属于块设备 [A]键盘[B]硬盘[C]闪存设备[D]帧缓存设备[E]网卡 2.Linux系统中,内核以(D)区分设备 [A]设备节点名[B]设备节点号[C]设备名称[D]设备号 3.Linux系统中设备节点可以创建在(A) [A]/dev目录下[B]根目录下[C]/tmp目录下[E]以上都可以 4.Linux驱动程序运行在(A) [A]内核空间[B]用户空间[C]用户空间和内核空间 5.Linux系统中设备驱动程序是以模块形式组织的,编译驱动时可以用哪种方式编译(AB) [A]静态编译进内核[B]动态编译 6.内核中,设备的主设备号用(B)位来表示,次设备号用(D)位来表示 [A]8[B]12[C]16[D]20[E]24[F]32 7.Linux系统中哪些种类的设备有设备节点(BD) [A]定时器[B]字符设备[C]块设备[D]网络设备 8.通常情况下,kmalloc函数能分配的最大内存是(C) [A]4K[B]64K[C]128K[D]4M 9.能保证物理空间上连续的内存分配函数是(AB) [A]__get_free_pages[B]kmalloc[C]vmalloc[D]malloc 10.Linux系统中通过add_timer添加的timer是(A) [A]一次的[B]循环的[C]以上两种都可以 二、简答题(每题6分,共60分) 系统中以模块方式组织设备驱动程序,请列举在一个模块程序中必不可少的组成部分。(可以写个Helloworld模块的程序) 2.请从定义、性质、操作方式等方面对比说明字符设备和块设备。 3.请列举Linux设备驱动程序中,程序延缓执行的机制。 4.简述Linux设备驱动中使用中断的步骤。 5.简述信号量和自旋锁的异同和使用时的注意事项。 6.简述命令mknod/dev/zeroc15的做用和命令各个部分的含义,并写出创建一个块设备节点的命令。 7.简述命令insmod,rmmod,lsmod的功能。 8.驱动程序中采用动态申请设备号的,我们如何得到对应设备的设备号? 9.简述设备驱动程序和普通应用程序的异同点。 10.简述mmap机制的作用和使用mmap的好处。

如何实现Linux设备驱动模型

文库资料?2017 Guangzhou ZHIYUAN Electronics Stock Co., Ltd. 如何实现Linux 设备驱动模型 设备驱动模型,对系统的所有设备和驱动进行了抽象,形成了复杂的设备树型结构,采用面向对象的方法,抽象出了device 设备、driver 驱动、bus 总线和class 类等概念,所有已经注册的设备和驱动都挂在总线上,总线来完成设备和驱动之间的匹配。总线、设备、驱动以及类之间的关系错综复杂,在Linux 内核中通过kobject 、kset 和subsys 来进行管理,驱动编写可以忽略这些管理机制的具体实现。 设备驱动模型的内部结构还在不停的发生改变,如device 、driver 、bus 等数据结构在不同版本都有差异,但是基于设备驱动模型编程的结构基本还是统一的。 Linux 设备驱动模型是Linux 驱动编程的高级内容,这一节只对device 、driver 等这些基本概念作介绍,便于阅读和理解内核中的代码。实际上,具体驱动也不会孤立的使用这些概念,这些概念都融合在更高层的驱动子系统中。对于大多数读者可以忽略这一节内容。 1.1.1 设备 在Linux 设备驱动模型中,底层用device 结构来描述所管理的设备。device 结构在文件中定义,如程序清单错误!文档中没有指定样式的文字。.1所示。 程序清单错误!文档中没有指定样式的文字。.1 device 数据结构定义 struct device { struct device *parent; /* 父设备 */ struct device_private *p; /* 设备的私有数据 */ struct kobject kobj; /* 设备的kobject 对象 */ const char *init_name; /*设备的初始名字 */ struct device_type *type; /* 设备类型 */ struct mutex mutex; /*同步驱动的互斥信号量 */ struct bus_type *bus; /*设备所在的总线类型 */ struct device_driver *driver; /*管理该设备的驱动程序 */ void *platform_data; /*平台相关的数据 */ struct dev_pm_info power; /* 电源管理 */ #ifdef CONFIG_NUMA int numa_node; /*设备接近的非一致性存储结构 */ #endif u64 *dma_mask; /* DMA 掩码 */ u64 coherent_dma_mask; /*设备一致性的DMA 掩码 */ struct device_dma_parameters *dma_parms; /* DMA 参数 */ struct list_head dma_pools; /* DMA 缓冲池 */ struct dma_coherent_mem *dma_mem; /* DMA 一致性内存 */ /*体系结构相关的附加项*/ struct dev_archdata archdata; /* 体系结构相关的数据 */ #ifdef CONFIG_OF

Linux 系统下4G 终端模块驱动的实现

龙源期刊网 https://www.wendangku.net/doc/7d4875222.html, Linux 系统下4G 终端模块驱动的实现 作者:邹龙王德志刘忠诚周治坤 来源:《电脑知识与技术》2015年第28期 摘要:文章分析了Linux系统的设备驱动原理,USB接口设备的驱动程序编写与内核编译原理,结合实例完成了4G模块的驱动程序与内核编译,并对编译后的Linux系统进行了验证,验证了系统内核能够正确识别4G模块并分配内存,成功实现了Linux系统的4G模块驱动。 关键词:Linux;设备驱动;4G;USB 中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2015)27-0206-04 Abstract: The device driver of Linux system is analyzed, and the USB interface device driver is compiled with the kernel principle. The 4G module is compiled with an example. The Linux system is verified by the 4G system. The system kernel can correctly identify the 4G module and allocate memory.. Key words: Linux; device driver; 4G; USB Linux系统以其良好的可剪裁性、强稳定性以及易操作等特点,已在物联网,程序控制,电子消费,智能家居等领域得到广泛的使用。4G网络的推广和应用也在各领域展开。因此,将Linux设备与4G网络有机地结合起来,为新一代物联网构造一个更加高速,更加安全,更加稳定的网络通信环境,将会成为一个应用热点。 本文介绍了一种Linux系统驱动4G模块的方法,Linux系统通过USB接口驱动4G终端 模块,实现4G网络的接入。首先,文章介绍了整体的软硬件应用环境,然后分析了Linux系统下的设备驱动以及USB接口设备驱动的编写原理,完成了4G终端模块在Linux系统中的驱动程序编写和内核编译,并且最后对驱动的内核烧入进行了验证性测试。 1 Linux系统设备驱动原理 当一个新的硬件设备接入Linux系统时[1],我们需要加载与其对应的驱动程序,之后驱动程序会根据自己的类型向Linux系统注册,注册成功后系统会为驱动程序配置与其类型相应的软件接口以及反馈一个主设备号给驱动程序,然后驱动程序会根据这个主设备号在/dev目录下创建一个设备文件,这样,我们就可以通过这个设备文件来对接入的硬件设备进行控制了。 1.1 Linux系统设备驱动类型

linux设备驱动

Linux设备驱动 操作系统的目的之一就是将系统硬件设备细节从用户视线中隐藏起来。例如虚拟文件系统对各种类型已安装的文件系统提供了统一的视图而屏蔽了具体底层细节。本章将描叙Linux核心对系统中物理设备的管理。 CPU并不是系统中唯一的智能设备,每个物理设备都拥有自己的控制器。键盘、鼠标和串行口由一个高级I/O芯片统一管理,IDE控制器控制IDE硬盘而SCSI控制器控制SCSI硬盘等等。每个硬件控制器都有各自的控制和状态寄存器(CSR)并且各不相同。例如Adaptec 2940 SCSI控制器的CSR与NCR 810 SCSI控制器完全不一样。这些CSR被用来启动和停止,初始化设备及对设备进行诊断。在Linux中管理硬件设备控制器的代码并没有放置在每个应用程序中而是由内核统一管理。这些处理和管理硬件控制器的软件就是设备驱动。Linux 核心设备驱动是一组运行在特权级上的内存驻留底层硬件处理共享库。正是它们负责管理各个设备。 设备驱动的一个基本特征是设备处理的抽象概念。所有硬件设备都被看成普通文件;可以通过和操纵普通文件相同的标准系统调用来打开、关闭、读取和写入设备。系统中每个设备都用一种特殊的设备相关文件来表示(device special file),例如系统中第一个IDE硬盘被表示成/dev/hda。块(磁盘)设备和字符设备的设备相关文件可以通过mknod命令来创建,并使用主从设备号来描叙此设备。网络设备也用设备相关文件来表示,但Linux寻找和初始化网络设备时才建立这种文件。由同一个设备驱动控制的所有设备具有相同的主设备号。从设备号则被用来区分具有相同主设备号且由相同设备驱动控制的不同设备。例如主IDE硬盘的每个分区的从设备号都不相同。如/dev/hda2表示主IDE 硬盘的主设备号为3而从设备号为2。Linux通过使用主从设备号将包含在系统调用中的(如将一个文件系统mount到一个块设备)设备相关文件映射到设备的设备驱动以及大量系统表格中,如字符设备表,chrdevs。 Linux支持三类硬件设备:字符、块及网络设备。字符设备指那些无需缓冲直接读写的设备,如系统的串口设备/dev/cua0和/dev/cua1。块设备则仅能以块为单位读写,典型的块大小为512或1024字节。块设备的存取是通过

Linux设备驱动程序说明介绍

Linux设备驱动程序简介 Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它dos或window环境下的驱动程序有很大的区别。在Linux环境下设计驱动程序,思想简洁,操作方便,功能也很强大,但是支持函数少,只能依赖kernel 中的函数,有些常用的操作要自己来编写,而且调试也不方便。本人这几周来为实验室自行研制的一块多媒体卡编制了驱动程序,获得了一些经验,愿与Linux fans共享,有不当之处,请予指正。 以下的一些文字主要来源于khg,johnsonm的Write linux device driver,Brennan's Guide to Inline Assembly,The Linux A-Z,还有清华BBS上的有关device driver的一些资料. 这些资料有的已经过时,有的还有一些错误,我依据自己的试验结果进行了修正. 一、Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作.设备驱动程序是内核的一部分,它完成以下的功能: 1.对设备初始化和释放. 2.把数据从内核传送到硬件和从硬件读取数据. 3.读取应用程序传送给设备文件的数据和回送应用程序请求的数据. 4.检测和处理设备出现的错误. 在Linux操作系统下有两类主要的设备文件类型,一种是字符设备,另一种是块设备.字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作.块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待. 已经提到,用户进程是通过设备文件来与实际的硬件打交道.每个设备文件都都有其文件属性(c/b),表示是字符设备还蔤强樯璞?另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他们.设备文件的的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序. 最后必须提到的是,在用户进程调用驱动程序时,系统进入核心态,这时不再是抢先式调度.也就是说,系统必须在你的驱动程序的子函数返回后才能进行其他的工作.如果你的驱动程序陷入死循环,不幸的是你只有重新启动机器了,然后就是漫长的fsck. 读/写时,它首先察看缓冲区的内容,如果缓冲区的数据 如何编写Linux操作系统下的设备驱动程序 二、实例剖析 我们来写一个最简单的字符设备驱动程序。虽然它什么也不做,但是通过它可以了解Linux的设备驱动程序的工作原理.把下面的C代码输入机器,你就会获得一个真正的设备驱动程序.不过我的kernel是2.0.34,在低版本的kernel上可能会出现问题,我还没测试过. [code]#define __NO_VERSION__

相关文档
相关文档 最新文档