




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于基于ARM和和linux的开发的开发2022-5-1华中科技大学华中科技大学 武汉创维特武汉创维特2提纲Linux简介Linux驱动程序设计Linux内核移植Linux开发过程第八章 基于ARM和Linux的开发Linux上的图形系统Linux开发环境建立Linux应用程序设计3LinuxLinux简介qLinux与与UNIX系统兼容,开放源代码。系统兼容,开放源代码。qLinux原本被设计为桌面系统,现在广泛应用于服务器领原本被设计为桌面系统,现在广泛应用于服务器领域。而更大的影响在于它正逐渐应用于嵌入式设备。域。而更大的影响在于它正逐渐应用于嵌入式设备。Linux可以说是最早的嵌入式可
2、以说是最早的嵌入式Linux发行版本。它是为没有发行版本。它是为没有MMU的的处理器而设计的,进而发展了一个完整的开发平台,包括编处理器而设计的,进而发展了一个完整的开发平台,包括编译、调试等工具。译、调试等工具。4LinuxLinux简介qLinux具有如下特性:具有如下特性:开源开源免费免费高度可裁剪:通常内核高度可裁剪:通常内核小于小于 512KBytes,文件系统可,文件系统可从几十从几十KBytes到几到几Mbytes不等,视应用程序大小而定。不等,视应用程序大小而定。q具有大量的开源的具有大量的开源的linux应用程序和驱动程序,并可应用程序和驱动程序,并可以方便地移植到各种平台,
3、包括以方便地移植到各种平台,包括ARM平台平台5Linux与uC/OS-II的区别 功能性Linux简介qLinux包含一整套的编译、调试等开发工具、内核源包含一整套的编译、调试等开发工具、内核源代码、各种文件系统、图形接口、各种协议、驱动程序代码、各种文件系统、图形接口、各种协议、驱动程序以及丰富的应用程序。以及丰富的应用程序。q而而uC/OS-II确切的来说只是一个确切的来说只是一个微内核微内核,仅仅包含多,仅仅包含多任务调度、简单内存管理等基本的多任务操作系统元素,任务调度、简单内存管理等基本的多任务操作系统元素,且多任务调度算法和内存管理等都比较简单。对于想实现且多任务调度算法和内存管
4、理等都比较简单。对于想实现GUI、FS、协议等都必须另外购买或者移植,对于设备驱、协议等都必须另外购买或者移植,对于设备驱动程序没有提供专门统一的接口。动程序没有提供专门统一的接口。6Linux与uC/OS-II的区别 开发工具Linux简介qLinux发布中包含了编译器和调试器等工具,它们都发布中包含了编译器和调试器等工具,它们都采用采用GCC编译器编译器,汇编语法一致。,汇编语法一致。quC/OS-II没有指定编译器,在不同的平台下使用该没有指定编译器,在不同的平台下使用该平台下的编译器,而各个编译器,其汇编语法不同,因平台下的编译器,而各个编译器,其汇编语法不同,因此,在不同类型平台下,
5、汇编程序不一致。此,在不同类型平台下,汇编程序不一致。7Linux与uC/OS-II的区别 开发资源Linux简介q在开发上,在开发上,Linux采用统一的采用统一的API调用,接口文档齐调用,接口文档齐全,书籍、网上资源也比较多。全,书籍、网上资源也比较多。quC/OS-II虽没有标准的虽没有标准的API接口,但是其内核非常简接口,但是其内核非常简单、简洁,且书籍、网上资源也非常丰富。单、简洁,且书籍、网上资源也非常丰富。8Linux与uC/OS-II的区别 移植性Linux简介qLinux发布中包含了多种平台下的移植,可以发布中包含了多种平台下的移植,可以通过配通过配置内核选择体系结构和裁
6、剪内核置内核选择体系结构和裁剪内核。quC/OS-II的不同平台下的移植通过不同的移植代码的不同平台下的移植通过不同的移植代码独立发布,没有一个统一的界面,通过宏定义进行内核独立发布,没有一个统一的界面,通过宏定义进行内核裁剪。裁剪。9Linux与uC/OS-II的区别 实时性Linux简介qLinux内核不关心实时性问题内核不关心实时性问题,可以通过和,可以通过和RTLinux配合来实现实时。配合来实现实时。RTLinux处理实时任务,非实时任务由处理实时任务,非实时任务由linux完成完成RTLinux是为是为linux提供实时性的方法,同样也适用提供实时性的方法,同样也适用于于Linux
7、。通过。通过RTLinux的的patch,可以满足,可以满足Linux对实时对实时性的需求性的需求quC/OS-II采用占先式内核,实时性好采用占先式内核,实时性好10Linux映像(image)文件结构Linux开发过程qLinux映像由映像由内核内核(kernel)和和文件系统文件系统(fs)组成。组成。q可以将可以将kernel和和fs统一编译到一个映像统一编译到一个映像(image)文件中,也文件中,也可以将可以将kernel和和fs独立地放置于不同的映像文件中独立地放置于不同的映像文件中(烧写到(烧写到FLASH的不同区域),这需要通过修改的不同区域),这需要通过修改Makefile
8、文件和内核文件和内核中的文件系统加载代码实现。中的文件系统加载代码实现。q本系统中本系统中kernel和和fs分别位于不同的映像文件中。分分别位于不同的映像文件中。分别为(别为(ramdisk.gz和和zImage)qLinux支持支持压缩核心压缩核心(zImage),它是对原核心映像文件,它是对原核心映像文件(linux.bin)进行压缩,并在压缩后的文件头部添加一段解压缩进行压缩,并在压缩后的文件头部添加一段解压缩代码。在该程序运行时,先运行这段解压缩代码将程序解压代码。在该程序运行时,先运行这段解压缩代码将程序解压缩到缩到Linux核心运行地址,完成后,跳转到核心运行。核心运行地址,完成
9、后,跳转到核心运行。11Linux内核组成Linux开发过程q初始化程序段初始化程序段(init段段) 约约32KBytes。q数据段数据段(data) 50100KBytes左右。左右。q代码段代码段(text) 300KBytes左右左右 q如果如果kernel和和fs编译在一起,内核映像还包含文件系统编译在一起,内核映像还包含文件系统(romfs) 80KBytesq未初始化数据段未初始化数据段(bss) 100150KBytes左右。左右。12Linux开发步骤Linux开发过程qBOOTLOADER开发开发qLinux开发环境建立开发环境建立qLinux内核移植内核移植q应用程序开发
10、应用程序开发13支持Linux开发的BOOTLOADERLinux开发过程q引导引导Linuxq烧写烧写Linux内核映像和文件系统内核映像和文件系统q初始化硬件初始化硬件14GNU交叉编译Linux开发环境建立qLinux采用采用GNU交叉编译器交叉编译器qGNU的交叉编译器,包括以下组件:的交叉编译器,包括以下组件:1. Gcc交叉编译器,即在宿主机上开发编译目标上可交叉编译器,即在宿主机上开发编译目标上可运行的二进制文件;运行的二进制文件;2. Binutils辅助工具,包括辅助工具,包括objdump、objcopy等;等;3. Gdb调试器。调试器。q对于对于ARM可以采用如下两个版
11、本的编译器:可以采用如下两个版本的编译器:arm-elf-arm-linux-15arm-elf- 交叉编译器Linux开发环境建立qarm-elf-gccqarm-elf-ldqarm-elf-asqarm-elf-objdumpqarm-elf-objcopyqarm-elf-gdb16arm-linux- 交叉编译器(推荐使用)Linux开发环境建立qarm-linux-gccqarm-linux-ldqarm-linux-asqarm-linux-objdumpqarm-linux-objcopyqarm-linux-gdb17选择Linux开发环境Linux开发环境建立qWindow
12、s环境环境 + CygwinqWindows环境环境 + VMWare虚拟机(安装虚拟机(安装RedHat 9.0)qLinux环境,推荐环境,推荐RedHat 9.0q单机模式(一台计算机)单机模式(一台计算机)q双机模式(两台计算机)双机模式(两台计算机)qWindows + Linux18在linux环境下进行Linux开发Linux开发环境建立q必须采用支持必须采用支持GDB的调试器(如的调试器(如ADT1000A)才能)才能进行调试,否则只能通过进行调试,否则只能通过BOOTLOADER进行简单的程进行简单的程序烧写运行等序烧写运行等q调试信息的打印可以通过串口完成,使用调试信息的打
13、印可以通过串口完成,使用linux下的下的minicom超级终端程序(类似于超级终端程序(类似于Windows上的超级终端工上的超级终端工具)接收并显示目标板传送的打印信息具)接收并显示目标板传送的打印信息qLinux的程序编辑、编译、调试都在的程序编辑、编译、调试都在Linux环境进行环境进行qLinux串口驱动完成后,可以通过内核打印函数串口驱动完成后,可以通过内核打印函数printk向串口打印信息,这是向串口打印信息,这是Linux内核调试过程中最有内核调试过程中最有效的手段效的手段19在Windows + Cygwin环境下进行Linux开发Linux开发环境建立qLinux内核配置和
14、编译等在内核配置和编译等在Cygwin环境下运行,程序环境下运行,程序编辑和调试都在编辑和调试都在Windows环境下进行环境下进行,必须采用支持,必须采用支持Windows下进行下进行linux调试的调试器(如调试的调试器(如ADT1000A)才)才能进行调试,否则只能通过能进行调试,否则只能通过BOOTLOADER进行简单的进行简单的程序烧写运行等程序烧写运行等q调试信息的打印可以通过串口完成,使用调试信息的打印可以通过串口完成,使用Windows上的超级终端工具接收并显示目标板传送的打印信息上的超级终端工具接收并显示目标板传送的打印信息qCygwin是运行于是运行于Windows中的一个
15、应用程序,它可中的一个应用程序,它可以使得以使得Linux环境下的应用程序可以在环境下的应用程序可以在Cygwin环境下进环境下进行编译,即可以在行编译,即可以在Windows进行编译。进行编译。20在Windows + VMWare虚拟机环境下进行Linux开发Linux开发环境建立q如果需要使用只支持如果需要使用只支持Windows环境下调试的调试器,环境下调试的调试器,可以通过在可以通过在VMWare中安装中安装linux虚拟机,在该虚拟机中虚拟机,在该虚拟机中进行编辑、编译进行编辑、编译Linux,然后通过网络(,然后通过网络(ftp、nfs、ssh)等手段传送到等手段传送到Windo
16、ws中,进行调试,中,进行调试,这样编译和调试这样编译和调试可以分别在可以分别在linux和和windows环境下但是是在一台电脑中环境下但是是在一台电脑中完成完成,它的缺点是系统要求较高,运行速度慢。,它的缺点是系统要求较高,运行速度慢。q也可以在两台电脑中分别安装也可以在两台电脑中分别安装linux和和windows,分别,分别实现编译和调试。实现编译和调试。qVMWare是运行于是运行于Windows中的一个应用程序,是中的一个应用程序,是一个虚拟机,可以在其上安装多个操作系统,相当于在一个虚拟机,可以在其上安装多个操作系统,相当于在Windows上安装一个虚拟的操作系统。上安装一个虚拟
17、的操作系统。21Linux内核移植Linux内核移植qLinux内核的移植可以分为内核的移植可以分为板级移植板级移植和和片级移植片级移植。q对于对于Linux发行版本中已经支持的发行版本中已经支持的CPU通常只需要针对板级通常只需要针对板级硬件进行适当的修改即可,这种移植叫做板级移植。硬件进行适当的修改即可,这种移植叫做板级移植。q而对于而对于Linux发行版本中没有支持的发行版本中没有支持的CPU则需要添加相应则需要添加相应CPU的内核移植,这种移植叫做片级移植。的内核移植,这种移植叫做片级移植。q片级移植相对板级移植来说要复杂许多,本系统采用的片级移植相对板级移植来说要复杂许多,本系统采用
18、的Linux 发行版本中已经包含发行版本中已经包含S3C2410X ARM920T处理器的移植处理器的移植包,因此,只需要在其上进行包,因此,只需要在其上进行Linux板级移植的基本过程和方法。板级移植的基本过程和方法。22Linux内核的目录结构Linux内核移植linuxDocumentationarchdriversfsincludeinitmmnommulibnetscript帮助文档体系结构相关源代码驱动程序文件系统头文件kernel初始化Linux内存管理常用函数网络协议源代码脚本文件23Linux内核的arch目录Linux内核移植armnommubootkernellibmac
19、h-s3c2410vmlinux.lds压缩内核启动引导代码内核起始代码常用函数s3c2410平台相关代码核心的连接脚本文件q与架构和平台相关的源代码都放在与架构和平台相关的源代码都放在archarch目录下,对目录下,对于于ARMARM的的LinuxLinux,包含于,包含于archarch目录下的目录下的armarm子目录中。子目录中。24Linux内核的arch目录Linux内核移植q当使用压缩核心时,当使用压缩核心时,bootboot目录下包含压缩和解压核心的源目录下包含压缩和解压核心的源代码和代码和MakefileMakefile文件。文件。qkernelkernel目录的目录的en
20、try-armventry-armv.S.S中为未压缩内核的起始执行文中为未压缩内核的起始执行文件,内核从其第一条指令处执行。件,内核从其第一条指令处执行。qvmlinux.ldsvmlinux.lds文件为核心的连接脚本文件,压缩核心解压文件为核心的连接脚本文件,压缩核心解压后必须解压缩到该文件指定的地址。后必须解压缩到该文件指定的地址。25Linux内核移植Linux内核移植q配置内核配置内核q编译内核编译内核q下载、运行、调试内核下载、运行、调试内核26配置Linux内核Linux内核移植qmake configmake configqmake menuconfigmake menuco
21、nfigqmake xconfigmake xconfig27make configLinux内核移植28make menuconfigLinux内核移植29make xconfigLinux内核移植30Linux常用配置选项Linux内核移植q系统及其存储器配置系统及其存储器配置q网络支持网络支持q显示器支持显示器支持q触摸屏支持触摸屏支持31系统及其存储器配置Linux内核移植q在在System TypeSystem Type菜单中菜单中中进行配置中进行配置选择系统类型处理器型号选择处理器其它特性(USB支持等)32网络支持Linux内核移植q在在Networking optionsNet
22、working options以及以及Network device Network device supportsupport中进行配置中进行配置 选择支持TCP/IP协议33网络支持Linux内核移植q在在Network device supportNetwork device support配置中,添加选配置中,添加选项项Network device supportNetwork device support,并在,并在Ethernet(10 or Ethernet(10 or 100Mbit)100Mbit)中选择中选择Other ISA cardsOther ISA cards,如下图
23、所示,如下图所示选择选择NE2000/NE1000 supportNE2000/NE1000 support采用RTL8019网卡芯片,为NE2000兼容网卡芯片,因此,选择该网卡34显示器支持Linux内核移植q在在Character devices以及以及Console drivers中中进行配置。进行配置。q在在Character devicesCharacter devices配置中,添加选项配置中,添加选项Virtual Virtual terminalterminal配置,如下图所示。配置,如下图所示。 Virtual terminal支持35显示器支持Linux内核移植q在在Co
24、nsole drivers中添加中添加Support Frame buffer devices配置配置采用256色STN显示器,因此必须选择8bpp支持36触摸屏支持Linux内核移植q在在Character devices的的Support S3C2410 TouchScreen子菜单中进行配置子菜单中进行配置选择s3c2410触摸屏支持37编译Linux内核Linux内核移植q建立依赖关系建立依赖关系make depmake depq编译内核编译内核make make 编译内核编译内核make zImage make zImage 编译压缩核心(编译压缩核心(zImagezImage)编译
25、生成地编译生成地LinuxLinux映像文件映像文件zImagezImage通常保存在通常保存在arch/arm/boot/arch/arm/boot/目录下目录下38下载、运行和调试内核Linux内核移植q通过调试器下载内核并运行通过调试器下载内核并运行q通过通过BOOTLOADERBOOTLOADER下载内核到下载内核到SDRAMSDRAM中运行中运行q通过通过BOOTLOADERBOOTLOADER将内核烧写到将内核烧写到FLASHFLASH中,然后运行中,然后运行LinuxLinux39Linux调试手段Linux内核移植q在在LinuxLinux开发中,由于可能没有标准键盘和显示器支
26、持,因开发中,由于可能没有标准键盘和显示器支持,因此,通常通过串口将显示信息发送到主机,由主机端超级终端此,通常通过串口将显示信息发送到主机,由主机端超级终端工具接收,以完成显示功能。同时在超级终端中可以输入数据,工具接收,以完成显示功能。同时在超级终端中可以输入数据,然后由然后由LinuxLinux接收,以完成标准键盘功能。接收,以完成标准键盘功能。q调试过程中也可以通过串口将调试信息打印到超级终端,调试过程中也可以通过串口将调试信息打印到超级终端,这是这是LinuxLinux最有效和最简单的方法。最有效和最简单的方法。40Linux内核移植主要过程1Linux内核移植q对于板级移植,内核移
27、植主要包括如下几个部分:对于板级移植,内核移植主要包括如下几个部分:q内核配置,包括板级包配置,如内核配置,包括板级包配置,如S3C44B0X-MBA44S3C44B0X-MBA44q体系结构相关代码修改,根据板级包的配置,修改相应体系结构相关代码修改,根据板级包的配置,修改相应的体系结构相关代码,包括:的体系结构相关代码,包括:压缩核心启动代码:压缩核心启动代码:linuxlinux/arch/arm/boot/arch/arm/boot/内核启动代码:内核启动代码:linuxlinux/arch/arm/kernel/arch/arm/kernel/板级相关代码:板级相关代码:linuxl
28、inux/arch/arm/mach-s3c2410/arch/arm/mach-s3c2410/q连接脚本连接脚本核心连接脚本:核心连接脚本:linux/arch/arm/vmlinux.ldslinux/arch/arm/vmlinux.lds压缩核心连接脚本:压缩核心连接脚本:linux/arch/arm/boot/compressed/linux.ldslinux/arch/arm/boot/compressed/linux.lds41Linux内核移植主要过程2Linux内核移植q加载文件系统加载文件系统ramdiskramdiskq编写驱动程序编写驱动程序驱动程序目录:驱动程序目录
29、:linuxlinux/drivers/drivers/网卡驱动程序:网卡驱动程序:linux/drivers/net/nelinux/drivers/net/ne.c.cLCDLCD驱动程序:驱动程序:linuxlinux/drivers/video/s3c2410fb.c/drivers/video/s3c2410fb.c触摸屏驱动程序:触摸屏驱动程序:linux/drivers/char/s3c2410-tslinux/drivers/char/s3c2410-ts.c.c42Linux启动过程1Linux内核移植解压缩核心核心打印信息内核命令行存储器43Linux启动过程2Linux内
30、核移植IIC总线初始化Frame Buffer显示初始化44Linux启动过程3Linux内核移植Linux控制台45Linux文件系统Linux内核移植q文件系统指文件存在的物理空间。在文件系统指文件存在的物理空间。在LinuxLinux系统中,每个分系统中,每个分区都是一个文件系统,都有自己的目录层次结构。区都是一个文件系统,都有自己的目录层次结构。qLinuxLinux的最重要特征之一就是支持多种文件系统,这样它的最重要特征之一就是支持多种文件系统,这样它更加灵活,并可以和许多其它种操作系统共存。更加灵活,并可以和许多其它种操作系统共存。qVirtual File SystemVirtu
31、al File System(虚拟文件系统)使得(虚拟文件系统)使得LinuxLinux可以支可以支持多个不同的文件系统。由于系统已将持多个不同的文件系统。由于系统已将LinuxLinux文件系统的所有文件系统的所有细节进行了转换,所以细节进行了转换,所以LinuxLinux核心的其它部分及系统中运行的核心的其它部分及系统中运行的程序将看到统一的文件系统。程序将看到统一的文件系统。qLinuxLinux的虚拟文件系统允许用户同时能透明地安装许多不的虚拟文件系统允许用户同时能透明地安装许多不同的文件系统。虚拟文件系统是为同的文件系统。虚拟文件系统是为LinuxLinux用户提供快速且高效用户提供
32、快速且高效的文件访问服务而设计的。的文件访问服务而设计的。 46常用Linux文件系统Linux内核移植qLinuxLinux系统核心可以支持十多种文件系统类型:系统核心可以支持十多种文件系统类型:JFSJFS、 extext、ext2ext2、ext3ext3、ISO9660ISO9660、XFSXFS、MinxMinx、MSDOSMSDOS、UMSDOSUMSDOS、VFATVFAT、NTFSNTFS、HPFSHPFS、NFSNFS、SMBSMB、SysVSysV、PROCPROC、romfsromfs等。等。47Linux内核移植的若干问题1Linux内核移植q源程序阅读问题源程序阅读问
33、题1 1qLinuxLinux内核源代码非常多,且结构复杂,内核源代码非常多,且结构复杂,LinuxLinux内核内核有接近有接近1000010000个文件,个文件,40000004000000行代码。行代码。q因此,阅读因此,阅读LinuxLinux时必须借助一些工具时必须借助一些工具Source insightSource insightUltraeditUltraedit等等qLinuxLinux内核使用内核使用GNU CGNU C,它在,它在ANSI CANSI C基础上进行了一些基础上进行了一些扩充,因此在许多编程习惯上与扩充,因此在许多编程习惯上与ANSI CANSI C不同。不同
34、。q大量使用大量使用宏定义宏定义,且许多宏定义非常复杂,这也在一,且许多宏定义非常复杂,这也在一定程度上增加了难度。定程度上增加了难度。48Linux内核移植的若干问题1Linux内核移植q源程序阅读问题源程序阅读问题2 2qLinuxLinux中并不是所有代码都编译进去,对于一个体系结构,中并不是所有代码都编译进去,对于一个体系结构,只有很少部分的代码参与编译,因此,必须掌握只有很少部分的代码参与编译,因此,必须掌握LinuxLinux发布中发布中各目录的意义才能进一步清楚是否参与编译。各目录的意义才能进一步清楚是否参与编译。q还可以通过查看还可以通过查看.o.o文件的方式查看当前参与编译的
35、文件的方式查看当前参与编译的是哪个文件,通常是哪个文件,通常xxx.cxxx.c文件生成的目标文件为文件生成的目标文件为xxx.oxxx.o,只有生成了只有生成了.o.o的文件才参与编译,的文件才参与编译,注意:这适合于大部注意:这适合于大部分情况,但是不是绝对的分情况,但是不是绝对的。qLinuxLinux中大量使用中大量使用条件编译条件编译,阅读代码时需要弄清楚,阅读代码时需要弄清楚,到底哪部分代码参与编译。到底哪部分代码参与编译。#ifdef #ifdef xxxxxx#elif#elif#endif#endif49Linux内核移植的若干问题2Linux内核移植qGNU CGNU Cq
36、从从C+C+中吸收了中吸收了inlineinline和和constconst等关键字。等关键字。qANSI CANSI C代码与代码与GNU CGNU C中的保留关键字冲突通过双下划中的保留关键字冲突通过双下划线线(_)(_)解决:如解决:如inlineinline等价于等价于_inline_inline_、asmasm等价于等价于_asmasm_q结构体的初始化结构体的初始化50Linux内核移植的若干问题2Linux内核移植qGNU CGNU C结构体初始化结构体初始化结构体声明ANSI C结构体初始化,必须按顺序GNU C结构体初始化,无需按顺序51Linux应用程序Linux应用程序设
37、计q编写程序编写程序q编写编写MakefileMakefile文件文件q编译编译q运行运行52编写Makefile文件Linux应用程序设计指定编译器生成的执行文件和链接过程中的目标文件 编译和链接的参数 编译命令 拷贝helloworld映像文件到/tftpboot/examples中清除53Linux应用程序运行1Linux应用程序设计q应用程序运行可以采用如下两种方式:应用程序运行可以采用如下两种方式:q在在LinuxLinux内核启动起来,并且有办法从主机获取文件时,内核启动起来,并且有办法从主机获取文件时,可以在可以在LinuxLinux控制台直接从主机获取编译后的应用程序。控制台直
38、接从主机获取编译后的应用程序。可以通过可以通过ftpftp、nfsnfs、sshssh等方式达到。等方式达到。q也可以在编译应用程序后将该应用程序拷贝到也可以在编译应用程序后将该应用程序拷贝到ramdiskramdisk中,然后重新制作中,然后重新制作ramdiskramdisk,并更新,并更新ramdiskramdisk文件系统,文件系统,此时新的程序将在文件系统中。此时新的程序将在文件系统中。54Linux应用程序运行3Linux应用程序设计q重新编译内核时,通常将应用程序添加到重新编译内核时,通常将应用程序添加到LinuxLinux文件系统文件系统的的binbin目录,该目录有全局路径。
39、且该文件目录,该目录有全局路径。且该文件应该具有执行属性应该具有执行属性,可以通过如下命令修改:可以通过如下命令修改:chmod 777 leddemochmod 777 leddemo在新内核启动后,直接在命令行输入文件名即可运行。在新内核启动后,直接在命令行输入文件名即可运行。q当直接在当直接在LinuxLinux控制台中从主机上获取应用程序时,必须控制台中从主机上获取应用程序时,必须保存到可写的位置,且通过如下命令执行该程序:保存到可写的位置,且通过如下命令执行该程序:././leddemoleddemo55配置Linux应用程序启动后自动运行Linux应用程序设计q如果需要在系统启动以
40、后自动运行如果需要在系统启动以后自动运行helloworldhelloworld程序,需要程序,需要编辑编辑ramdiskramdisk中的启动脚本文件,该文件为中的启动脚本文件,该文件为root/rd/etc/init.d/rcSroot/rd/etc/init.d/rcS使用使用vivi编辑器编辑,在该文件最后添加如下脚本:编辑器编辑,在该文件最后添加如下脚本:/ /bin/helloworldbin/helloworld该脚本将启动后运行该脚本将启动后运行helloworldhelloworld ,直到程序退出。或,直到程序退出。或/ /bin/ helloworldbin/ hello
41、world & &它将在它将在后台运行后台运行helloworldhelloworld,不影响其他的程序运行。,不影响其他的程序运行。56linux驱动程序Linux驱动程序设计qLinuxLinux下对外设的访问只能通过驱动程序进行下对外设的访问只能通过驱动程序进行qLinuxLinux具有统一的驱动程序接口,以文件操作的方式管理驱具有统一的驱动程序接口,以文件操作的方式管理驱动程序动程序,如:,如:openopen、readread、writewrite、ioctlioctlq驱动程序是内核的一部分,可以使用中断、驱动程序是内核的一部分,可以使用中断、DMADMA等操作等操
42、作q驱动程序需要在用户态和内核态之间传递数据驱动程序需要在用户态和内核态之间传递数据57Linux驱动程序Linux驱动程序设计qLinuxLinux屏蔽了应用层对外设的直接访问屏蔽了应用层对外设的直接访问,不能在用户态直,不能在用户态直接进行如下操作:接进行如下操作:* *(unsigned char unsigned char * *)0 x02000006) =0 x3e;)0 x02000006) =0 x3e;qLinuxLinux下用户态无法处理中断下用户态无法处理中断qLinuxLinux下对外设的访问推荐采用驱动程序进行,在内核态下对外设的访问推荐采用驱动程序进行,在内核态编写
43、驱动程序(包括直接对外设操作、处理中断等),用户编写驱动程序(包括直接对外设操作、处理中断等),用户态通过标准驱动程序调用方法进行操作。态通过标准驱动程序调用方法进行操作。58Linux驱动程序编译方式Linux驱动程序设计qLinuxLinux中驱动程序的使用可以按照两种方式编译:中驱动程序的使用可以按照两种方式编译:q一种是一种是静态编译进内核静态编译进内核q另一种是编译成模块以供另一种是编译成模块以供动态加载动态加载q由于由于LinuxLinux不支持模块动态加载不支持模块动态加载,而且嵌入式,而且嵌入式LinuxLinux不能不能够象桌面够象桌面LinuxLinux那样灵活的使用那样灵
44、活的使用insmod/rmmodinsmod/rmmod加载卸载设备驱加载卸载设备驱动程序,因而通常在动程序,因而通常在LinuxLinux中将设备驱动程序静态编译进内核。中将设备驱动程序静态编译进内核。59Linux下设备驱动程序分类Linux驱动程序设计q字符设备字符设备:是指存取时没有缓存的设备。典型的字符设:是指存取时没有缓存的设备。典型的字符设备包括鼠标,键盘,串行口等。备包括鼠标,键盘,串行口等。q块设备块设备:块设备的读写都有缓存来支持,并且块设备必:块设备的读写都有缓存来支持,并且块设备必须能够随机存取须能够随机存取(random(randomaccess) access) 。
45、典型的块设备主要包括。典型的块设备主要包括硬盘软盘设备,硬盘软盘设备,CD-ROMCD-ROM等。等。q网络设备网络设备:LinuxLinux的网络系统主要是基于的网络系统主要是基于BSDBSDunixunix的的socketsocket机制。在系统和驱动程序之间定义有专门的数据结构机制。在系统和驱动程序之间定义有专门的数据结构( (sksk_buff)_buff)进行数据的传递。系统里支持对发送数据和接收数进行数据的传递。系统里支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持。据的缓存,提供流量控制机制,提供对多协议的支持。60Linux下设备驱动程序组成Linux驱动程
46、序设计q自动配置和初始化子程序自动配置和初始化子程序:负责检测所要驱动的硬件设备是否存在和是否能正常工负责检测所要驱动的硬件设备是否存在和是否能正常工作。如果该设备正常,则对这个设备及其相关的、设备作。如果该设备正常,则对这个设备及其相关的、设备驱动程序需要的软件状态进行初始化。这部分驱动程序驱动程序需要的软件状态进行初始化。这部分驱动程序仅在初始化的时候被调用一次。仅在初始化的时候被调用一次。q服务于服务于I/OI/O请求的子程序请求的子程序:调用这部分是由于系统调用的结果。这部分程序在执行调用这部分是由于系统调用的结果。这部分程序在执行的时候,系统仍认为是和进行调用的进程属于同一个进的时候
47、,系统仍认为是和进行调用的进程属于同一个进程,只是由用户态变成了核心态,具有进行此系统调用程,只是由用户态变成了核心态,具有进行此系统调用的用户程序的运行环境,因此可以在其中调用的用户程序的运行环境,因此可以在其中调用sleep()sleep()等与进程运行环境有关的函数。等与进程运行环境有关的函数。q中断服务子程序中断服务子程序:61Linux下设备驱动程序I/O设备入口点1Linux驱动程序设计q在系统内部,在系统内部,I/OI/O设备的存取通过一组固定的入口点来进设备的存取通过一组固定的入口点来进行,这组入口点是由每个设备的设备驱动程序提供的。一般行,这组入口点是由每个设备的设备驱动程序
48、提供的。一般来说,字符型设备驱动程序能够提供如下几个入口点:来说,字符型设备驱动程序能够提供如下几个入口点:qopenopen:打开设备准备:打开设备准备I/OI/O操作。对字符特别设备文件进行操作。对字符特别设备文件进行打开操作,都会调用设备的打开操作,都会调用设备的openopen入口点。入口点。openopen子程序必须对子程序必须对将要进行的将要进行的I/OI/O操作做好必要的准备工作,如清除缓冲区等。操作做好必要的准备工作,如清除缓冲区等。如果设备是独占的,即同一时刻只能有一个程序访问此设备,如果设备是独占的,即同一时刻只能有一个程序访问此设备,则则openopen子程序必须设置一些
49、标志以表示设备处于忙状态。子程序必须设置一些标志以表示设备处于忙状态。qcloseclose:关闭一个设备。当最后一次使用设备终结后,调:关闭一个设备。当最后一次使用设备终结后,调用用closeclose子程序。独占设备必须标记设备可再次使用。子程序。独占设备必须标记设备可再次使用。qReadRead:从设备上读数据。对于有缓冲区的:从设备上读数据。对于有缓冲区的I/OI/O操作,一般操作,一般是从缓冲区里读数据。对字符特别设备文件进行读操作将调是从缓冲区里读数据。对字符特别设备文件进行读操作将调用用readread子程序。子程序。62Linux下设备驱动程序I/O设备入口点2Linux驱动程
50、序设计qwritewrite:往设备上写数据。对于有缓冲区的:往设备上写数据。对于有缓冲区的I/OI/O操作,一操作,一般是把数据写入缓冲区里。对字符特别设备文件进行写操作般是把数据写入缓冲区里。对字符特别设备文件进行写操作将调用将调用writewrite子程序。子程序。qioctlioctl:执行读、写之外的操作。:执行读、写之外的操作。qselectselect:检查设备,看数据是否可读或设备是否可用于:检查设备,看数据是否可读或设备是否可用于写数据。写数据。selectselect系统调用在检查与设备特别文件相关的文件系统调用在检查与设备特别文件相关的文件描述符时使用描述符时使用sele
51、ctselect入口点。如果设备驱动程序没有提供上入口点。如果设备驱动程序没有提供上述入口点中的某一个,系统会用缺省的子程序来代替。对于述入口点中的某一个,系统会用缺省的子程序来代替。对于不同的系统,也还有一些其它的入口点。不同的系统,也还有一些其它的入口点。63Linux下设备注册1Linux驱动程序设计q设备驱动程序所提供的入口点,在设备驱动程序初始化设备驱动程序所提供的入口点,在设备驱动程序初始化的时候向系统进行登记,以便系统在适当的时候调用。的时候向系统进行登记,以便系统在适当的时候调用。LinuxLinux系统里,通过调用系统里,通过调用register_chrdevregister
52、_chrdev向系统注册字符型设备驱向系统注册字符型设备驱动程序。动程序。register_chrdevregister_chrdev定义为:定义为:# #include linux/fsinclude .h#include linux/errno#include .hint register_chrdev(unsigned int major, const char int register_chrdev(unsigned int major, const char * *name,name, struct struct file_operations file_operations * *
53、fops);fops);q其中,其中,majormajor是为设备驱动程序向系统申请的主设备号,是为设备驱动程序向系统申请的主设备号,如果为如果为0 0则系统为此驱动程序动态地分配一个主设备号。则系统为此驱动程序动态地分配一个主设备号。namename是设备名。是设备名。fopsfops是该驱动各个的入口点的文件操作结构指针。是该驱动各个的入口点的文件操作结构指针。64Linux下设备注册2Linux驱动程序设计q此函数返回此函数返回0 0表示成功。返回表示成功。返回-EINVAL-EINVAL表示申请的主设备表示申请的主设备号非法,一般来说是主设备号大于系统所允许的最大设备号。号非法,一般来
54、说是主设备号大于系统所允许的最大设备号。返回返回-EBUSY-EBUSY表示所申请的主设备号正在被其它设备驱动程序表示所申请的主设备号正在被其它设备驱动程序使用。如果是动态分配主设备号成功,此函数将返回所分配使用。如果是动态分配主设备号成功,此函数将返回所分配的主设备号。如果的主设备号。如果register_chrdevregister_chrdev操作成功,设备名就会出操作成功,设备名就会出现在现在/proc/devices/proc/devices文件里。文件里。q初始化部分一般还负责给设备驱动程序申请系统资源,初始化部分一般还负责给设备驱动程序申请系统资源,包括内存、中断、时钟、包括内存
55、、中断、时钟、I/OI/O端口等,这些资源也可以在端口等,这些资源也可以在openopen子程序或别的地方申请。在这些资源不用的时候,应该释放子程序或别的地方申请。在这些资源不用的时候,应该释放它们,以利于资源的共享。它们,以利于资源的共享。65Linux下中断处理Linux驱动程序设计q在在LinuxLinux系统里,对中断的处理是属于系统核心的部分,系统里,对中断的处理是属于系统核心的部分,因此如果设备与系统之间以中断方式进行数据交换的话,就因此如果设备与系统之间以中断方式进行数据交换的话,就必须把该设备的驱动程序作为系统核心的一部分。设备驱动必须把该设备的驱动程序作为系统核心的一部分。设
56、备驱动程序通过调用程序通过调用request_irqrequest_irq函数来申请中断,通过函数来申请中断,通过free_irqfree_irq来来释放中断。释放中断。66Linux下内存分配、释放Linux驱动程序设计q作为系统核心的一部分,作为系统核心的一部分,设备驱动程序在申请和释放内设备驱动程序在申请和释放内存时不是调用存时不是调用mallocmalloc和和freefree,而代之以调用,而代之以调用kmallockmalloc和和kfreekfree,它们被定义为:它们被定义为:# #include linuxinclude /kernel.hvoid void * * kmal
57、loc(unsigned int len, int kmalloc(unsigned int len, int priority); priority);void kfree(void void kfree(void * * obj obj););q参数参数lenlen为希望申请的字节数,为希望申请的字节数,objobj为要释放的内存指针。为要释放的内存指针。prioritypriority为分配内存操作的优先级,即在没有足够空闲内存为分配内存操作的优先级,即在没有足够空闲内存时如何操作,一般用时如何操作,一般用GFP_KERNELGFP_KERNEL。67Linux下内存分配、释放Linux
58、驱动程序设计q使用一个没有申请的使用一个没有申请的I/OI/O端口不会使端口不会使CPUCPU产生异常,也就产生异常,也就不会导致诸如不会导致诸如“segmentation fault”segmentation fault”一类的错误发生。任一类的错误发生。任何进程都可以访问任何一个何进程都可以访问任何一个I/OI/O端口。此时系统无法保证对端口。此时系统无法保证对I/OI/O端口的操作不会发生冲突,甚至会因此而使系统崩溃。端口的操作不会发生冲突,甚至会因此而使系统崩溃。q因此,在使用因此,在使用I/OI/O端口前,应该检查此端口前,应该检查此I/OI/O端口是否已有端口是否已有别的程序在使用
59、,若没有,再把此端口标记为正在使用,在别的程序在使用,若没有,再把此端口标记为正在使用,在使用完以后释放它。使用完以后释放它。intint check_regioncheck_region(unsigned int from, unsigned int(unsigned int from, unsigned int extent); extent);void void request_regionrequest_region(unsigned int from, unsigned int(unsigned int from, unsigned int extent, extent, const
60、 char const char * *name);name);void void release_regionrelease_region(unsigned int from, unsigned int(unsigned int from, unsigned int extent); extent);68Linux下开关中断函数Linux驱动程序设计q在设备驱动程序里,通过如下函数实现打开和关闭中断在设备驱动程序里,通过如下函数实现打开和关闭中断功能:功能:# #include asminclude /system.h#define #define clicli() _asm_ _volatile_ (cl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中医护理学试题库及答案
- 2025年初级社会工作者综合能力模拟考试题及答案
- 塑件模具冷却水循环工艺考核试卷及答案
- 机床附件组装焊接工艺考核试卷及答案
- 卫生事业单位招聘专业技术人员公共知识考试试题(有答案)
- 农产品脱硫还原工艺考核试卷及答案
- 第三单元第1课 《插花》说课稿-2024-2025学年人教版初中美术八年级下册
- 人力银行面试题目及答案
- 触电安全知识培训课件感想
- 机理模型与机器学习融合在测井智能解释中的应用研究
- 2025年吉林省中考语文真题(含答案)
- 2025高级会计师考试试题及答案
- 工地建筑钢板租赁合同范本
- 光传输业务配置课件
- 2025年辽宁省地质勘探矿业集团有限责任公司校园招聘笔试备考题库带答案详解
- 2025年青海辅警招聘考试题及答案
- 2025新外研版初中英语八年级上全册课文原文翻译
- 钢结构安装安全操作规程
- 流程优化活动方案
- 消防装备认识课件
- 2025年山西中考道德与法治真题解读及答案讲评课件
评论
0/150
提交评论