从设计哲学了解linux为何如此强~
正文大家好,我是bug菌~在这个软件开源的时代,对于大部分嵌入式软件开发者来说并不需要从零去设计和编写一个软件,不管是内核包括嵌入式linux或RTOS等实时操作系统,还是一些驱动库、设计模式及框架基本都可以找到合适的开源项目,并且还存在大量的开源代码应用示例等。那么如何完美地利用这些资源来帮助我们开发项目呢?最基本的便是知道它是干啥的,提供了哪些API服务供功能使用,然而有时候并不是非常契合,我

正文
大家好,我是bug菌~
在这个软件开源的时代,对于大部分嵌入式软件开发者来说并不需要从零去设计和编写一个软件,不管是内核包括嵌入式linux或RTOS等实时操作系统,还是一些驱动库、设计模式及框架基本都可以找到合适的开源项目,并且还存在大量的开源代码应用示例等。
那么如何完美地利用这些资源来帮助我们开发项目呢?最基本的便是知道它是干啥的,提供了哪些API服务供功能使用,然而有时候并不是非常契合,我们需要会修改这些开源软件的配置信息,特殊一点的可能还要裁剪、替换掉部分的模块或者功能,最终匹配我们自己的软件系统,此时就需要开发者对开源的软件设计架构等等非常的熟悉,不过后者对于大部分开发者而言机会并不是很多。
为了加深对开源软件的理解该从哪入手呢?我觉得先从软件的整体框架上进行把控,再根据自身工作或者学习需要去专研自己感兴趣的部分,否则会学得云里雾里。
那么今天跟大家介绍一下类Unix系统的几个设计理念,这样可以帮助大家在处理嵌入式linux系统相关问题时有一个方向标,那其他玩RTOS的同志们是否有用呢?那是同样适用的,毕竟很多系统都是相互借鉴方式方法,linux这么成功的案例摆在这里,有什么理由不借鉴一下呢?
1
类Unix系统
Linus Torvalds学生时代在学习操作系统课程时,对 Unix 产生了浓厚兴趣。由于 Unix 的商业版本价格昂贵且源代码不公开,Linus 决定开发一个类似 Unix 的操作系统。1991 年,Linus 发布了 Linux 内核的源代码,并在 GNU 通用公共许可证(GPL)下开源,后来吸引了全球众多开发者参与到内核的改进和完善,所以Linux 内核借鉴了 Unix 的许多设计思想。

所以把在设计理念、功能特性以及操作方式上与 Unix 操作系统相似的操作系统我们基本上都叫做类Unix操作系统,比如Linux、MacOS、FreeBSD等都是类Unix操作系统。
2
简洁
Unix的简洁性在其系统调用设计上体现得尤为突出,这一特点对类Unix操作系统的发展产生了较多积极的影响:
-
系统调用数量精简化相较于部分提供数千个系统调用的操作系统,Unix仅提供几百个系统调用 。较少的系统调用数量并非意味着功能受限,而是通过精心设计,使每个调用都具备高效且核心的功能。例如,进程创建主要依赖
fork系统调用,它复制当前进程,生成一个子进程,简洁地完成了进程创建的核心操作。这种精简化设计避免了系统调用的繁杂冗余,开发者无需在大量功能类似的调用中艰难抉择,能够更高效地进行编程。 -
设计目的明确化:Unix的每个系统调用都有清晰、明确的设计目的。以文件操作相关的系统调用为例,
open用于打开文件,设定打开模式(读、写、追加等);read负责从已打开文件中读取数据;write则将数据写入文件。这些调用围绕文件操作的不同方面,目的清晰,开发者易于理解和使用。这种明确的设计目的,使得Unix系统在实现复杂功能时,能通过系统调用的有序组合来达成,而非依赖大量功能模糊的系统调用。
系统调用的简洁性和明确性,降低了操作系统的设计与实现难度,还为开发者提供了清晰、高效的编程接口,抽象统一的能力属实强。
3
一切皆文件
“一切皆文件” 是Unix操作系统的一个核心设计理念,学过或者使用过嵌入式Linux设备驱动的伙计应该是深有体会 :
统一的操作接口
-
简化编程模型:通过将数据和设备都抽象为文件,应用程序开发者可以使用一套通用的系统调用接口(
open()、read()、write()、lseek()和close())来处理不同类型的实体。例如,无论是读取硬盘上的文本文件,还是从串口设备接收数据,开发者都可以使用相似的代码逻辑。对于文件操作,open("data.txt", O_RDONLY)用于打开名为data.txt的文件以只读方式读取;对于串口设备,假设设备文件为/dev/ttyS0,同样可以使用open("/dev/ttyS0", O_RDWR)来打开串口设备进行读写操作。这大大简化了编程模型,开发者无需为不同类型的设备或数据存储学习不同的操作方式,降低了学习成本和编程复杂度。 -
提高代码可移植性:统一的接口使得应用程序在不同设备和数据存储之间的切换变得更加容易,提高了代码的可移植性。例如,一个原本从本地文件读取数据进行处理的程序,如果需要改为从网络设备接收数据,只需修改
open调用的参数,将文件名替换为网络设备对应的文件路径(如/dev/tcp/192.168.1.100/80,在某些支持这种设备文件表示网络连接的系统中),而程序中其他使用read、write等调用的部分基本无需修改。这使得程序能够更方便地适应不同的硬件环境和数据来源。
设备无关性
-
硬件抽象:将设备视为文件,实现了硬件的抽象化。操作系统内核负责将对设备文件的操作转换为对实际硬件设备的控制指令。例如,当应用程序对
/dev/sda(通常表示第一个SATA硬盘设备)执行write操作时,内核会将数据按照硬盘的物理特性和协议,正确地写入到硬盘的相应扇区。这种抽象使得应用程序无需关心具体硬件设备的细节,如硬盘的物理寻址方式、扇区大小等,只需要按照文件操作的方式进行数据交互。 -
易于设备管理和扩展:对于操作系统而言,这种抽象方式使得设备管理更加统一和简单。新增一种设备时,只需在内核中为其创建对应的设备文件,并实现相应的设备驱动程序来处理针对该设备文件的系统调用。例如,添加一个新的USB摄像头设备,内核会创建类似
/dev/video0的设备文件,驱动程序负责实现open时的设备初始化、read时的图像数据采集等功能。这样,操作系统可以以一致的方式管理各种设备,方便设备的添加和扩展。
数据与设备的一致性
-
数据处理的通用性:无论是普通文件中的数据,还是设备产生或接收的数据,都可以通过相同的方式进行处理。这使得数据处理算法可以更加通用化。例如,一个文本处理程序可以使用
read读取文件内容进行分析,同样也可以通过读取设备文件获取来自传感器等设备的数据进行处理。这种通用性提高了软件的复用性,减少了重复开发。 -
系统架构的简洁性:“一切皆文件” 的理念使得操作系统的架构更加简洁和清晰。所有的数据和设备操作都遵循相同的概念模型,减少了系统中不同类型操作的特殊情况和复杂逻辑。
4
策略与机制分离
进程创建:迅速且独特:
Unix进程创建速度极快,这得益于其独特的 fork() 系统调用。fork() 调用瞬间复制当前进程,生成一个与父进程几乎完全相同的子进程。这一过程高效的原因在于,Unix采用了写时复制(Copy - On - Write,COW)技术。在 fork() 执行初期,子进程和父进程共享大部分资源,如内存页面,只有当其中一个进程试图修改这些共享资源时,才会真正复制相应的资源,大大减少了进程创建的开销。例如,在一个多任务处理的服务器环境中,当有新的客户端连接请求时,服务器进程可以迅速通过 fork() 创建子进程来处理该连接,快速响应客户端需求。
进程间通信:简单而稳定
Unix提供了一套简单却稳定的进程间通信(IPC)元语,如管道(Pipe)、信号(Signal)、消息队列(Message Queue)、共享内存(Shared Memory)和信号量(Semaphore)等。这些机制为进程之间的数据交换和同步提供了可靠手段。以管道为例,它是一种半双工的通信方式,允许一个进程将数据写入管道,另一个进程从管道中读取数据,常用于实现命令的链式操作,如 ls | grep "test",ls 命令的输出通过管道作为 grep 命令的输入。这种简单直观的通信方式,使得不同进程间的数据传递变得轻松。
设计理念:策略与机制分离
Unix将进程创建的快速简洁策略与进程间通信机制相分离。快速的进程创建策略促使Unix程序专注于一次保质保量完成一个单一任务,每个程序功能明确、职责清晰。例如,grep 程序专注于文本搜索,sort 程序专注于数据排序。而简单稳定的进程间通信机制则让这些单一目的的程序能够方便地组合起来。就像在复杂的文本处理场景中,先通过 grep 筛选出特定文本行,再通过 sort 对结果进行排序,不同程序各司其职,通过进程间通信协同完成复杂任务。
这种策略和机制分离的设计理念,为Unix系统构建了清晰的层次化结构。进程创建机制位于底层,为上层应用提供快速生成执行单元的能力;进程间通信机制则处于中间层,负责协调不同进程间的交互;而基于这些的各类应用程序构成了系统的上层,它们利用下层提供的能力,以模块化、组合式的方式解决各种复杂问题,使得Unix系统在面对不断变化的任务需求时,始终保持高效、稳定且易于维护。
最后
好了,今天就跟大家分享这么多了,如果你觉得有所收获,一定记得点个赞~
唯一、永久、免费分享嵌入式技术知识平台~
推荐专辑 点击蓝色字体即可跳转
☞ MCU进阶专辑 
☞ “bug说”专辑 
☞ 专辑|手撕C语言
☞ 专辑|经验分享

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐




所有评论(0)