嵌入式应用编程理论和实践


嵌入式应用编程理论和实践

基础理论

基本概念

嵌入式linux硬件平台下的软件开发可以分为三种:裸机编程,linux驱动编程和linux应用编程。

裸机编程:没有操作系统支持,直接在硬件上运行的程序。

驱动编程:调用linux内核提供的接口完成设备驱动的注册,负责底层硬件操作相关逻辑。(运行在内核态)

应用编程:通过系统调用(应用层进入内核的入口)API完成应用程序的功能和逻辑(运行在用户态)

由于直接使用系统调用API并不是很方便,C语言库函数在系统调用基础上进行了封装,通常以.so文件存放在lib目录下。

文件I/O

linux下一切皆文件,所以对文件的读写操作尤为重要。一个简单的文件IO示例如下

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(void)
{
int fd1;
/* 打开源文件 src_file(只读方式) */
fd1 = open("./src_file", O_RDONLY);
if (-1 == fd1)
	return fd1;
}

调用open函数会返回一个int类型的数据(fd1),被称为文件描述符,对于linux内核而言,所有打开的文件都会通过文件描述符进行索引

且按照顺序进行分配,比如第一个打开的文件是0。在linux系统中,一个进程可以打开的文件是有限制的,可以通过ulimit -n命令进行查看(默认最多打开1024个文件)

文件被打开过程

文件在没有被打开时一般都是以一种固定的形式存放在磁盘文件系统中,被称为静态文件。如果存放在硬盘中,硬盘的最小存储单位叫做扇区(sector),每个扇区存储512字节,但是操作系统读取硬盘时一次性读取多个扇区,即一次性读取一个块(block)。块是文件存取的最小单位,最常见的是4KB,即8个sector组成与1个block。

磁盘在进行分区和格式化的时候会将其分为两个区域,一个是数据区,用于存储文件中的数据;另一个是inode区,用于存放inode table,inode table 中存放的是一个一个的 inode。不同的inode表示不同的文件,每个文件都必须对应一个inode。

inode是一个结构体,结构体中的元素记录了文件的不同信息(文件字节大小,文件所有者,文件读写执行权限,文件实践戳等等)

image-20240422142307566

用ls -i命令可以查看文件inode编号。打开一个文件,系统内部将这个过程分为三步:

①系统找到这个文件名所对应的inode编号

②通过inode编号从inode table中找到对应的inode结构体

③根据inode结构体中记录的信息,确定文件数据所在的block,并读出数据

文件被打开时的状态

由于存储设备基本都是flash块设备,块设备是以块为单位进行读写的,而内存可以按字节为单位来操作。当调用open函数打开文件时,内核会申请一段内存,并将静态文件的数据内容读取到内存中进行管理、缓存(此时内存中的文件叫做动态文件)。

linux系统中,内核会为每个进程设置一个专门的数据结构用于管理该进程,譬如记录进程的状态信息、运行特征等,被称为进程控制块(PCB)。

PCB数据结构体中有一个指针指向了文件描述符,文件描述符中的每个元素索引到对应的文件表,文件表也是一个数据结构体,其中记录了很多文件相关的信息(文件状态标志、引用计数、当前文件的读写便宜量和i-node指针)。

image-20240422144010288

空洞文件

如果文件大小4K,用lseek系统调用偏移到6000个字节处开始写入,在4096~6000字节之间出现了一个空洞,对应的文件被称为空洞文件,该文件包含前面4K数据、中间空洞部分和后面新加入的数据。

标准IO库

系统调用:(open(),read(),write(),lseek(),close())

标准IO库:(fopen(),fread(),fwrite())

调用fopen()返回一个FILE*指针,使用该指针与文件相关联。

read()和write()系统调用进行读写操作时不会直接访问磁盘设备,而是仅仅在用户空间缓冲区和内核缓冲区之间复制数据。

内核缓冲的系统调用:fsync(),fdatasync(),sync(),

标准IO缓冲:setvbuf(),setbuf(),setbuffer(),fflush()。

文件 I/O 内核缓冲区和 stdio 缓冲区之间的联系与区别,以及各种 stdio 库函数 如下图。

image-20240422164020311

linux系统文件类型

普通文件

  • 文本文件 :ASCII字符码
  • 二进制文件:.o,.bin

目录文件

文件夹

字符设备文件和块设备文件

硬件会对应到一个设备文件。设备文件并不存在于磁盘中,而是由文件系统虚拟出来的,一般是由内存来维护。

符号链接文件

类似于windows的快捷方式文件,其内容指向另一个文件的路径

管道文件

用于进程间通信

套接字文件

网络通信


文章作者: sdj
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 sdj !
  目录