近几年,“AIoT”一词便频频出现,成为人工智能及物联网行业的热门词汇。硬件变得智能化的趋势已不可逆,人与物、物与物之间的连接越来越智能了。在2020抗疫期间,我国更是应用了一系列AI机器人和物联网技术作用于疫情防控,以“硬核科技”让防疫更高效。一时之间,AIoT成了“香饽饽”。越来越多的企业将AIoT列为其主要发展方向。随之爆发的也是一大批AIoT相关技术专业人才需求。
那么什么是AIoT呢?
AIoT(人工智能物联网)=AI(人工智能)+IoT(物联网)。AIoT融合AI技术和IoT技术,通过物联网产生、收集海量的数据存储于云端、边缘端,再通过大数据分析,以及更高形式的人工智能,实现万物数据化、万物智联化,物联网技术与人工智能追求的是一个智能化生态体系,除了技术上需要不断革新,技术的落地与应用更是现阶段物联网与人工智能领域亟待突破的核心问题。
那么在实现人工智能和物联网技术应用的最底层技术就是通过嵌入式技术实现的,今天就来讲一讲嵌入式技术中的Linux内核常识。
一
内核功能、内核发行版
1、到底什么是操作系统?
(1) linux、windows、android、ucos就是操作系统;
(2) 操作系统本质上是一个程序,由很多个源文件构成,需要编译连接成操作系统程序(vmlinz、zImage);
(3) 操作系统的主要作用就是管理计算机硬件,给应用程序提供一个运行环境。
2、操作系统核心功能(管理资源)
(1) 内存管理
如果没有操作系统,内存需要程序自己管理。譬如在uboot中用哪块内存,由程序自己决定,无注册和限制。若程序不小心把同一块内存重复使用,就会出现程序逻辑错误。
反之,操作系统会负责管控所有的内存。程序使用内存时要向系统申请和注册,由系统的内存管理模块分配内存,保证内存使用不冲突。
(2) 进程调度
操作系统下支持多个应用程序同时运行,这是宏观上的并行。
实际上在单核心CPU上,从微观角度是不能并行的。宏观上的并行就是操作系统提供的分时复用机制,操作系统的进程调度模块负责在各个进程之间进行切换。
(3) 硬件设备管理
操作系统的硬件设备管理模块就是驱动模块。当没有操作系统时,控制任何硬件都要自己写代码。反之,操作系统本身会去控制各个硬件。
(4) 文件系统
文件系统是管理存储设备的一种方式。存储设备由很多扇区组成,每个扇区有512/1024/2048/4096字节,以扇区为单位进行读写。文件系统可以管理某个文件在物理磁盘的哪个扇区,我们只需记得文件系统中的目录和文件名就可以了。
3、操作系统扩展功能
(1) 协议栈
(2) 有用的应用程序包
应用程序本身不属于操作系统内核的一部分。应用程序是给人用的,面向某种功能的,譬如ping程序用来测试网络是否联通,ifconfig程序用来配置网卡。
4、内核和发行版的区别?
(1) 内核是操作系统内核的简称
内核负责实现操作系统的核心功能,内核不包括应用程序。只有内核是无法使用的,因为做任何事情都是通过相应的应用程序来完成。
出售操作系统的人,会把内核和一些常用的应用程序,打包提供给普通用户,这就是操作系统的发行版(也就是普通意义上的操作系统)。
(2) 内核只有一个,发行版有很多
发行版集成不同的应用程序,譬如ubuntu、redhat、suse、centos...。
二
内核和驱动的关联
1、学习linux的思路
(1) 对庞大的整体要有认识;
(2) 对各分层的作用要清楚;
(3) 对层次间的关联和互相调用要理解;
学习路线就是先建立框架和整体,然后逐渐去学习各个细节部分,逐步细化。
2、驱动属于内核的一部分
(1) 驱动就是内核中的硬件设备管理模块,属于发展非常活跃的部分;
(2) 驱动工作在内核态(cpu在跑操作系统)与用户态(cpu在跑应用程序)的区别在于权限不同;
(3) 驱动程序故障可能导致整个内核崩溃;
(4) 驱动程序漏洞会使内核不安全;
三
内核和应用、根文件系统的关联
1、应用和内核的关系
(1) 应用程序不属于内核,而是在内核之上的;
(2) 应用程序工作在用户态,是受限制的;
(3) 应用程序故障不会导致内核崩溃;
(4) 应用程序通过内核定义的API接口来调用内核工作;
总结:应用程序是最终目标,内核就是为应用程序提供底层资源管理的服务员。
2、内核和根文件系统
(1) 根文件系统提供根目录,属于内核?NO!;
(2) 进程1存放在根文件系统中,进程1会使得内核态变为用户态;
(3) 内核启动最后会去装载根文件系统;
总结:根文件系统为操作系统启动提供了很多必备的资源,如根目录、进程1。
四
linux内核的模块化设计
1、什么是模块化设计?
(1) 模块化设计就是内核中各个功能模块在代码上是彼此独立的。
譬如说调度系统和内存管理系统之间,并没有全局变量的互相引用,甚至函数互相调用也很少,就算有也是遵循一个接口规范的。而模块化设计的目的就是实现功能模块的松耦合。
(2) 模块化设计是必要的。
linux内核庞大、代码量大,如果设计时完全设计成一体(各个文件、各个函数之间紧耦合),其复杂度就超出了人所能理解的范围。
2、模块化设计的体现
(1) 配置时可裁剪。
linux内核在编译之前可以进行配置,同时可以选择组成内核的成千上万个模块的要与不要,选择了之后还有更多细节的配置。
(2) 模块化编译和安装。
为了操作方便,从静态的升级逐渐变成了动态的升级(不需要重启系统,更不需要重新烧录系统)。这种动态的升级也是由模块化来支持的。
(3) 源码中使用条件编译。
这种在uboot中,大家已经见过。
五
选择合适版本的内核
1、linux内核版本变迁简史
(1) linux0.01,初版;
(2) linux0.11,很多讲linux内核源代码解析的书都是以这个版本为原本来讲,譬如《图解linux内核设计的艺术》;
(3) linux2.4,比较接近现代的版本,很多经典的书都是以2.4版本内核为参照的,譬如《LDD3》。linux2.4版本的晚期内核,在前几年还会经常碰到有用的;
(4) linux2.6早期,它与2.4晚期内核类似;
(5) linux2.6晚期,它的内核较早期内核有一些改变,尤其是驱动相关的部分和一些头文件的位置,目前还算是比较主流;
(6) linux3.x 4.x。
2、如何选择合适的内核版本
(1) 并不是越新版本的内核越好;
(2) 选择SoC厂家移植版本会减少工作量;
3、S5PV210适用的内核版本
(1) 2.6.35.7 + android2.3/QT4.8.3
(2) 3.0.8 + android4.0