基于linux的操作系统的通用启动流程(一)

本文介绍了基于Linux的操作系统的通用启动流程,重点讲述了kernel、rootfs和不同应用领域间的差异。文章以Linux为基础,讨论了Busybox、SystemV和Systemd在根文件系统中的角色和应用场景,并强调了它们在初始化进程、命令解析等方面的功能。此外,还提到了Android的Binder机制以及桌面系统如Ubuntu、uos等的定制化开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇我们讲解linux的通用启动流程,按照我们一贯的方式总分总的节奏,因为后面的每个子系统也很大,所以我们讲解子系统的时候也是按照总分总的方式。注意因为基于linux的各式各样的操作系统绝对不下100个,像嵌入式,然后我们的桌面有fedora,redhat,centos,debian,ubuntu以及最近操作系统国产化的麒麟,uos等,甚至手机智能电视车载几乎一统天下的android系统。路由器通常使用的openwrt等。无一例外他们的内核都是linux,我后面统一称为linux-base的操作系统。这里的linux我称作狭义的操作系统,它仅仅有内核,像这些android,uos,ubutbu等我们统一称为广义的操作系统。他们不仅仅有内核,还有和用户交互的各种各样,各个领域的系统服务(用户态的子系统,像显示管理,桌面系统管理,用户管理,管理鼠标键盘等输入输出管理,应用安装管理,文件系统管理等等)

我们以linux-base的系统为例子,来说明这些系统的组成和启动流程以及各个阶段的作用。

在这里插入图片描述
基于linux的操作系统,kernel和rootfs改动基本不大,最大的区别在于最上面这一层,不同应用领域差别很大,同一个领域在这一层又差别很小哈哈。kernel里面通常是各个系统可以实现自己的一些特殊的子系统,比如android为了支撑上层用户态的service的通信在kernel里面添加了新的一种进程间通信方式binder,Android的/dev/binder这个这个节点就是android为了应用通信模糊化实现的节点。大多基本没变化。

rootfs我们无论是看android,还是嵌入式,还是ubuntu等,命令行看到的目录结构基本一样,这就是跟文件系统。通常根文件系统通常也是拿过来直接用,当然做产品开发可能会扩展,稍作定制修改。主要的制作根文件系统有三种,busybox,systemv,systemd。代码可以百度网上下载。如果大家要深入学习,建议从busybox开始,代码量少,完全可以自己实验,然后就是我们常用的命令ls,cd,ps,top,ssh,tftp或者telnet等的代码都可以从里面阅读学习原理。当然我说这么多不是说每一个命令的原理源码都要看,是看了几个之后掌握学习方法,因为程序太多了。方法更重要。从学习中发现共性,掌握方法,这个才是目的。我们通常制作根文件系统的时候像libc库等基础的库也会制作进去,当然用户自己实现具体业务的定制化的库也可以制作进去。

busybox:大家通常说的瑞士军刀,优点,小巧,代码量很少,通常解析/etc/initab等以及间接连接起来的配置文件,busybox提供了init进程,shell进程,以及我们常用的ls,cd,mv等命令,以及ssh,tftp等工具,我们编译busybox的时候可以像编译kernel一样的裁剪编译。通常用于嵌入式,像我们的路由器,各种基于linux的小家电等等,还有就是众所周知的android。通常我们看/bin/init或者/sbin/init,会发现他是一个软连接名字叫做busybox.

systemv:早期的桌面系统,像早期的ubuntu,debian等都是基于systemv的根文件系统,他会解析/etc/initab,/etc/rc.d/,/etc/rcN.d/等目录的配置文件,同样的提供了init进程程序,shell程序,以及ls,top等等和busybox一样的命令,当然实现的代码肯定不一样,但是原理一样,还有就是命令参数通常会扩展,比如ps命令,你会发现在busubox下的命令有些参数不支持,比较简单,但是systemv的就更加的精细化。同样他是一个系统工程,可以编译裁剪。

systemd:目前大多数基于linux的桌面系统使用的解决方案,像现在版本的ubuntu/fedora,uos等。之所以出现systemd是为了解决systemv系统启动慢的问题,系统的很多服务是相互依赖的,不是独立启动的,systemd的方案提高了服务的并行度。提高了系统的启动速度。向前兼容systemv的配置格式,我们通常会在/etc/systemd/system/下定义了一些target,/lib/systemd/system下定义了很多的service等。同样的systemd也提供了init,shell,以及基本的ls,cd等命令,当然还有我们使用的service start等,systemctr命令等特有的命令。也可以编译裁剪,我们目前各种基于linux的桌面系统,服务器等都使用systemd来制作根文件系统。我们看我们系统下的/sbin/init或者/bin/init,会发现他也是一个软连接指向/lib/systemd/systemd

我们说了kernel是管理所有的硬件,将发生的事件通过标准接口告知用户态,给用户态操作具体的硬件设备提供服务。相当于地基。那么同样的思想,我们的用户态有千奇百怪的应用,千奇百怪的业务,不能是独立的各写各的。所以就有需要基础的管理,这个时候根文件系统提供了最基础的和kernel沟通的一个环境,比如shell命令行中断我们可以通过命令和系统沟通了(命令的源码可以看到)。查看系统最基本的状态。这个就是根文件系统的作用。一个最基本的带有交互功能的系统其实已经有了。但是在像pc领域还是不方便,因为用户不可能记住那么多的命令用命令来做事情,这对于用户要求太高。

所以从这里出现了分化,pc需要桌面所以ubuntu,uos等就提供了桌面系统。有些不需要桌面的系统到这里就结束了,只需要实现自己的业务就好了。

通常嵌入式领域不需要桌面显示,比如摄像头等不需要桌面,但是需要流媒体协议将视频传输,具体的业务里面就实现了各种流媒体协议sip/rtsp等。为了方便升级,就要有升级方案,比如web,那么里面可以使用appweb/httpd等实现服务器端。这样我们的摄像头可以通过网页升级或者配置。

为了更形象,再比如路由器需要支持各种网络协议,以及一些配置命令工具大家刚买来的路由器,配置的时候是不是要通过192.168.1.1之类的地址通过网页配置。通常里面也许就是用的httpd/appweb之类的库来实现了http后端和前端的网页。所以我们可以通过网页配置。

当然也有些嵌入式需要显示,比如我们的一些工控领域需要有一个配置界面,操作界面,再比如我们家庭使用的室内机,在有人呼叫的时候,可以看到门外的人,并且也有简单的配置,这些都可以通过现成的minigui来定制开发。

手机上要支持各种各样的应用,那么android就需要从用户态系统级的管理,应用的安装,系统的升级,应用开发接口的标准化,系统安全,用户管理,文件管理等,这些和pc其实很像,只是android要考虑资源的限制,所以是完全自己实现的一套管理,windowsmanager,activitymanager,inputmanager,zygote虚拟机,surfaceflinger,hal层解决方案,jni扩展机制。这个就是我们通常听到的android的framework层。通常像华为/oppo/vivo等系统的定制化开发主要的一部分工作就在这里,早期的手机厂商在这里的改动不大,随着发展,这里的定制化开发越来越深入,所以我们早期看到的手机设置界面基本类似,桌面除了背景不同,基本类似,现在随着定制化的深入,可以看到手机的差异化比之前大多了比如双屏等。包括华为现在说的鸿蒙手机端系统,主要也在这里,加入了华为的一些系统级别的应用服务方案。

然后我们说pc端,pc和手机一样面向普通的消费者,所以不可能也只是命令行,所以也是需要形象化的桌面的,这样像ubuntu/debian等桌面系统就有自己的桌面管理像kde/gnome等各种系统解决方案。我们使用的uos,麒麟,ubuntu,fedora大家会发现基本都是这样的解决方案,只是像uos等需要让用户保留使用windows的习惯,所以桌面定制化的比较接近windows。也有其他的系统像树莓派上有些系统也是桌面比较像windows。这里的桌面解决方案也会有和android类似的划分windowsmanager等之类的划分。对于桌面应用管理,了解不多,所以我就提到这里

这里我们总结一下,我们会发现无论写android应用,还是桌面应用,会发现都有window/textview/editview/button等等这些组件概念,然后这些组件可以监听系统的一些事件。这就系统桌面管理系统统计分发这些事件等各个用户态的子系统给应用提供了基础的服务,让写应用非常方便。这就是共性。抽象出来的东西其实是一样的。像android的binder也是把另外一个系统的paml os的实现用过来的。当然这里说的似乎很简单,大家都知道button等之类的组件,但是实际上对一个桌面应用的最顶层的抽象不会是说的这么简单。

到这里我们主要说了三大部分的静态划分,下一次会继续宏观上讲解启动的宏观流程,以及三大阶段的作用。这样可以从整体上了解系统。

大家也许会好奇,我写linux,半天没有进入正题,就是因为我想先把整体的观念先灌输给大家,就像画素描一样,画一个大象,我们先画大象的整体轮廓,把整体的轮廓先画清楚,然后我们会细化鼻子,耳朵,眼睛等这些子系统。同样各个子系统的时候也是按照先轮廓,再细节的顺序。也是像素描画眼睛,先画眼睛的轮廓再细化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值