Linux驱动开发培训课件_第1页
Linux驱动开发培训课件_第2页
Linux驱动开发培训课件_第3页
Linux驱动开发培训课件_第4页
Linux驱动开发培训课件_第5页
已阅读5页,还剩169页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Thesuccess'sroad

Thesuccess'sroad1ARMlinux开发流程ARMlinux开发流程2主要内容:ARM体系结构ARMlinux概述ARMlinux开发平台搭建ARMlinuxbootloader开发ARMlinux内核开发ARMlinux文件系统主要内容:ARM体系结构3ARM体系结构ARM处理器结构ARM系统发展趋势ARM体系结构ARM编程模型数据类型处理器模式寄存器组织异常存储器映射ARM寻址方式ARM体系结构ARM处理器结构4ARM处理器结构ARM系统发展趋势ARM(AdvancedRISCMachines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。具有性能高、成本低和能耗省的特点。ARM当前有6个产品系列:ARM7、ARM9、ARM9E、ARM10、ARM11、SecurCore 变种:StrongARM、XscaleARM处理器结构ARM系统发展趋势5ARM处理器结构ARM体系结构ARM基于精简指令集(RISC)通常具有两套套指令集高性能32位ARM指令集高代码密度16位Thumb指令集(操作码,有些指令不要操作数)Thumb在32位体系结构上实现了16位指令集,提供:比16位更高的性能;(寻址空间,访问速度)比32位更高的代码密度.(处理非数据指令)

ARM处理器结构ARM体系结构6ARM处理器结构ARM处理器结构7数据类型Byte 8位Halfword 16位Word 32位处理器模式user 用户,正常程序执行模式Fiq FIQ,高速数据传送活通道处理Irq IRQ,通用中断处理Svc 管理,操作系统保护模式Abt 中止,虚拟存储器或存储器保护Und 未定义,硬件协处理器软件仿真Sys 系统,特权操作系统任务ARM编程模型数据类型ARM编程模型8ARM编程模型寄存器组织 ARM处理器总共有37个寄存器31个通用寄存器(32位有效)不分组寄存器R0~R7分组寄存器R8~R14程序计数器R157个状态寄存器(12位有效)在所有模式下都可以访问当前程序状态寄存器CPSR(CurrentProgramStatus)ARM编程模型寄存器组织9ARM编程模型ARM编程模型10ARM编程模型ARM编程模型11ARM编程模型异常ARM编程模型异常12ARM编程模型存储器映射地址空间存储器格式大端存储系统小端存储系统非对准存储器访问非对准取指—结果不可预知非对准数据访问—按体系决定,忽略低地址预取指(流水线)存储器映射I/OARM系统完成I/O功能的标准做法是使用存储器映射I/OARM编程模型存储器映射13ARM编程模型ARM编程模型14ARM编程模型ARM编程模型15ARM寻址方式寄存器寻址 ADDR0,R1,R2 ;R0R1+R2立即寻址 ADDR3,R3#1 ;R3R3+1寄存器移位寻址 ADDR3,R2,R1,LSL#3;R3R2+8xR1寄存器间接寻址 LDRR0,[R1] ;R0[R1]变址寻址 LDRR0,[R1,#4] ;R0[R1+4]ARM寻址方式寄存器寻址16ARM寻址方式多寄存器寻址 LDMIAR1,{R0,R2,R5} ;R0[R1] ;R2[R1+4] ;R5[R1+8]堆栈寻址 块拷贝寻址 LDMIAR0!,{R2-R9} STMIAR1,{R2-R9}相对寻址 BLSUBR ;转移到SUBRARM寻址方式多寄存器寻址 17ARMlinux概述嵌入式Linux的发展嵌入式Linux的组成ARMLinux概况ARMLinuxpatch文件的使用ARMlinux概述18嵌入式Linux的发展发展历史1992年底,linux1.0问世90年代末,出现了RT-Linux、RTAI、(任务调度10MS满足)QT/Embedded等开源项目2000年,基于嵌入式Linux的网络产品逐渐兴起2001年,一批专业嵌入式Linux解决方案商涌现,Montavista、Lineo、Mizi等2002年,基于嵌入式Linux的PDA面世嵌入式Linux的发展发展历史19嵌入式Linux的发展嵌入式Linux的基本需求实时性能:RT-Linux、RTAI高可靠性:内核不断完善,升级较低功耗:电源管理快速启动:bootloader、kernel体积小巧:Flash、Ram等资源占用移植性强:灵活方便的移植到其他平台嵌入式Linux的发展20嵌入式Linux的组成嵌入式Linux的三要素:BootLoader

系统引导、调试、烧写内核KERNEL

Linuxkernel+patch根文件系统

定制的应用程序嵌入式Linux的组成21嵌入式Linux的组成Linux系统核心框图Linux系统支持硬件类型字符设备块设备网络设备用户级进程系统调用接口硬件驱动物理硬件进程控制系统进程通信虚拟文件系统EXT2NFS其他网络协议内存管理进程调度嵌入式Linux的组成Linux系统核心框图用户级进程22ARMLinux概况ARMLinux概况23ARMLinuxpatch文件的使用ARMLinux是以patch的方式发布的,需要在原linux基本内核基础上打patch举例说明:bash$tarzxvflinux-2.4.18.tar.gzbash$cdlinux-2.4.18bash$zcat../patch-2.4.18-rmk7.gz|patch-p1bash$zcat../diff-2.4.18-rmk7-pxa1.gz|patch-p1bash$zcat../diff-2.4.18-rmk7-pxa1-mz4.gz|patch-p1ARMLinuxpatch文件的使用ARMLinux24ARMlinux开发平台搭建跨平台开发模式交叉编译工具链主机端系统配置开发所需工具ARMlinux开发平台搭建25跨平台开发模式跨平台开发与我们平时的编程有何不同绝大多数的软件开发都是以native方式进行的即本机(HOST)开发、调试,本机运行的方式嵌入式系统的软件开发采用一种交叉编译调试编译生成的代码不能在开发主机上运行,需要传输到板子上运行

跨平台开发模式26跨平台开发模式交叉编译调试环境建立在宿主机上,对应的开发板叫做目标板。 如下图所示:【宿主机】 【目标板】

跨平台开发模式交叉编译调试环境建立在宿主机上,27交叉编译工具链交叉编译工具链的组成如何生成自己的交叉编译工具链交叉编译工具链的安装交叉编译工具链28交叉编译工具链交叉编译工具链的组成Binutils软件包汇编器和连接器GCC软件包GCC软件包包含GNU编译器,其中有C和C++编译器.Glibc软件包 Glibc是提供系统调用和基本函数的C库一般说来安装了上述软件包后,一个基本的开发工具链已经建立交叉编译工具链交叉编译工具链的组成29交叉编译工具链交叉编译工具链30交叉编译工具链下面简单列出各个步骤编译安装Binutils-第一遍

非常重要,因为Glibc和GCC会针对可用的连接器和汇编器进行多种测试,以决定打开某些特性

编译安装GCC-第一遍 这里我们不需要C++编译器,所以我们这里只解压gcc-core包安装Linux头文件

包含系统相关信息

编译安装Glibc

提供系统调用和基本函数的C库

编译安装Gcc-第二遍 编译安装Binutils-第二遍

重新编译GCC和Binutils,连接到新的Glibc上交叉编译工具链下面简单列出各个步骤31交叉编译工具链交叉编译工具链32交叉编译工具链交叉编译工具链的安装以Mizi开发板为例Mizi交叉编译工具以RPM包方式发布,并包含了一些常用的库文件如果选择mizi的2410TK的SDK里的交叉工具链,则gcc版本为2.95.2,如果选择了mizi2.0的则gcc版本为2.95.3rpm-ivh-force--nodeps*.rpm开发所用工具安装到/opt/host/armv4l下交叉编译工具链交叉编译工具链的安装33主机端系统配置检测并口是否工作正常;检测串口是否工作正常,运行MINICOM,将串口配置; 为115200,8-N-1方式 #minicom–s启动NFS服务,设置输出路径;编辑/etc/exports文件,在里面加入如下一句话: /nfsrootxxx.xxx.xxx.xxx(rw)启动TFTP服务,通过运行SETUP命令;取消IPTABLES防火墙的启动运行; #chkconfig–level3iptablesoff上面两个设置也可以通过图形界面,在系统菜单里的服务里面进行选择配置,详细过程这里就不多讲述。主机端系统配置检测并口是否工作正常;34开发所需工具仿真器,如MULTI-ICE;简易JTAG,可以用来烧写Bootloader;交叉串口线,23交叉;交叉网线,主机对联线;USB扁平线,系统烧写;仿真软件,ADS,SDT。开发所需工具仿真器,如MULTI-ICE;35ARMlinuxbootloader开发Bootloader的主要功能ARMlinuxBootloader的启动步骤内核启动参数表几种常见的ARMlinuxBootloaderARMlinuxbootloader开发36Bootloader的主要功能基本功能引导操作系统初级调试功能下载与烧写附加功能系统自检系统升级参数设置Bootloader的主要功能基本功能37ARMlinuxBootloader的启动步骤一个最小需求的bootloader启动步骤配置CPU、内存系统、FLASH及中断装载内核到指定内存区域装载initialRAMdisk到指定内存区域初始化内核启动参数获取ARMLinux机器类型设置正确的寄存器值,并启动内核附加步骤判定ARM系统状态(SLEEP模式)初始化串口、网口、VIDEO等设备ARMlinuxBootloader的启动步骤一个最小需38内核启动参数表Bootloader传递的内核参数内容内存容量大小内核启动命令行参数Initramdisk的位置及大小其他必要参数(显示及音频设置、版本信息等)参数表由许多项组成,须遵循以下原则:参数表存贮在RAM的区域不能与kernel及initrd位置冲突, 推荐在RAM的前16KiB,通常,在RAM起始的0x100偏移处 最前面是中断向量表在内核启动前,将参数表位置把参数表位置固定在RAM的0x100偏移处.参数表不能超越RAM的0x4000偏移处,内核初始化转换表 在那里如果不按上述推荐位置,那么参数表位置要字对齐参数表必须以ATAG_CORE项起始,以ATAG_NONE结束参数表至少包含ATAG_MEM项关于参数表信息可查看内核代码include/asm/setup.h内核启动参数表Bootloader传递的内核参数内容39内核启动参数表内核中参数表定义:structtag{ structtag_headerhdr; union{ structtag_core core; structtag_mem32 mem; structtag_videotext videotext; structtag_ramdisk ramdisk; structtag_initrd initrd; structtag_serialnr serialnr; structtag_revision revision; structtag_videolfb videolfb; structtag_cmdline cmdline; }u;};内核启动参数表40几种常见的ARMlinuxBootloader几种常见的ARMlinuxBootloader41ARMlinux内核开发ARMLinux内核原码树结构ARMLinux内核image结构Linux地址空间管理Linux设备驱动程序开发Linux下驱动加载方式驱动原码分析ARMlinux内核开发ARMLinux内核原码树结42ARMlinux内核原码树结构ARMlinux内核原码树结构43ARMlinux内核image结构内核发展至2.4版本以后,体积足见庞大,为节省空间,采用压缩内核zImageARMlinux最早基于2.4版本开发,因此我们有必要分析一下我们生成的压缩内核的结构 zImage头代码解析 注:地址是相对于zImage的偏移位置ARMlinux内核image结构内核发展至2.4版本以44Linux地址空间管理 Linux是一个使用虚拟内存的系统,这意味着用户程序看到的地址不是直接对应于硬件使用的物理地址。虚拟内存提出了一个间接的层,这对许多事情都是有利的。如果有虚拟内存,运行在系统上的程序就可以分配到比可用物理内存更多的内存。甚至一个单独的进程都可以拥有比系统的物理内存更大的虚拟地址空间,虚拟内存也能在进程地址空间上使用很多技巧,包括映射设备的内存。Linux地址空间管理 Linux是一个使用虚拟内存的系45Linux地址空间管理虚拟空间映射的实现手段初始化时映射使用时映射Linux地址空间管理虚拟空间映射的实现手段46Linux设备驱动程序开发Linux设备驱动程序分类Linux设备驱动程序基本框架编写Linux驱动程序几点注意事项Linux设备驱动程序调试技术Linux设备驱动程序开发Linux设备驱动程序分类47Linux设备驱动程序分类字符设备支持面向字符的I/O操作负责管理自己的缓冲区结构顺序存取功能块设备仅支持面向块的I/O操作所有I/O操作都通过在内核地址空间中的I/O缓冲区进行随机存取功能:支持几乎任意长度和任意位置上的I/O请求网络设备Linux设备驱动程序分类字符设备48Linux设备驱动程序基本框架驱动入口,初始化函数xxx_init:

向OS注册及硬件初始化,包括中断及bank设置、GPIO设置等主体代码structfile_operation

设备基本操作函数inode结构体

提供关于设备节点文件/dev/xxx的信息

时间流HZ、jiffies、wait_queue_head_t等;

Linux设备驱动程序基本框架驱动入口,初始化函数xxx_49Linux设备驱动程序基本框架中断服务程序Devfs接口设备文件系统,动态生成设备节点信息Proc接口提供内核状态信息,包括中断,IO等Linux设备驱动程序基本框架中断服务程序50Linux设备驱动程序基本框架Linux设备驱动程序基本框架51编写Linux驱动程序几点注意事项时序的把握中断的使用内存的分配编写Linux驱动程序几点注意事项时序的把握52Linux设备驱动程序调试技术printk内核打印信息根据记录级别输出信息,全部信息可查看/proc/kmsgioctl系统调用strace查看用户空间程序运行状态Oops(panic)信息解读ksymoopsGdb等调试工具gdb/usr/src/linux/vmlinux/proc/kcoreLinux设备驱动程序调试技术printk内核打印信息53Linux下驱动加载方式动态内核模块module_init(s3c2410_uda1341_init);module_exit(s3c2410_uda1341_exit);编译进内核显式调用: 如framebuffer驱动,在fbmem.c中 #ifdefCONFIG_FB_S3C2410 {"s3c2410",s3c2410fb_init, s3c2410fb_setup}, #endif隐式调用: __initcall(gpio_init);Linux下驱动加载方式动态内核模块54驱动原码分析所有原代码均以S3C2410为例GPIO驱动 LCD驱动代码MTD驱动代码驱动原码分析所有原代码均以S3C2410为例55驱动原码分析GPIO驱动驱动原码分析GPIO驱动56驱动原码分析驱动原码分析57驱动原码分析用户空间编写应用程序创建设备节点mknodc/dev/gpio2200驱动原码分析用户空间58驱动原码分析LCD驱动代码主要配置参数驱动原码分析LCD驱动代码59驱动原码分析framebuffer操作函数集驱动原码分析framebuffer操作函数集60驱动原码分析驱动原码分析61驱动原码分析MTD驱动代码具体编写方法 创建Drivers/mtd/maps/s3c2410_nor.c可从最相近板子FLASHmap文件拷贝过来.#cppxa_cerf.cs3c2410_nor.c并按自己板子的FLASH分布结构,修改FLASH启始位置及创建分区表.驱动原码分析MTD驱动代码62驱动原码分析MTD驱动代码驱动原码分析MTD驱动代码63驱动原码分析MTD驱动代码修改mtd/map/Config.in 添加关于2410的定义修改mtd/map/Makefile 添加关于2410的编译规则驱动原码分析MTD驱动代码64ARMlinux文件系统ARMlinux文件系统类型ARMlinux文件系统生成方法如何选择适合自己的根文件系统常用的几个应用程序包ARMlinux文件系统ARMlinux文件系统类型65ARMlinux文件系统类型RAMdisks Cramfs Jffs2YaffsRomfsNFS

ARMlinux文件系统类型RAMdisks 66ARMlinux文件系统生成方法一般都是通过宿主机端运行image制作程序来生成#mkcramfsroot_dirfilename.cramfs#mkfs.jffs2root_dirfilename.jffs2#mkyaffsimageyaffs_dirfile.yaffs#genromfs-v-V"ROMdisk"-f$(ROMFSIMG)-d$(ROMFSDIR)系统引导后拷贝文件#mount–tjffs2/dev/mtdblock/2/usr#cp/tmp/yourfile/usr ARMlinux文件系统生成方法一般都是通过宿主机端运行67ARMlinux文件系统生成方法Ramdisk制作方法生成一个空的img文件格式化挂载下面就可以向img里面拷贝你所需要的东西了 #cp–avrootfs/*/tmp/initrdARMlinux文件系统生成方法Ramdisk制作方法68ARMlinux文件系统生成方法Ramdisk制作方法将img压缩生成我们所需的initrd#umounttmp/initrd#gzip-9<images/initrd.img>images/initrd.gzRamdisk的压缩比例高达60%ARMlinux文件系统生成方法Ramdisk制作方法69ARMlinux文件系统生成方法NFSnfs网络文件系统,需要在宿主机端运行nfsserver服务,并将整理好的目标板的根文件系统文件夹export给指定IP客户端内核为了支持NFS作为根文件系统需要选择NFS协议,如下所示:ARMlinux文件系统生成方法NFS70ARMlinux文件系统生成方法NFS命令行设置:root=/dev/nfsrwnfsroot=12.345.67.89:/yourpathNFS网络文件系统是嵌入式开发中常用手段应用程序调试便捷降低FLASH烧写次数如果bootloader中支持NFS,那么内核也可以通过tftp+nfs进行调试 这也是linux下NC的常用实现手法.ARMlinux文件系统生成方法NFS71如何选择适合自己的根文件系统选择依据FLASH空间大小RAM空间大小启动速度数据保存如何选择适合自己的根文件系统选择依据72如何选择适合自己的根文件系统几种文件系统的性能对比如何选择适合自己的根文件系统几种文件系统的性能对比73常用的几个应用程序包常用的几个应用程序包74图形界面开发图形界面简介常见嵌入式LinuxGUI比较Minigui移植QT/Embedded移植图形界面开发图形界面简介75图形界面简介GUI(graphicaluserinterfaces) 为用户提供界面友好的所见所得的图形操作环境,用户通过GUI与系统进行交互。GUI基本框架图形界面简介GUI(graphicaluserinte76图形界面简介图形界面简介77常见嵌入式LinuxGUI比较

MiniGUIMicroWindowsQt-EmbeddedAPIWIN32X、WIN32子集QT(C++)函数库典型大小500k600k1.5M可移植性好很好较好授权条款GPL/商业条款MPLQPL/GPL/商业条款多语种支持独特的多字符集支持一般采用UNICODE可配置型好一般复杂系统资源消耗小较大大效率好较差较差使用广泛性中国地区主要是美国欧美、韩国使用广泛常见嵌入式LinuxGUI比较

MiniGUIMicroW78Minigui移植MiniGUI简介MiniGUI的层次结构MiniGUI的运行模式平台移植实例Minigui移植MiniGUI简介79MiniGUI简介1998年,魏永明老师创办了MiniGUI项目MiniGUI的目标是提供一个轻量级的跨平台图形用户界面支持系统适合基于Linux/uClinux、eCos、uC/OS-II等操作系统的实时嵌入式系统。MiniGUI简介1998年,魏永明老师创办了MiniG80MiniGUI的层次结构在最底层,GAL和IAL提供底层图形接口以及鼠标和键盘的驱动;中间层是MiniGUI的核心层,其中包括了窗口系统必不可少的各个模块;最顶层是API,即编程接口。MiniGUI的层次结构在最底层,GAL和IAL提供81MiniGUI的运行模式MiniGUI-Threads 采用线程机制,提高效率和减少资源,适合于具有单一功能的实时系统MiniGUI-Lite 采用简化的进程间客户/服务器结构,支持多进程、接口,适合于复杂嵌入式系统

MiniGUI的运行模式82平台移植实例以2410为例讲述MiniGUI的平台移植免费下载MiniGUI库文件源代码: libminigui-1.3.3.tar.gz minigui-res-1.3.3.tar.gz mde-1.3.0.tar.gz。解压缩到工作路径输入引擎的开发(应与内核对应) src/ial/2410.c是MiniGUI写的基于2410的触摸屏输入引擎,我们在此基础上进行完全修改。平台移植实例以2410为例讲述MiniGUI的平台移植83平台移植实例交叉编译创建编译脚本如下:#!/bin/shrm-fconfig.cacheconfig.statusCC=armv4l-unknown-linux-gcc\./configure--prefix=/opt/host/armv4l/armv4l-unknown-linux\--build=i386-linux\--host=arm-unknown-linux\--target=arm-unknown-linux\--disable-debug\--disable-static\--enable-lite\--disable-vbfsupport\--enable-smdk2410ial\--disable-jpgsupport\--disable-big5support平台移植实例交叉编译84Thanks!Thanks!85Linux驱动开发培训86演讲完毕,谢谢观看!演讲完毕,谢谢观看!87

Thesuccess'sroad

Thesuccess'sroad88ARMlinux开发流程ARMlinux开发流程89主要内容:ARM体系结构ARMlinux概述ARMlinux开发平台搭建ARMlinuxbootloader开发ARMlinux内核开发ARMlinux文件系统主要内容:ARM体系结构90ARM体系结构ARM处理器结构ARM系统发展趋势ARM体系结构ARM编程模型数据类型处理器模式寄存器组织异常存储器映射ARM寻址方式ARM体系结构ARM处理器结构91ARM处理器结构ARM系统发展趋势ARM(AdvancedRISCMachines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。具有性能高、成本低和能耗省的特点。ARM当前有6个产品系列:ARM7、ARM9、ARM9E、ARM10、ARM11、SecurCore 变种:StrongARM、XscaleARM处理器结构ARM系统发展趋势92ARM处理器结构ARM体系结构ARM基于精简指令集(RISC)通常具有两套套指令集高性能32位ARM指令集高代码密度16位Thumb指令集(操作码,有些指令不要操作数)Thumb在32位体系结构上实现了16位指令集,提供:比16位更高的性能;(寻址空间,访问速度)比32位更高的代码密度.(处理非数据指令)

ARM处理器结构ARM体系结构93ARM处理器结构ARM处理器结构94数据类型Byte 8位Halfword 16位Word 32位处理器模式user 用户,正常程序执行模式Fiq FIQ,高速数据传送活通道处理Irq IRQ,通用中断处理Svc 管理,操作系统保护模式Abt 中止,虚拟存储器或存储器保护Und 未定义,硬件协处理器软件仿真Sys 系统,特权操作系统任务ARM编程模型数据类型ARM编程模型95ARM编程模型寄存器组织 ARM处理器总共有37个寄存器31个通用寄存器(32位有效)不分组寄存器R0~R7分组寄存器R8~R14程序计数器R157个状态寄存器(12位有效)在所有模式下都可以访问当前程序状态寄存器CPSR(CurrentProgramStatus)ARM编程模型寄存器组织96ARM编程模型ARM编程模型97ARM编程模型ARM编程模型98ARM编程模型异常ARM编程模型异常99ARM编程模型存储器映射地址空间存储器格式大端存储系统小端存储系统非对准存储器访问非对准取指—结果不可预知非对准数据访问—按体系决定,忽略低地址预取指(流水线)存储器映射I/OARM系统完成I/O功能的标准做法是使用存储器映射I/OARM编程模型存储器映射100ARM编程模型ARM编程模型101ARM编程模型ARM编程模型102ARM寻址方式寄存器寻址 ADDR0,R1,R2 ;R0R1+R2立即寻址 ADDR3,R3#1 ;R3R3+1寄存器移位寻址 ADDR3,R2,R1,LSL#3;R3R2+8xR1寄存器间接寻址 LDRR0,[R1] ;R0[R1]变址寻址 LDRR0,[R1,#4] ;R0[R1+4]ARM寻址方式寄存器寻址103ARM寻址方式多寄存器寻址 LDMIAR1,{R0,R2,R5} ;R0[R1] ;R2[R1+4] ;R5[R1+8]堆栈寻址 块拷贝寻址 LDMIAR0!,{R2-R9} STMIAR1,{R2-R9}相对寻址 BLSUBR ;转移到SUBRARM寻址方式多寄存器寻址 104ARMlinux概述嵌入式Linux的发展嵌入式Linux的组成ARMLinux概况ARMLinuxpatch文件的使用ARMlinux概述105嵌入式Linux的发展发展历史1992年底,linux1.0问世90年代末,出现了RT-Linux、RTAI、(任务调度10MS满足)QT/Embedded等开源项目2000年,基于嵌入式Linux的网络产品逐渐兴起2001年,一批专业嵌入式Linux解决方案商涌现,Montavista、Lineo、Mizi等2002年,基于嵌入式Linux的PDA面世嵌入式Linux的发展发展历史106嵌入式Linux的发展嵌入式Linux的基本需求实时性能:RT-Linux、RTAI高可靠性:内核不断完善,升级较低功耗:电源管理快速启动:bootloader、kernel体积小巧:Flash、Ram等资源占用移植性强:灵活方便的移植到其他平台嵌入式Linux的发展107嵌入式Linux的组成嵌入式Linux的三要素:BootLoader

系统引导、调试、烧写内核KERNEL

Linuxkernel+patch根文件系统

定制的应用程序嵌入式Linux的组成108嵌入式Linux的组成Linux系统核心框图Linux系统支持硬件类型字符设备块设备网络设备用户级进程系统调用接口硬件驱动物理硬件进程控制系统进程通信虚拟文件系统EXT2NFS其他网络协议内存管理进程调度嵌入式Linux的组成Linux系统核心框图用户级进程109ARMLinux概况ARMLinux概况110ARMLinuxpatch文件的使用ARMLinux是以patch的方式发布的,需要在原linux基本内核基础上打patch举例说明:bash$tarzxvflinux-2.4.18.tar.gzbash$cdlinux-2.4.18bash$zcat../patch-2.4.18-rmk7.gz|patch-p1bash$zcat../diff-2.4.18-rmk7-pxa1.gz|patch-p1bash$zcat../diff-2.4.18-rmk7-pxa1-mz4.gz|patch-p1ARMLinuxpatch文件的使用ARMLinux111ARMlinux开发平台搭建跨平台开发模式交叉编译工具链主机端系统配置开发所需工具ARMlinux开发平台搭建112跨平台开发模式跨平台开发与我们平时的编程有何不同绝大多数的软件开发都是以native方式进行的即本机(HOST)开发、调试,本机运行的方式嵌入式系统的软件开发采用一种交叉编译调试编译生成的代码不能在开发主机上运行,需要传输到板子上运行

跨平台开发模式113跨平台开发模式交叉编译调试环境建立在宿主机上,对应的开发板叫做目标板。 如下图所示:【宿主机】 【目标板】

跨平台开发模式交叉编译调试环境建立在宿主机上,114交叉编译工具链交叉编译工具链的组成如何生成自己的交叉编译工具链交叉编译工具链的安装交叉编译工具链115交叉编译工具链交叉编译工具链的组成Binutils软件包汇编器和连接器GCC软件包GCC软件包包含GNU编译器,其中有C和C++编译器.Glibc软件包 Glibc是提供系统调用和基本函数的C库一般说来安装了上述软件包后,一个基本的开发工具链已经建立交叉编译工具链交叉编译工具链的组成116交叉编译工具链交叉编译工具链117交叉编译工具链下面简单列出各个步骤编译安装Binutils-第一遍

非常重要,因为Glibc和GCC会针对可用的连接器和汇编器进行多种测试,以决定打开某些特性

编译安装GCC-第一遍 这里我们不需要C++编译器,所以我们这里只解压gcc-core包安装Linux头文件

包含系统相关信息

编译安装Glibc

提供系统调用和基本函数的C库

编译安装Gcc-第二遍 编译安装Binutils-第二遍

重新编译GCC和Binutils,连接到新的Glibc上交叉编译工具链下面简单列出各个步骤118交叉编译工具链交叉编译工具链119交叉编译工具链交叉编译工具链的安装以Mizi开发板为例Mizi交叉编译工具以RPM包方式发布,并包含了一些常用的库文件如果选择mizi的2410TK的SDK里的交叉工具链,则gcc版本为2.95.2,如果选择了mizi2.0的则gcc版本为2.95.3rpm-ivh-force--nodeps*.rpm开发所用工具安装到/opt/host/armv4l下交叉编译工具链交叉编译工具链的安装120主机端系统配置检测并口是否工作正常;检测串口是否工作正常,运行MINICOM,将串口配置; 为115200,8-N-1方式 #minicom–s启动NFS服务,设置输出路径;编辑/etc/exports文件,在里面加入如下一句话: /nfsrootxxx.xxx.xxx.xxx(rw)启动TFTP服务,通过运行SETUP命令;取消IPTABLES防火墙的启动运行; #chkconfig–level3iptablesoff上面两个设置也可以通过图形界面,在系统菜单里的服务里面进行选择配置,详细过程这里就不多讲述。主机端系统配置检测并口是否工作正常;121开发所需工具仿真器,如MULTI-ICE;简易JTAG,可以用来烧写Bootloader;交叉串口线,23交叉;交叉网线,主机对联线;USB扁平线,系统烧写;仿真软件,ADS,SDT。开发所需工具仿真器,如MULTI-ICE;122ARMlinuxbootloader开发Bootloader的主要功能ARMlinuxBootloader的启动步骤内核启动参数表几种常见的ARMlinuxBootloaderARMlinuxbootloader开发123Bootloader的主要功能基本功能引导操作系统初级调试功能下载与烧写附加功能系统自检系统升级参数设置Bootloader的主要功能基本功能124ARMlinuxBootloader的启动步骤一个最小需求的bootloader启动步骤配置CPU、内存系统、FLASH及中断装载内核到指定内存区域装载initialRAMdisk到指定内存区域初始化内核启动参数获取ARMLinux机器类型设置正确的寄存器值,并启动内核附加步骤判定ARM系统状态(SLEEP模式)初始化串口、网口、VIDEO等设备ARMlinuxBootloader的启动步骤一个最小需125内核启动参数表Bootloader传递的内核参数内容内存容量大小内核启动命令行参数Initramdisk的位置及大小其他必要参数(显示及音频设置、版本信息等)参数表由许多项组成,须遵循以下原则:参数表存贮在RAM的区域不能与kernel及initrd位置冲突, 推荐在RAM的前16KiB,通常,在RAM起始的0x100偏移处 最前面是中断向量表在内核启动前,将参数表位置把参数表位置固定在RAM的0x100偏移处.参数表不能超越RAM的0x4000偏移处,内核初始化转换表 在那里如果不按上述推荐位置,那么参数表位置要字对齐参数表必须以ATAG_CORE项起始,以ATAG_NONE结束参数表至少包含ATAG_MEM项关于参数表信息可查看内核代码include/asm/setup.h内核启动参数表Bootloader传递的内核参数内容126内核启动参数表内核中参数表定义:structtag{ structtag_headerhdr; union{ structtag_core core; structtag_mem32 mem; structtag_videotext videotext; structtag_ramdisk ramdisk; structtag_initrd initrd; structtag_serialnr serialnr; structtag_revision revision; structtag_videolfb videolfb; structtag_cmdline cmdline; }u;};内核启动参数表127几种常见的ARMlinuxBootloader几种常见的ARMlinuxBootloader128ARMlinux内核开发ARMLinux内核原码树结构ARMLinux内核image结构Linux地址空间管理Linux设备驱动程序开发Linux下驱动加载方式驱动原码分析ARMlinux内核开发ARMLinux内核原码树结129ARMlinux内核原码树结构ARMlinux内核原码树结构130ARMlinux内核image结构内核发展至2.4版本以后,体积足见庞大,为节省空间,采用压缩内核zImageARMlinux最早基于2.4版本开发,因此我们有必要分析一下我们生成的压缩内核的结构 zImage头代码解析 注:地址是相对于zImage的偏移位置ARMlinux内核image结构内核发展至2.4版本以131Linux地址空间管理 Linux是一个使用虚拟内存的系统,这意味着用户程序看到的地址不是直接对应于硬件使用的物理地址。虚拟内存提出了一个间接的层,这对许多事情都是有利的。如果有虚拟内存,运行在系统上的程序就可以分配到比可用物理内存更多的内存。甚至一个单独的进程都可以拥有比系统的物理内存更大的虚拟地址空间,虚拟内存也能在进程地址空间上使用很多技巧,包括映射设备的内存。Linux地址空间管理 Linux是一个使用虚拟内存的系132Linux地址空间管理虚拟空间映射的实现手段初始化时映射使用时映射Linux地址空间管理虚拟空间映射的实现手段133Linux设备驱动程序开发Linux设备驱动程序分类Linux设备驱动程序基本框架编写Linux驱动程序几点注意事项Linux设备驱动程序调试技术Linux设备驱动程序开发Linux设备驱动程序分类134Linux设备驱动程序分类字符设备支持面向字符的I/O操作负责管理自己的缓冲区结构顺序存取功能块设备仅支持面向块的I/O操作所有I/O操作都通过在内核地址空间中的I/O缓冲区进行随机存取功能:支持几乎任意长度和任意位置上的I/O请求网络设备Linux设备驱动程序分类字符设备135Linux设备驱动程序基本框架驱动入口,初始化函数xxx_init:

向OS注册及硬件初始化,包括中断及bank设置、GPIO设置等主体代码structfile_operation

设备基本操作函数inode结构体

提供关于设备节点文件/dev/xxx的信息

时间流HZ、jiffies、wait_queue_head_t等;

Linux设备驱动程序基本框架驱动入口,初始化函数xxx_136Linux设备驱动程序基本框架中断服务程序Devfs接口设备文件系统,动态生成设备节点信息Proc接口提供内核状态信息,包括中断,IO等Linux设备驱动程序基本框架中断服务程序137Linux设备驱动程序基本框架Linux设备驱动程序基本框架138编写Linux驱动程序几点注意事项时序的把握中断的使用内存的分配编写Linux驱动程序几点注意事项时序的把握139Linux设备驱动程序调试技术printk内核打印信息根据记录级别输出信息,全部信息可查看/proc/kmsgioctl系统调用strace查看用户空间程序运行状态Oops(panic)信息解读ksymoopsGdb等调试工具gdb/usr/src/linux/vmlinux/proc/kcoreLinux设备驱动程序调试技术printk内核打印信息140Linux下驱动加载方式动态内核模块module_init(s3c2410_uda1341_init);module_exit(s3c2410_uda1341_exit);编译进内核显式调用: 如framebuffer驱动,在fbmem.c中 #ifdefCONFIG_FB_S3C2410 {"s3c2410",s3c2410fb_init, s3c2410fb_setup}, #endif隐式调用: __initcall(gpio_init);Linux下驱动加载方式动态内核模块141驱动原码分析所有原代码均以S3C2410为例GPIO驱动 LCD驱动代码MTD驱动代码驱动原码分析所有原代码均以S3C2410为例142驱动原码分析GPIO驱动驱动原码分析GPIO驱动143驱动原码分析驱动原码分析144驱动原码分析用户空间编写应用程序创建设备节点mknodc/dev/gpio2200驱动原码分析用户空间145驱动原码分析LCD驱动代码主要配置参数驱动原码分析LCD驱动代码146驱动原码分析framebuffer操作函数集驱动原码分析framebuffer操作函数集147驱动原码分析驱动原码分析148驱动原码分析MTD驱动代码具体编写方法 创建Drivers/mtd/maps/s3c2410_nor.c可从最相近板子FLASHmap文件拷贝过来.#cppxa_cerf.cs3c2410_nor.c并按自己板子的FLASH分布结构,修改FLASH启始位置及创建分区表.驱动原码分析MTD驱动代码149驱动原码分析MTD驱动代码驱动原码分析MTD驱动代码150驱动原码分析MTD驱动代码修改mtd/map/Config.in 添加关于2410的定义修改mtd/map/Makefile 添加关于2410的编译规则驱动原码分析MTD驱动代码151ARMlinux文件系统ARMlinux文件系统类型ARMlinux文件系统生成方法如何选择适合自己的根文件系统常用的几个应用程序包ARMlinux文件系统ARMlinux文件系统类型152ARMlinux文件系统类型RAMdisks Cramfs Jffs2YaffsRomfsNFS

ARMlinux文件系统类型RAMdisks 153ARMlinux文件系统生成方法一般都是通过宿主机端运行image制作程序来生成#mkcramfsroot_dirfilename.cramfs#mkfs.jffs2root_dirfilename.jffs2#mkyaffsimageyaffs_dirfile.yaffs#genromfs-v-V"ROMdisk"-f$(ROMFSIMG)-d$(ROMFSDIR)系统引导后拷贝文件#mount–tjffs2/dev/mtdblock/2/usr#cp/tmp/yourfile/usr ARMlinux文件系统生成方法一般都是通过宿主机端运行154ARMlinux文件系统生成方法Ramdisk制作方法生成一个空的img文件格式化挂载下面就可以向img里面拷贝你所需要的东西了 #cp–avrootfs/*/tmp/initrdARMlinux文件系统生成方法Ramdisk制作方法155ARMlinux文件系统生成方法Ramdisk制作方法将img压缩生成我们所需的initrd#umounttmp/initrd#gzip-9<images/initrd.img>images/initrd.gzRamdisk的压缩比例高达60%ARMlinux文件系统生成方法Ramdisk制作方法156ARMlinux文件系统生成方法NFSnfs网

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论