1、2022-7-21第3章 嵌入式开发环境的搭建3.1嵌入式开发环境概述13.2Flash程序烧写23.3BootLoader程序33.4内核的裁剪的编译43.5根文件系统的构建53.6驱动程序原理与开发62022-7-213.1嵌入式开发环境概述1.建立开发环境2.配置开发主机,配置MINICOM3.建立引导装载程序bootloader4.下载别人已经移植好的linux操作系统5.建立根文件系统6.建立应用程序的falsh分区7.开发应用程序8.烧写内核、根文件系统、应用程序9.发布产品2022-7-21第3章 嵌入式开发环境的搭建3.1嵌入式开发环境概述13.2Flash程序烧写23.3Bo
2、otLoader程序33.4内核的裁剪的编译43.5根文件系统的构建53.6驱动程序原理与开发62022-7-213.2 Flash程序烧写v烧写:即利用特殊工具向开发板中下载代码。v实例:向ARM板(裸机)上烧写BootLoader、内核、根文件系统v前提:存在目录。./img,其下有已经准备好的各个部分软件的映像文件(即用交叉编译器编译好的可执行文件),分别为:VIVI:针对S3C2410的BootLoader映像文件zImage:经裁剪的Linux内核映像文件root.cramfs:根文件系统映像文件sjf2410:完成烧写的程序2022-7-213.2 Flash程序烧写v具体烧写步骤
3、1.安装JTAG驱动程序v将整个giveoio目录(JTAG驱动所在目录)复制到c:WINDOWS下,并将该目录下的giveio.sys文件复制到系统盘驱动目录下,如c:WINDOWSsystem32driversv在控制面板中添加该驱动程序2.设置超级终端v按照波特率115300,数据位8,无奇偶校验,停止位1,数据流控为无进行设置3.烧写引导程序v使用sjf2410程序对vivi进行第一次烧写vvivi启动后,使用bon part命令对flash进行分区v使用load命令对vivi进行第二次烧写4.烧写内核v使用load命令对kernel进行烧写5.烧写根文件系统v使用load命令对roo
4、tfs进行烧写2022-7-21第3章 嵌入式开发环境的搭建3.1嵌入式开发环境概述13.2Flash程序烧写23.3BootLoader程序33.4内核的裁剪的编译43.5根文件系统的构建53.6驱动程序原理与开发62022-7-213.3.1 BootLoader程序原理v对于PC系统,引导加载程序BIOS(固件程序)和位于磁盘MBR(主引导记录)中系统引导程序(LILO和GRUB等)一起组成。BIOS完成硬件检测和资源分配后,将硬盘MBR中的引导程序读到系统的内存中,然后将控制权交给引导程序。引导程序的主要任务就是将内核映像从硬盘上读到内存中,然后跳转到内核的入口点去运行,即开始启动操作
5、系统。v在嵌入式系统中,主要使用flash作为系统的存储煤介,很少用磁盘,因此整个系统的加载启动任务就完全由引导程序(也称为Bootloader)来完成。2022-7-21v就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。嵌嵌入入式式系系统统中中的的bootloader概概念念2022-7-21Bootloader的的功功能能1.硬件设备初始化(CPU的主频、SDRAM、中断、串口等)2.内核启动参数3.启动内核4.与主机进行交互,从串口、USB口或者网络
6、口下载映象文件,并可以对FLASH等存储设备进行管理2022-7-21Bootloader特特点点1.依赖于硬件:每种不同的CPU体系结构都有不同的bootloader2.bootloader还依靠具体的嵌入式板级设备的配置2022-7-21Boot Loader 的的安安装装媒媒介介1.系统加电或复位后,所有的处理器通常都从某个预先安排的地址上取指令。比如,ARM在复位时从地址0 x0取指。2.嵌入式系统中通常都有某种类型的固态存储设备(比如:ROM、EEPROM 或 FLASH 等)被映射到这个预先安排的地址上。因此在系统加电后,处理器将首先执行 Boot Loader 程序 3.Boot
7、loader是最先被系统执行的程序2022-7-21固固态态存存储储设设备备的的典典型型空空间间分分配配结结构构2022-7-21Bootloader的烧写方式的烧写方式1.通过JTAG口2.通过以太网口3.通过串口4.其中前两种方式比后一种快得多2022-7-21Boot Loader的控制方式的控制方式1.主机和目标机之间一般通过串口建立连接,Boot Loader 软件在执行时通常会通过串口来进行通讯,比如:输出打印信息到串口,从串口读取用户控制字符2.也可以通过JTAG等其他接口通讯2022-7-21Boot Loader 的的操操作作模模式式v大多数 Boot Loader 都包含两
8、种不同的操作模式:1.启动加载模式2.下载模式v从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别2022-7-21v启动加载模式 启动加载模式,称为“自主”(Autonomous)模式 Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 Boot Loader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。Boot Loader 的操作模式的操作模式2022-7-21v下载模式 在下载模式下,目标机上的
9、 Boot Loader 将通过串口连接或网络连接等通信手段从主机下载文件,如:下载内核映像和根文件系统映像等从主机下载的文件通常首先被 Boot Loader 保存到目标机的 RAM 中,然后再被 Boot Loader 写到目标机上的FLASH 类固态存储设备中。这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用 Boot Loader 的这种工作模式。工作于这种模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口。Boot Loader 的操作模式的操作模式2022-7-21BL的的典典型型结结构构框框架架大多数 Boot Load
10、er 都分为 stage1 和 stage2 两大部分。依赖于处理器体系结构和板级初始化的代码,通常都放在 stage1 中,用汇编语言实现而 stage2 则通常用C语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。2022-7-21vBoot Loader 的 stage1 通常包括以下步骤(以执行的先后顺序):硬件设备初始化。为加载 Boot Loader 的 stage2 准备 RAM 空间。拷贝 Boot Loader 的 stage2 到 RAM 空间中。设置好堆栈跳转到 stage2 的 C 入口点。BL的典型结构框架的典型结构框架2022-7-21vB
11、oot Loader 的 stage2 通常包括以下步骤(以执行的先后顺序):初始化本阶段要使用到的硬件设备。检测系统内存映射(memory map)。将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。为内核设置启动参数。调用内核。stage2 的代码通常用 C 语言来实现,以便于实现更复杂的功能和取得更好的代码可读性和可移植性。与普通 C 语言应用程序不同的是,在编译和链接 boot loader 这样的程序时,我们不能使用 glibc 库中的任何支持函数。BL的典型结构框架的典型结构框架2022-7-213.3.2 几几种种流流行行的的Linux BootLoa
12、der1.U-Boot2.BLOB3.RedBoot4.VIVI2022-7-213.3.3 S3C2410平台上的平台上的VIVI分析分析 vvivi是由韩国Mizi公司开发的一种Boot Loader,适合于ARM9处理器,支持S3C2410UP-NETARM2410平台的引导程序v启动模式和下载模式v结构简单v支持Linux内核引导,可以传递内核参数v支持分区(bon)v命令行2022-7-21vivi的的Stage1(文文件件head.S)关WATCH DOG:上电后,WATCH DOG默认是开着的 禁止所有中断初始化系统时钟初始化内存控制寄存器(一共13个)检查是否从掉电模式唤醒,若
13、是,则调用WakeupStart函数进行处理点亮所有LED 初始化UART0将vivi所有代码(包括阶段1和阶段2)从nand flash复制到SDRAM中 跳到bootloader的阶段2运行2022-7-21vivi的的Stage1(文件(文件head.S)2022-7-21vivi的的Stage2(文件(文件main.c)1.打印vivi的信息,包括版本号等2.调用若干个初始化函数3.boot_or_vivi():判断是否有“r”,回车或空格键按下,若有,则进入vivi shell;若没有,则执行boot命令,启动内核4.boot命令执行后,找到kernel分区,找它的偏移量和大小,执行
14、boot_kernel()函数,拷贝内核映象5.设置linux启动参数,打印Now Booting Linux6.调用call_linux()函数,启动内核2022-7-21第3章 嵌入式开发环境的搭建3.1嵌入式开发环境概述13.2Flash程序烧写23.3BootLoader程序33.4内核的裁剪的编译43.5根文件系统的构建53.6驱动程序原理与开发62022-7-213.4.1内核的裁减内核的裁减vARM上上的的 linux内内核核移移植植准准备备工工作作1.下下载载linux2.6.0内内核核及及其其关关于于ARM平平台台的的补补丁,丁,如:如:Patch2.6.0-rmkl.gz2
15、.给给linux2.6.0打打补补丁丁3.准准备备交交叉叉编编译译环环境境4.修修改改内内核核目目录录下下的的makefile文文件件2022-7-21Linux 内核的编译菜单有好几个版本:1)make config:进入命令行,可以一行一行的配置。2)make menuconfig:开发人员比较熟悉的menuconfig 菜单。3)make xconfig:在2.4.X 以及以前版本中xconfig 菜单是基于TCL/TK 的图形库的。3.4.1内核的裁减内核的裁减2022-7-212.4.X 版本版本xconfig 配置菜单:配置菜单:2022-7-212.4.X 版本版本menucon
16、fig 配置菜单配置菜单:2022-7-212.6.X 版本版本 xconfig配置菜单配置菜单:2022-7-21内核模块处理方式内核模块处理方式v要增加对某部分功能的支持,可以把相应部分编译到内核中,也可以把该部分编译成模块,动态调用。如果编译到内核中,在内核启动时就可以自动支持相应部分的功能,这样的优点是方便、速度快,机器一启动,你就可以使用这部分功能了;缺点是会使内核变得庞大起来,经常使用的部分直接编译到内核中,比如网卡。如果编译成模块,就会生成对应的.o文件,在使用的时候可以动态加载,优点是不会使内核过分庞大,缺点是你得自己来调用这些模块。2022-7-21在选择相应的配置时,有三种
17、选择方式:vY 将该功能编译进内核 vN 不将该功能编译进内核 vM 将该功能编译成可以在需要时动态插入到内核中的模块 2022-7-212022-7-21Linux 内核的编译菜单有好几个版本:1)make config:进入命令行,可以一行一行的配置。2)make menuconfig:开发人员比较熟悉的menuconfig 菜单。3)make xconfig:在2.4.X 以及以前版本中xconfig 菜单是基于TCL/TK 的图形库的。3.4.2内核的编译内核的编译2022-7-21(1)make clean:清楚当前环境(2)make dep:设置变量依赖关系 (3)make zIm
18、age:编译内核,生成zImage编译命令编译命令2022-7-21编译完成的编译完成的Linux内核在哪里?内核在哪里?v./vmlinux,elf格式未压缩内核varch/arm/boot/compressed/vmlinux,压缩以后的elf格式内核,此文件是从非压缩的内核映像产生的。varch/arm/boot/zImage,可自解压的压缩内核的映像文件2022-7-21第3章 嵌入式开发环境的搭建3.1嵌入式开发环境概述13.2Flash程序烧写23.3BootLoader程序33.4内核的裁剪的编译43.5根文件系统的构建53.6驱动程序原理与开发62022-7-213.5 根文件
19、系统的构建根文件系统的构建vLinux根文件系统目录结构根文件系统目录结构v使用使用busybox生成工具集生成工具集v构建根文件系统构建根文件系统2022-7-21Linux根文件系统目录结构根文件系统目录结构vLinux根根文文件件系系统统目目录录结结构构bin 必必要要的的用用户户命命令令(二二进进制制文文件)件)*boot 引引导导加加载载程程序序使使用用的的静静态态文文件件dev 设设备备文文件件及及其其他他特特殊殊文文件件etc 系系统统配配置置文文件件*home 用用户户主主目目录录lib 必必要要的的链链接接库,库,例例如:如:C链链接接库、库、内内核核模模块块mnt 临临时时
20、挂挂载载的的文文件件系系统统的的挂挂载载点点注:注:“*”目目录录在在嵌嵌入入式式Linux上上为为可可选选的的。2022-7-21vLinux根文件系统目录结构根文件系统目录结构*opt 附加软件的安装目录附加软件的安装目录proc 提供内核和进程信息的提供内核和进程信息的proc文件系统文件系统*root root用户主目录用户主目录sbin 必要的系统管理员命令必要的系统管理员命令tmp 临时文件目录临时文件目录usr 大多数用户使用的应用程序和文件目录大多数用户使用的应用程序和文件目录var 监控程序和工具程序存放的可变数据监控程序和工具程序存放的可变数据Linux根文件系统目录结构2
21、022-7-21/etc目录系统配置文件目录系统配置文件fstab 挂载文件系统的配置文件挂载文件系统的配置文件passwd Password文件文件inetd.conf Inetd守护进程的配置文件守护进程的配置文件groupGroup文件文件init.d/rcS 缺省的缺省的 sysinit 脚本脚本Linux根文件系统目录结构2022-7-21使用使用Busybox生成工具集生成工具集v很小的应用程序提供完整的工具集的功能很小的应用程序提供完整的工具集的功能Init进程进程Shell文件系统、网络系统等等的工具集文件系统、网络系统等等的工具集vhttp:/ menuconfig2022-
22、7-21使用使用Busybox生成工具集生成工具集Busybox的配置和交叉编译(1)2022-7-21使用使用Busybox生成工具集生成工具集1.如果在开发板上使用devfs,则需要设置Gereral Configuration选项*Support for devfs2.配置交叉编译器:Build Options*Do you want to build BusyBox with a Cross Compiler?(/usr/local/arm/3.4.1/bin/arm-linux-)Cross Compiler prefix 需要在接下来的输入栏中输入宿主机中交叉编译器安装的路径,如“
23、/opt/host/armv41/bin/armv41-unknown-linux-”Busybox的配置和交叉编译(2)2022-7-21使用使用Busybox生成工具集生成工具集3.选择Busybox的编译方式:Build OptionsBuild BusyBox as a static binary(no shared libs)缺省配置为使用链接库Busybox的配置和交叉编译(2)2022-7-21使用使用Busybox生成工具集生成工具集v配置其他工具集:Archival Utilities工具:工具:tartar、zipzip、unzipunzip Coreutils常用命令:常
24、用命令:basename cat chgrp chmod date dd df echo env ln ls basename cat chgrp chmod date dd df echo env ln ls mkdir mknod mv pwd rm rmdir sleep sort sync wc whoamimkdir mknod mv pwd rm rmdir sleep sort sync wc whoami等等等等Console UtilitiesDebian UtilitieEditors编辑命令:编辑命令:vi awk sedvi awk sed等等Finding Utili
25、ties查找命令:查找命令:find grep xargsfind grep xargsBusybox的配置和交叉编译(3)2022-7-21v配置其他工具集:Init Utilities*init*Support reading an inittab file?*Support running init from within an initrd?Busybox的配置和交叉编译(3)使用使用Busybox生成工具集生成工具集2022-7-21v配置其他工具集:Login/Password Management UtilitiesLoginLogin:getty login passwdget
26、ty login passwdMiscellaneous UtilitiesLinux Module UtilitiesNetworking Utilities网络命令集:网络命令集:hostname ifconfig inetd netstat ping routehostname ifconfig inetd netstat ping routeProcess Utilities进程命令:进程命令:free ps sysctl topfree ps sysctl topShells shellshell工具:工具:ashash等等 System Logging Utilities日志工具:
27、日志工具:syslogd klogd syslogd klogd Linux System Utilities系统工具:系统工具:dmesg fdisk getopt more mount umountdmesg fdisk getopt more mount umount使用使用Busybox生成工具集生成工具集Busybox的配置和交叉编译(3)2022-7-21编译Busybox:(1)make dep (2)make(3)make install使用使用Busybox生成工具集生成工具集Busybox的配置和交叉编译(4)2022-7-21v编译生成的目录结构(编译生成的目录结构(_i
28、nstall):/bin/linuxrc/sbin/usrv/usr/binv/usr/sbin使用使用Busybox生成工具集生成工具集Busybox的配置和交叉编译(5)2022-7-21构建根文件系统构建根文件系统在_install下创建其它的目录Dev:存放设备文件Proc:Lib:库文件所在目录Mnt:临时挂载点Tmp:临时目录Usr:用户目录Var:Etc:存放系统设置文件目录,在此目录下创建如下文件Inittab:指定运行级别文件Fstab:挂载文件系统的配置文件inetd.conf:Inetd守护进程配置文件profile:shell配置脚本Passwd:用户管理文件Hosts
29、:静态域名解析文件2022-7-21利利用用cramfs工工具具创创建建根根文文件件系系统统映映象象文文件件mkcramfs _install root.cramfsroot.cramfs即是最后根文件系统的可执行映像文件构建根文件系统构建根文件系统2022-7-21第3章 嵌入式开发环境的搭建3.1嵌入式开发环境概述13.2Flash程序烧写23.3BootLoader程序33.4内核的裁剪的编译43.5根文件系统的构建53.6驱动程序原理与开发62022-7-21v驱动开发简介v设备驱动分类vLinux下字符型设备管理vLinux驱动编译和加载方式vLinux内核模块结构介绍v简单Linu
30、x字符型设备驱动程序v驱动程序与应用程序的区别v字符型设备驱动demo分析3.6 驱驱动动程程序序原原理理与与开开发发2022-7-21驱动开发简介驱动开发简介v驱动程序是应用程序与硬件之间的一个驱动程序是应用程序与硬件之间的一个中间软件层中间软件层;v驱动程序应该为应用程序展现硬件的所驱动程序应该为应用程序展现硬件的所有功能,有功能,不应该强加其他的约束,对于不应该强加其他的约束,对于硬件使用的权限和限制应该由应用程序硬件使用的权限和限制应该由应用程序层控制。层控制。v驱动程序有时会被多个进程同时使用,驱动程序有时会被多个进程同时使用,这时我们要考虑如何处理这时我们要考虑如何处理并发并发的问
31、题,的问题,就需要调用一些内核的函数使用就需要调用一些内核的函数使用互斥量互斥量和锁和锁等机制。等机制。概念:2022-7-21驱动开发简介驱动开发简介Linux输入/输出系统层次结构和功能:用户应用程序(设备)文件系统设备驱动程序物理设备控制器输入/输出请求输入/输出响应物理设备物理设备控制器2022-7-21驱动开发简介驱动开发简介Linux驱动程序与外界的接口:设备驱动程序接口具体设备驱动程序与设备间接口系统初始化接口操作系统内核数据结构file_operations各设备初始化交互进行实现2022-7-21v驱动开发简介v设备驱动分类vLinux下字符型设备管理vLinux驱动编译和加
32、载方式vLinux内核模块结构介绍v简单Linux字符型设备驱动程序v驱动程序与应用程序的区别v字符型设备驱动demo分析3.6 驱动程序原理与开发驱动程序原理与开发2022-7-21设备驱动分类设备驱动分类目前Linux 支持的设备驱动大体可分为三种:v字符设备(character device);v块设备(block deivce);v网络接口设备(network interface)。设备类型:2022-7-21设备驱动分类设备驱动分类v所有能够像字节流一样访问的设备比如文件等在Linux 中都通过字符设备驱动程序来实现。v在Linux 中它们也被映射为文件系统的一个节点,常在/dev目
33、录下。v应用程序对于字符设备的每一个I/O操作,都会直接传递给系统内核对应的驱动程序;v字符设备驱动程序一般要包含open,close,read,write 等几个系统调用。Eg:如串口、触摸屏、并口、虚拟控制台、AD等。字符设备:2022-7-21设备驱动分类设备驱动分类vLinux 的块设备通常是指可以容纳文件系统的存储设备。v与字符设备类似,块设备也是通过文件系统来进行访问,它们之间的区别仅仅在于内核内部管理数据的方式不同。vLinux 中的块设备包含整数个块,每个块包含2 的几次幂的字节。v应用程序对于块设备的操作,要经过系统的缓冲区管理,间接传递给驱动程序处理。Eg:诸如磁盘,内存,
34、Flash等。块设备:2022-7-21设备驱动分类设备驱动分类 v网络接口设备比较复杂,通常它们指的是硬件设备,但有时也可是一个软件设备(如回环接口loopback)。v由内核中网络子系统驱动,负责发送和接收数据包,而且它并不需要了解每一项事务是如何映射到实际传送的数据包的。v在Linux 中采用给网络接口设备分配一个唯一名字的方法来访问该设备。EgEg:eth0eth0等。等。网络接口设备:2022-7-21v驱动开发简介v设备驱动分类vLinux下字符型设备管理vLinux驱动编译和加载方式vLinux内核模块结构介绍v简单Linux字符型设备驱动程序v驱动程序与应用程序的区别v字符型设
35、备驱动demo分析3.6 驱动程序原理与开发驱动程序原理与开发2022-7-21Linux下字符型设备管理下字符型设备管理v设备文件的概念来统一对设备的访问接口,在引入设备文件系统(devfs)之前Linux将设备文件放在/dev目录下。设备的命名一般为设备文件名数字或字母表示的子类,例如/dev/hda1、/dev/hda2、/dev/ttyS0等。v在LINUX2.4/2.6内核中引入了设备文件系统(devfs),所有的设备文件作为一个可以挂装的文件系统,这样就可以被文件系统进行统一管理,从而设备文件就可以挂装到任何需要的地方。命名规则也发生了变化,一般将主设备建立一个目录,再将具体的子设
36、备文件建立在此目录下。Eg:串口1 设备为:/dev/tts/0。设备文件及设备文件系统概念:2022-7-21Linux下字符型设备管理下字符型设备管理v传统方式中的设备管理中,除了设备类型外,内核还需要一对称作主次设备号的参数,才能唯一标识一个设备。v主设备号相同的设备使用相同的驱动程序,次设备号用于区分具体设备的实例。v设备操作宏MAJOR()和MINOR()可分别用于获取主次设备号,宏MKDEV()用于将主设备号和次设备号合并为设备号,这些宏定义在include/linux/kdev_t.h 中。v主设备号和对应的驱动程序系统会将其记录在/proc/devices里主设备号和次设备号(
37、1/2):2022-7-21Linux下字符型设备管理下字符型设备管理v系统增加一个驱动程序就要赋予它一个主设备号。这一赋值过程在驱动程序的初始化过程中进行:对于字符设备:int register_chrdev(unsigned int major,const char*name,struct file_operations*fops);主设备号和次设备号(2/2):2022-7-21Linux下字符型设备管理下字符型设备管理v/mnt/yaffsls/dev-l vcrw-1 root root 5,1 Jan 1 00:00 console vcrw-r-1 root root 1,4 J
38、an 1 00:00 port vcrw-1 root root 108,0 Jan 1 00:00 ppp vcrw-rw-rw-1 root root 5,0 Jan 1 00:00 tty vcrw-1 root root 4,64 Jan 1 00:11 ttyS0 vcrw-1 root root 4,65 Jan 1 00:00 ttyS1 vcrw-rw-rw-1 root root 1,5 Jan 1 00:00 zero v 查看/dev目录下的设备的主次设备号:2022-7-21Linux下字符型设备管理下字符型设备管理v为该模块建立一个设备节点。v命令:mknod/dev
39、/ts c 254 0 v其中/dev/ts表示我们的设备名是ts,“c”说明它是字符设备,“254”是主设备号,“0”是次设备号。v一旦通过mknod 创建了设备文件,它就一直保留下来,除非我们手工删除它。手工设备管理:2022-7-21Linux下字符型设备管理下字符型设备管理v动态分配:初始化时动态分配设备号;v在Documentation/devices.txt文件中可以找到已经静态分配给大部分设备的列表v由于许多数字已经分配了,为新设备选择一个唯一的号码是很困难的v如果调用register_chrdev时的major为零,函数就会选择一个空闲号码并做为返回值返回动态管理(1/2):2
40、022-7-21Linux下字符型设备管理下字符型设备管理v动态分配的主设备号不能保证总是一样的,无法事先创建设备节点v可以从/proc/devices读取cat/proc/devicesv利用脚本动态创建设备文件节点动态管理(2/2):2022-7-21Linux下字符型设备管理下字符型设备管理v在Linux 2.4的内核里引入了devfs来解决linux下设备文件管理的问题v在驱动程序中通过devfs_register()函数创建设备文件系统的节点 其原型为:devfs_register(devfs_handle_t dir,const char*name,unsigned int fla
41、gs,unsigned int major,unsigned int minor,umode_t mode,void*ops,void*info)v系统启动的时候mount设备文件系统v所有需要的设备节点都由内核自动管理。/dev目录下只有挂载的设备v注:在linux-2.6.12之后的内核的解决办法:udev文件系统vhttp:/www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html使用设备文件系统-devfs:2022-7-21Linux下字符型设备管理下字符型设备管理vudev 完全在用户态(userspace)工作,利用设备加入或
42、移除时内核所发送的hotplug 事件(event)来工作。v关于设备的详细信息是由内核输出(export)到位于/sys 的 sysfs 文件系统的。所有的设备命名策略、权限控制和事件处理都是在用户态下完成的。v与此相反,devfs 是作为内核的一部分工作的。使用设备文件系统-udev:2022-7-21v驱动开发简介v设备驱动分类vLinux下字符型设备管理vLinux驱动编译和加载方式vLinux内核模块结构介绍v简单Linux字符型设备驱动程序v驱动程序与应用程序的区别v字符型设备驱动demo分析3.6 驱动程序原理与开发驱动程序原理与开发2022-7-21Linux驱动编译和加载方式
43、驱动编译和加载方式v一种是直接编译到内核,当内核启动之后,新的驱动程序随之运行;v二是编译为模块,动态加载运行对模块操作需要使用module-utiles:vinsmod将编译的模块直接插入内核vrmmod从内核中卸载模块vlsmod显示已安装的模块gcc编译参数:-D_KERNEL_-DMODULE I$(KERNELDIR_INCLUDE)v在调试的过程中一般使用模块动态加载的方式,它的调试效率较高。当驱动调试完成后,在发行的过程就集成进内核。但编译进内核是某些驱动运行的唯一方法。例如:console驱动,flash驱动和对至少一种文件系统的支持等等。Eg:DA实验:insmod da.o
44、;CAN实验:insmod can.oLinux驱动编译和加载方式:2022-7-21v驱动开发简介v设备驱动分类vLinux下字符型设备管理vLinux驱动编译和加载方式vLinux内核模块结构介绍v简单Linux字符型设备驱动程序v驱动程序与应用程序的区别v字符型设备驱动demo分析3.6 驱动程序原理与开发驱动程序原理与开发2022-7-21Linux内核模块结构介绍内核模块结构介绍#include /所有模块都需要的头文件#include /init&exit相关宏static int _init hello_init(void)printk(Hello module initn);r
45、eturn 0;内核模块的基本框架(1/2):2022-7-21Linux内核模块结构介绍内核模块结构介绍vstatic void _exit hello_exit(void)printk(Hello module exitn);vmodule_init(hello_init);module_exit(hello_exit);内核模块的基本框架(2/2):2022-7-21Linux内核模块结构介绍内核模块结构介绍vgcc-D_KERNEL_-DMODULE-DLINUX-I/usr/src/linux2.4/include-c-o hello.o hello.c vinsmod./hello
46、.o vvrmmod hello 内核模块的编译和加载:2022-7-21v驱动开发简介v设备驱动分类vLinux下字符型设备管理vLinux驱动编译和加载方式vLinux内核模块结构介绍v简单Linux字符型设备驱动程序v驱动程序与应用程序的区别v字符型设备驱动demo分析3.6 驱动程序原理与开发驱动程序原理与开发2022-7-21简单简单Linux字符型设备驱动程序字符型设备驱动程序v驱动程序在Linux 内核中往往是以模块形式出现的。与应用程序的执行过程不同,模块通常只是预先向内核注册自己,当内核需要时响应请求。内核模块的编译和加载:2022-7-21简单简单Linux字符型设备驱动程
47、序字符型设备驱动程序设备驱动程序流程图:insmodrmmodinit_module()clean_module()模块内核设备功能设备注册设备卸载用户调用2022-7-21简单简单Linux字符型设备驱动程序字符型设备驱动程序重要的数据结构file_operations(1/3):说明:v设备驱动程序接口:file_operations 数据结构v通常所说的设备驱动程序接口是指结构file_operations结构,它定义在include/linux/fs.h 中。vfile_operations 结构是整个Linux内核的重要数据结构2022-7-21简单简单Linux字符型设备驱动程序字
48、符型设备驱动程序重要的数据结构file_operations(2/3):struct file_operations struct module*owner;ssize_t(*read)(struct file*,char*,size_t,loff_t*);ssize_t(*write)(struct file*,const char*,size_t,loff_t*);int(*ioctl)(struct inode*,struct file*,unsigned int,unsigned long);int(*open)(struct inode*,struct file*);int(*rel
49、ease)(struct inode*,struct file*);/;2022-7-21简单简单Linux字符型设备驱动程序字符型设备驱动程序重要的数据结构file_operations(3/3):应用:v“标记化”方法为该结构进行初始化:static struct file_operations s3c44b0_fops=owner:THIS_MODULE,open:s3c44b0_ts_open,read:s3c44b0_ts_read,release:s3c44b0_ts_release,;2022-7-21简单简单Linux字符型设备驱动程序字符型设备驱动程序重要的数据结构file:
50、说明:vfile结构定义在头文件linux/fs.h 中。v它代表一个打开的文件,由内核在调用open 时创建。并传递给在该文件上进行操作的所有函数,直到最后的close 函数被调用。在文件的所有实例都关闭时,内核释放这个数据结构。v注:与inode的区别,inode表示磁盘文件,而file表示一个打开的文件2022-7-21简单简单Linux字符型设备驱动程序字符型设备驱动程序设备注册:v驱动程序模块通过函数register_chrdev来完成向内核注册的。vint register_chrdev(unsigned int major,const char*name,struct file_