文章目录
Linux系统框架
初学者首先要搞清楚的三个文件
- 三个文件
- 引导程序(bootloader):uboot.bin/uboot.imx
- Linux内核镜像:zImage
- system.img/rootfs.tar.ba2
- 初期很多工作都是围绕这三个知识点展开的
- 开发环境搭建/编译系统/烧写系统
- 不同的系统文件名会有差异
- 设备树文件(从Linux内核中分离出来的,可以看成Linux内核的一部分)
引导程序(bootloader):uboot.bin/uboot.imx
开发板上电之后,首先执行的程序。bootloader有很多中,用的最多的是uboot,它编译出来的可执行文件是uboot.bin,该文件会烧写到板子中;有的开发板会打包成别的形式,比如uboot.imx。
bootloader在执行到最后的时候,会引导Linux内核。
Linux内核镜像:zImage
Linux内核编译出来之后,就是zImage,这个文件会烧写到开发板。Linux系统启动到最后,会去挂在文件系统。
文件系统镜像:system.img/rootfs.tar.ba2
文件系统可大可小,可以是最小系统,也可以是很大的系统(比如安卓), 对于文件系统的名称,不同的系统有不同的叫法,有的叫system.img,有的是rootfs。
Linux应用程序框架
- 应用程序编程即Linux系统编程
- Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用
- 基于Linux内核之上,基于‘系统调用’或者库函数的编程
- 系统调用由操作系统核心提供,运行于核心态:而普通的函数调用由函数库或者用户自己提供,运行于用户态
- ‘系统调用’在ARM系统中一般用‘软中断’的方式来实现(可以参考ARM体系结构相关课程)
- ARM处理器的工作模式:
- 用户模式
- 系统模式
- 中断模式
- 包含丰富的内容(可参照‘系统调用’清单)
- 文件IO
- 多线程
- 多进程
- 网络SOCKET编程
- 时间函数、文件系统操作
- 用户管理、内存管理
文件IO
- 一些皆文件(串口/LED等)
- 文件I/O(对应串口等的read/write)实际就是对文件的读写操作。
- open()
- read()
- write()
- ioctl()
- close()
- 文件描述符(句柄)fd=open("目录文件“);
- 标准I/O(带缓冲的I/O)
- 可以移植更好,因为在系统接口的基础上更抽象了一步。
- 与文件I/O的区别:文件I/O直接使用系统调用接口/系统IO
- 而标准接口/标准IO,则是建立在系统IO和标准C库上的,诸如:
- fopen()
- fread()
- fwrite()
Linux文件I/O(五种I/O模型)
- 阻塞
- 非阻塞
- 信号
- 多路复用
- 异步
串口是慢速(相对于CPU)设备
- 可以一直等着(阻塞式)
- 读完当前就走(非阻塞式)
- 发送一个请求,数据到了之后内核发送一个信号,然后再过去读(信号驱动IO模型)
- 读数据的事全部交给内核,内核读完之后再通知已完成(异步IO)
- IO多路复用
Linux多进程
- 多进程是多任务在Linux上的具体实现,多任务是操作系统的基本功能。
- 进程的三种状态:就绪、阻塞、运行
- 就绪:被创建后,时间片耗尽后,进入就绪态。就是线程等待CPU进行处理
- 阻塞:就是线程等待其他阻塞式任务完成
- 运行:CPU给予进程时间片,在时间片内对其进行处理。
Linux多进程2
- fork():字面意义上看,就是分岔的意思
- 进程间通信
- 管道(匿名管道和命名管道)
- 信号
- 信号量
- 消息队列
- 共享内存
- 套接字
Linux多线程
- 单个县城内可以运行多个线程,线程是操作系统时间片调度的最小单位,线程可以看作循环执行的程序。
- 每个线程可使用进程的全局变量
- 线程生成函数:pthread_create()
- 线程同步(公用资源,合理分配资源的方式)
- 互斥锁
- 条件变量
- 读写锁
- 信号量
网络通信(socket编程)
- 网络通信是重点
- 很多操作系统的网络编程方式是一样的,都采用了socket方式(统一度很高!)
- socket直译:插座
Linux应用编程框架
- 框架式学习
- 逐步细化
- 问题:什么时候用进程,什么时候用线程?