目录
0 引言
1 Linux体系结构
2 Linux内核结构
3 Linux内核源码目录结构
4 小结
学习嵌入式Linux,之前也说过,包括几部分:应用开发、驱动开发、内核开发,我们后面的大部分博文都会围绕在Linux驱动开发展开,但是Linux内核有和驱动开发相关联的东西,所以,本博文主要对Linux内核进行提纲挈领,有个总体的认知,内容包括:Linux体系结构、Linux内核结构、Linux内核源码目录结构。
Linux体系分为两大块:内核空间(系统调用接口、内核、平台支持代码、硬件支持)、用户空间(用户应用、C库),之所以这样划分是有一定道理的。原因如下:
1)架构分层,开发高效:将Linux底层和应用分开了,应用开发的工程师做自己的应用开发,底层硬件驱动工程师做自己的驱动开发,在大型项目中,各司其职,协作效率高。
2)保护内核,安全第一:Linux内核是整个Linux体系结构的核心,其主要做的事就是进程调度、内存管理、虚拟文件系统、网络接口等等,这些很多涉及到硬件的直接操作,要是我们随便上一个应用都能直接对底层调用,那就容易乱套了,稍微一个应用崩溃,可能整个系统都不稳定了。很多CPU都有不同的工作模式限定可以执行的指令或访问的寄存器不同,像ARM有7种模式,X86有Ring0-3 4个不同的级别权限,Android应用更是放在JVM(Java虚拟机)上运行,远离底层。
此处说的Linux内核结构,就是第一节内容中Linux体系结构中内核空间的Kernel,内核的结构如下图所示,各模块简介如下,我们主要关注的其实是Device Drivers设备驱动,其他部分内核已经是做好了的,现阶段了解即可。
1)System Call Interface:SCI层,为用户空间提供一套标准的系统调用函数访问Linux内核;
2)Process Management:PM进程管理,内核通过SCI来提供一个API用于创建进程(fork、exec),停止进程(kill、exit),进程间通信(signal等),进程调度;
- 进程实际是某特定应用程序的一个运行实体,在 Linux 系统中,能够同时运行多个进程,Linux 通过在短的时间间隔内轮流运行这些进程而实现“多任务”。这一短的时间间隔称为“时间片”,让进程轮流运行的方法称为“进程调度” ,完成调度的程序称为调度程序。
- 进程调度控制进程对CPU的访问,当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。
- 通过多任务机制,每个进程可认为只有自己独占计算机,从而简化程序的编写。每个进程有自己单独的地址空间,并且只能由这一进程访问,这样,操作系统避免了进程之间的互相干扰以及“坏”程序对系统可能造成的危害。 为了完成某特定任务,有时需要综合两个程序的功能,例如一个程序输出文本,而另一个程序对文本进行排序。为此,操作系统还提供进程间的通讯机制来帮助完成这样的任务。Linux 中常见的进程间通讯机制有信号、管道、共享内存、信号量和套接字等。
3)Memory Management:MM内存管理,用于控制多进程安全的共享内存;
对任何一台计算机而言,其内存以及其它资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux 采用了称为“虚拟内存”的内存管理方式。Linux 将内存划分为容易处理的“内存页”(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。
4)Vitual File System:VFS虚拟文件系统,其隐藏了不同种文件系统的具体细节,为文件操作提供了统一的接口,在用户和文件系统之间提供了一个交换层。VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。
5)Network Stack:网络协议栈,提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。众所周知,TCP/IP 协议是 Internet 的标准协议,同时也是事实上的工业标准。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。
6)Arch:包含了硬件原厂提供的代码,Linux内核用在不同的处理器上,底层硬件是不同的,具体就体现在这里。
7)Device Drivers:设备驱动,Linux 内核中有大量代码是在驱动程序部分,设备驱动程序提供一组操作系统可理解的抽象接口完成和操作系统之间的交互,而与硬件相关的具体操作细节由设备驱动程序完成。该部分是后期要重点研究的内容,Linux驱动一般分为网络设备、块设备、字符设备、杂项设备。
目前Linux内核最新到了5.11.16版本,就下载了这个版本看下目录结构,压缩包112.2MB,解压出来将近1个GB了。
可以看到,功能相关的文件放在了不同的子目录下:
【arch目录】:平台目录,内核所能支持的所有CPU架构,如ARM、X86等都有对应的子目录,每个子目录下又有boot(系统引导)、mm(内存管理)、kernel(相关内核特性实现方式,如信号处理)、lib(硬件相关的库函数)、tools(生成镜像的工具);
【block目录】:部分块设备驱动程序;
【certs目录】:与认证和签名相关代码;
【crypto目录】:加密压缩CRC校验;
【Documentation目录】:内核使用说明文档;
【drivers目录】:设备驱动
【fs目录】:各种文件系统的实现代码;
【include目录】:通用的头文件;
【init目录】:内核初始化和启动代码;
【ipc目录】:进程间通信实现的代码;
【kernel目录】:Linux核心功能代码,程序调度、进程控制等
【lib目录】:通用库代码;
【mm目录】:内存管理相关代码;
【net目录】:各种网络协议实现;
【samples目录】:内核编程的范例;
【scripts目录】:配置裁剪内核的工具脚本;
【security目录】:不同的Linux安全模式相关代码;
【sound目录】:音频设备驱动程序;
【tools目录】:.c编译成目标文件,连接合成可运行的内核镜像文件等工具;
【usr目录】:用于打包和压缩的CPIO等;
【virt目录】:内核虚拟机;
以上可以看到Linux的内核文件相当之多,代码量惊人,我们学习的时候不要直接扎进去看源码,这要是看完估计头发都白了,人生苦短啊,大部分代码已经是写好了的,Linux裁剪后编译的镜像可能也就几个MB,其中大部分代码也是不需要修改的,我们做Linux驱动开发,焦点在于Driver部分:函数的调用、驱动的协议等。
Linux开发之路就在前方,朋友们一起肝起来吧!
【参考】:
https://www.kernel.org
https://www.linuxprobe.com/linux-system-structure.html
http://www.360doc.com/content/18/0412/15/11935121_745034658.shtml
https://www.bilibili.com/read/cv6232273/
作于202104241425,已归档
———————————————————————————————————
本文为博主原创文章,转载请注明出处!
若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!
祝君升职加薪,鹏程万里!