当前位置:文档之家› 嵌入式Linux应用完全开发手册

嵌入式Linux应用完全开发手册

嵌入式Linux应用完全开发手册终端概述在Linux中,TTY(终端)是一类字符设备的统称,包括了3中类型:控制台、串口、伪终端。

控制台:供内核使用的终端为控制台。

控制台在Linux启动时,通过命令console=…指定,如果没有指定控制台,系把第一个注册的终端作为控制台。

控制台是一个虚拟的终端,它必须映射到真正的终端上。

控制台可以简单的理解为printk输出的地方。

控制台是个只输出的设备,功能很简单,只能在内核中访问。

进程四要素█有段程序供其执行。

这段程序不一定是某个进程所专有,可以与其它进程共用。

█有进程专用的内核空间堆栈。

█在内核中有一个task_struct数据结构,即通常所说的“进程控制块”。

有了这个数据结构,进程才能成为内核调度的一个基本单位接受内核的调度。

█有独立的用户空间。

进程调度█调度概念:从就绪的进程中选出最合适的一个进程执行。

█调度策略-SCHED_NORMAL(SCHED_OTHER):普通的分时进程。

- SCHED_FIFO:先进先出的实时调度- SCHED_RR:时间片轮转实时进程- SCHED_BATCH:批处理进程- SCHED_IDLE:只有在系统空闲时,才能够被调度执行的进程。

进程管理█特点:动态性、并发性、独立性、异步性编译说明█编译选项:-c编译不链接。

-g 带有调试信息。

-I .h文件所在目录-预处理:语法分析,例如:将宏定义展开。

-编译:*.c 文件编译成*.s文件。

-汇编:*.s 文件编译成*.o文件。

-链接:多个*.o 文件链接成执行文件。

█Linux系统调用和C库Linux系统调用是依赖于系统的,而C库在任何操作系统下,调用都是相同的。

信号类型█SIGHUP:从终端上发出结束信号█SIGINT:来自键盘的中断信号(Ctrl-C)█SIGKILL:该信号结束接收信号的进程。

█SIGTERM:kill命令发出的信号。

█SIGCHLD:标识子进程停止或结束的信号。

█SIGSTOP:来自键盘(Ctrl-Z)或调试程序停止执行的信号。

SIGKILL和SIGSTOP不能被忽略,因为它们是超级用户提供了了一种终止或停止进程的方法。

文件系统█文件系统类型根据设备的硬件特性、系统需求,不同的文件系统类型有不同的应用场合。

在嵌入式Linux应用中,主要的存储设备为:RAM和FLASH,常用的基于存储设备的文件系统类型包括:jffs2、yaffs、cramfs、ramdisk、ramfs等。

文件系统是对存储设备上的文件进行存储和组织的机制,Linux支持多种文件系统,可以分为:█磁盘文件系统,如:ext2█Flash文件系统,如:jffs2,yaffs2█网络文件系统:如:NFS█特殊文件系统,如:/sys /proc根文件系统根文件系统:是Linux启动时的第一个文件系统。

没有根文件,Linux无法正常启动。

根文件系统由一系列目录组成,目录中包含了应用程序、C库、以及相关配置文件。

总线的功能:█提供时钟█分配/管理地址█响应中断█传输数据█传输控制信号全速、高速、低速三种时钟。

(FCLK,HCLK,PCLK)。

arm AMBA 总线结构AHB/APBAHB总线上有内存,NAND控制器等高速设备。

HCLKAPB总线上有UMARK设备控制器等慢速设备。

PCLKARM 三级流水结构█取指:把指令从程序存储器中取出来。

取指是在处理器内核和程序存储器之间进行的。

█译码:把读到内核的指令进行解释,也就是把二进制的指令变换成电路的动作。

█执行:即按照指令的要求把门电路的动作送到指定的目标地址。

ARM在执行一条指令的时候,PC的指针是在取指的那条指令的。

█程序:1、代码段:指令2、数据段:有初始值(并且不为0)的全局、静态变量3、BSS段(Block Started by Symbol):初始值为0或无初始值的全局、静态变量。

BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。

特点是:可读写的,在程序执行之前BSS段会自动清0。

所以,未初始的全局变量在程序执行之前已经成0了。

注意和数据段的区别,BSS存放的是未初始化的全局变量和静态变量,数据段存放的是初始化后的全局变量和静态变量。

UNIX下可使用size命令查看可执行文件的段大小信息。

如size a.out。

4、栈区域。

1、程序运行是应该位于它的链接地址2、硬件决定了程序一开始从0运行,需要重定位(从0开始的8k代码)。

重定位:前面的一小段代码(从0开始的8k代码),复制到它的链接地址。

3、前面8k代码为什么能正常运行:因为是位置无关码写的。

IO端口和IO内存IO端口:当一个寄存器或内存位于IO地址空间时,为IO端口。

IO内存:当一个寄存器或内存位于内存地址空间时,为IO内存。

MMU管理█权限管理:程序不能访问内核或其它程序的内存空间。

█地址映射:应用程序访问的“虚拟地址”,而数据真正存放在真实的物理地址。

虚拟地址和真实地址的转换是由MMU实现的。

█物理地址:指出现在CPU地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。

█线性地址(虚拟地址):是在32位CPU架构下,可以表示4G的地址空间,用16进制表示就是:0x00000000-0xFFFFFFFF。

█逻辑地址:程序经过编译后,出现在汇编程序中的地址。

█地址转换:CPU要将一个逻辑地址转换为物理地址,需要两步:-首先,CPU利用段式内存管理单元,将逻辑地址转换成线性地址。

-再利用页式内存管理单元,把线性地址最终转换成物理地址。

█段式管理单元:16位CPU内部拥有20位地址线,它的寻址范围就是220,也就是1M的地址空间。

但16位CPU用于存放地址寄存器(IP,SP..等)只有16位,因此只能访问65536个存储单元,64K。

█页式管理单元:从管理和效率的角度出发,线性地址被分为固定长度的组,称为“页(page)”,例如32位的机器,线性地址最大可为4G,如果4K为一个页来划分,这样整个线性地址就被划分220个页。

另一类“页”,称为物理页,或者是“页框、页帧”。

分页单元把所有的物理内存也划分为固定长度的管理单位,它的长度一般与线性地址页是相同的。

分页管理1、分页单元中,页目录的地址放在CPU的CR3寄存中,是进行地址转换的开始点。

2、每一个进程,都有其独立的虚拟地址空间,运行一个进程首先需要将它的的也目录地址放到CR3寄存中,将其它进程的地址保存起来。

3、每个32位的线性地址被划分为三个部分:页目录索引(10位)、页表索引(10位)、页偏移(12位)。

█依据以下步骤进行地址转化:1、装入进程的页目录地址(操作系统在调度进程时,把这个地址装入CR3)。

2、根据线性地址的前10位,在页目录中,找到对应的索引项,页目录中的项是一个页表的地址。

3、根据线性地址的中间10位,在页表中找到页的起始地址。

4、将页的起始地址与线性地址的最后12位相加,得到物理地址。

█内存使用slab管理工具位置无关码1、使用B或bl跳转2、不访问全局静态变量异常处理█中断是一种异常-CPU 上电,CPU处于SVC模式,-当发生了中断,CPU就进入IRQ模式,并且切换到自己的R13和R14,并跳到中断向量的相应地址执行。

█SWI中断处理硬件处理:1、CPU进入SVC模式2、把之前模式的CPSR-->SPSR_svc3、切换到R13_svc,R14_svc4、下一条指令--->R145、跳转到地址8软件处理:1、在地址8,写一条跳转指令2、保存现场3、处理中断4、恢复现场ldmia sp!,{r0-r12,pc}^ ^:表示将spsr恢复到cpsr中。

█SWI指令的作用用户应用程序open、read、write、print函数等用户应用运行在用户态,经常用到内核的资源,如何调用内核呢?就是调用SWI指令,CPU就会响应中断,跳到相应的中断服务程序,访问内核资源。

█未定义指令用于调试等待队列Linux驱动程序设计中,可以使用等待队列来实现进程的阻塞,等待队列可看作保存进程的容器,在阻塞进程时,将进程放入等待队列,唤醒进程时,从等待队列中取出进程。

如何看电路图1.GPIP和门电路1.1输入、输出引脚、上拉/下拉电阻、三极管1.2 与、或、非门1.3 中断█三极管:PNP(正负正),NPN(负正负)。

█上拉/下拉电阻:确定悬空的引脚一个状态。

█怎么用接口1、配置引脚功能。

2、读出某寄存器---输入。

设置寄存器----输出2.协议类█双方约定信号的协议█双方满足时序的要求2.1 UART2.2 I2C:每个I2C设备都有一个地址。

是自己的地址才回应。

2.3 SPI2.4 NAND2.5 LCD3 类似内存接口类3.1 NOR、SDRAM、网卡3.2 不同位宽外设的接线、访问过程3.3 如何确定访问地址、设置内存控制器4 综合理解原理图Linux内核简介Linux体系结构█Linux系统构成-Linux由用户空间和内核空间两部分。

-为什么分为用户空间和内核空间?出于安全考虑。

通过系统调用和硬件中断从用户空间进入内核空间。

█Linux系统构成-SCI:用户进入内核的入口。

-PM:主要是进程调度和进程间通信。

-MM:分配、回收、内存的地址转换。

-Arch:和CPU相关的管理。

将PM、MM、NS与CPU相关的代码集成,减少了移植的难度。

-VFS:虚拟文件系统。

隐藏了各种具体文件系统的细节,为文件系统提供了统一的接口。

NS:网络协议栈。

-DD:设备驱动。

█Linux内核目录结构arch目录:内核支持的每种CPU体系,在该目录下都有对应的子目录。

每个CPU的子目录,有分为boot,mm,kernel等子目录,分别控制系统引导,内存管理,系统调用等。

block目录:部分块设备驱动程序。

driver目录:设备驱动程序。

fs目录:存放各种文件系统的实现代码。

每个子目录对应一种一种文件系统的实现,公用的源代码用于实现虚拟文件系统(VFS)。

include目录:内核所需的头文件。

与平台无关的头文件在include/linux子目录下,与平台相关的头文件存放在相应的子目录中。

lib目录:库文件代码,自己实现的库的源代码也放在这里。

mm目录:mm目录中的文件用于实现内存管理中与体系结构无关的部分。

与体系结构相关的代码在arch目录中。

net目录:用于网络协议的实现代码。

子目录用于实现具体协议的代码。

srcipts目录:配置内核的脚本usr目录:cpio命令的实现。

内核编译█清除临时文件、中间文件和配置文件make clean:清除大部分编译产生的中间文件,保留config文件。

make mrproper:清除所有编译产生的中间文件和config文件。

相关主题