嵌入式Linux应用完全开发手册
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式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/APB
AHB总线上有内存,NAND控制器等高速设备。HCLK
APB总线上有UMARK设备控制器等慢速设备。PCLK
ARM 三级流水结构
█取指:把指令从程序存储器中取出来。取指是在处理器内核和程序存储器之间进行的。
█译码:把读到内核的指令进行解释,也就是把二进制的指令变换成电路的动作。
█执行:即按照指令的要求把门电路的动作送到指定的目标地址。
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个页。
另一类“页”,称为物理页,或者是“页框、页帧”。分页单元把所有的物理内存也划分为固定长度的管理单位,它的长度一般与线性地址页是相同的。