嵌入式Linux系统编程

第一章 计算机系统概论

1、计算机基本构成:处理器、主存储器、输入输出模块、系统总线

2、上下文切换时,保存和恢复的功能可以由硬件完成,也可以由软件完成,这取决于处理器的实现。

3、程序计数器(ProgramCount,PC),包含将取指令的地址。

4、指令寄存器(InstructionRegister,IR)包含最近所取指令的内容

5、程序状态字program status Word包含 条件码和其他状态信息;条件码为运算时产生的进位、正负、是否为零、是否溢出的结果,用bit来表示

6、指令周期:一个单一的指令需要的处理时间称为一个指令周期

7、I/O通信技术:可编程I/O、中断驱动I/O、直接存储器访问

8、可编程I/O:此模式下,处理器执行完I/O指令后需要定期检查I/O状态,已确认I/O已完成相应操作,(缺点)这是一个耗时的操作,处理器总是处于没有用的繁忙中,需要一直等待,且在等待过程中不断的询问I/O模块的状态,会严重的降低整个系统的性能。

9、中断驱动I/O:I/O模块在执行完CPU下发的指令后,会控制总线,以发送送一条中断信息给CPU,CPU根据该中断信息的优先级进行响应,但因为是中断,在响应信息时,CPU需要做上下文切换。

8\9的缺点:I/O传送速度受限于处理器测试设备和提供服务的速度;处理器忙于管理I/O传送的工作,且必须执行很多条指令以完成I/O传送。

10、直接存储器访问(DMA→每次传输一个字,不需要CPU参与):DMA功能可以由系统总线中的一个独立模块完成也可以并入I/O模块中,当CPU需要读写一块数据时,CPU给DMA模块发出一条命令包括:1、请求读或写2涉及到的I/O设备的地址 3、开始读或写的储存器单元 4、需要读或写的字数 ;然后CPU继续其他工作,当DMA传输完成后会发送中断信号给CPU,只有在开始传输和结束传输时CPU才会参与,且不需要在亲自操作I/O模块,而是直接与DMA模块交流

第二章 Linux系统接口

1、常见文件类型:普通文件、目录文件、设备文件、管道文件(FIFO)、套接字(socket)和链接文件(symbolic link)。

2、无论何种文件类型,Linux都把他们看作是无结构的流式文件,把文件的内容看作是一系列有序的字符流。

3、和文件操作相关的最基本元素是:目录结构、索引节点、文件的数据本身。

1 目录结构:系统中的每个目录都处于一定的目录结构当中,目录结构含有目录中所有目录的列表,每个目录项都含有一个文件名称和一个索引节点。借助于名称,应用程序可以访问文件的内容,而索引节点提供了文件自身的信息,所以,目录只是将文件名称和它的索引节点结合在一起的一张表。

2 索引节点:包含了一个文件的访问权限、文件大小、文件最后更改的时间、文件所有者和文件相关的特殊标志以及其他细节。一个文件路径名只指向一个索引节点,但一个索引节点可以有多个路径名

3 文件数据:其储存位置由索引节点指定,有些特殊文件比如管道及设备文件,在硬盘上不具有数据区域,而普通文件和目录都有。

4、文件描述符:在Unix类操作系统中,所有的外围设备都可具化为系统中的文件来操作,在操作(读写)之前,必须将这个意图告知系统,即需要先以一个模式打开文件(调用API,MODE选择read、write等);如果API返回非负整数则表示操作成功,该非负整数为文件描述符。系统负责维护已打开文件的所有信息,用户通过文件描述符引用文件。

5、当使用命令解释行(shell)来运行一个程序时,它将打开3个文件,对应0、1、2分别表示标准输入、标准输出、标准错误;任何时候文件赋值的改变都不是由程序完成的,而是shell。

6、对文件执行I/O操作有两种基本方式:一种是系统调用的I/O方法、另一种是基于流的I/O方法; 基于系统调用的I/O方法提供了最基本的文件访问接口包括open()、close()、write()、read()、lseek(移动文件指针)等;基于流的I/O方法实际上是建立在系统调用的I/O方法基础上的C函数库,它基于系统调用方法的封装,并增加了额外功能;但在处理设备、管道、网络套接字和其他特殊类型的文件时,必须使用系统调用的I/O方法。使用任何与文件相关的系统调用之前,程序要包含<fcntl.h>、<unistd.h>

系统调用和流的I/O方法的区别:

1 基于流的文件操作函数的名字都是“f”开头。

2 系统调用i/o方法是更低一级的方法,在完成相同的任务时,需要比f开头的函数需要更多编码的工作量

3 系统调用直接处理文件描述符,而流处理方法处理“FILE*”类型的文件句柄

4 流的I/O比系统调用更高效

5 基于流的可以支持格式化输出

6 流能够替代用户处理有关系统调用的细节,例如系统调用被信号中断的处理

7、标准库函数getchar()的返回值为 int 类型 EOF的值为 -1

8、堆和栈的区别主要有五大点,分别是:

1、申请方式的不同。栈由系统自动分配,而堆是人为申请开辟;

2、申请大小的不同。栈获得的空间较小,而堆获得的空间较大;

3、申请效率的不同。栈由系统自动分配,速度较快,而堆一般速度比较慢;

4、存储内容的不同。栈在函数调用时,函数调用语句的下一条可执行语句的地址第一个进栈,然后函数的各个参数进栈,其中静态变量是不入栈的。而堆一般是在头部用一个字节存放堆的大小,堆中的具体内容是人为安排;

5、底层不同。栈是连续的空间,而堆是不连续的空间。

第三章 并发性

1、并发:在单处理器多道程序设计系统中,进程被交替执行,表现出一种并发执行的外部特征;多处理器系统中处理多个进程同时执行。在执行并发程序时,需要注意保护共享的全局变量,使得访问有序且有逻辑的运行。即控制对共享资源的访问

2、并发常用术语

1 临界区:是一段代码,在这段代码中进程将访问共享资源,当另外一个进程已经在这段代码中运行时,当前进程就不能在这段代码中执行。

2 死锁:两个或两个以上的进程因其中的每个进程都在等待其他进程做完某些事情而不能继续执行

3 互斥:当一个进程在临界区访问共享资源时,其他进程不能进去临界区访问任何共享资源,这种情形叫做互斥。

4 竞争条件;多个线程或者进程在读写一个共享数据时结果依赖于他们执行的相对时间。

5 饥饿:指一个进程尽管能继续执行,但被调度器无限期的忽视,而不能被调度的情况。

第四章 Linux进程

1、进程的定义:一个正在执行中的程序、一个正在计算机上执行的程序实例、能分配给处理器并由处理器执行的实体、一个具有以下特征的活动单元:一组指令序列的执行、一个当前状态和相关的系统资源集合。 进程的两个基本元素是程序代码(可能被执行相同程序的其他进程共享)和与代码相关联的 数据集

1 进程控制块由操作系统创建和管理,也是操作系统能够支持多进程和提供多处理的关键工具,因此也可以说进程由程序代码相关数据进程控制块(PCB)组成的。

2 进程的状态:新建态、就绪态、运行态、退出态、阻塞态;

**新建态** 为操作系统新创建的进程,但还没有把它加入可执行进程组中,通常是进程控制块已经创建但还没加载到主存中的新进程

**退出态** 操作系统从可执行进程组中释放出的进程,或者是他自身停止了,或者因为某种原因被取消。

2、进程控制结构:操作系统在管理和控制进程时,必须知道进程的位置,以及必要的进程属性(进程ID、进程状态等)

1 通常属性的集合被称为进程控制块(process control block)PCB。

2 程序、数据、栈、PCB称为进程映像。

僵尸进程

什么叫僵尸线程:正常来说子进程在执行完毕后应由父进程回收子进程,释放子进程占用的资源。但有一种情况,父进程已经执行完毕,被系统回收,但此时子进程尚未执行完毕,当子进程执行完毕后,init进程会回收其占用的资源。而僵尸进程是指,子进程执行完毕后,父进程没有等待子进程,以至于父进程没有释放子进程的资源,此时子进程将成为一个僵尸进程。此时子进程占用的进程号不能被其他进程申请

任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个子进程在结束时都要经过的阶段。如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是“Z”。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UH_SZJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值