[架构之路-28]:目标系统 - 系统软件 - Linux OS内核功能架构图解内核构建内核启动流程
Posted 文火冰糖的硅基工坊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[架构之路-28]:目标系统 - 系统软件 - Linux OS内核功能架构图解内核构建内核启动流程相关的知识,希望对你有一定的参考价值。
目录
4.3 Linux内核通过init进程和inittab的方式加载用户进程
4.4 Linux内核通过SystemD进程和xxx.targt的方式加载用户进程
4.6 Linux shell、库函数、内核、应用程序的关系
第1章 Linux概述
1.1 嵌入式系统简介
1.2 嵌入式系统的架构
1.3 什么是操作系统OS与主流操作系统
操作系统(英语:Operating System,缩写:OS)是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序。
根据运行的环境,操作系统可以分为桌面操作系统,手机操作系统,服务器操作系统,嵌入式操作系统等。
因此,操作系统不仅仅是管理进程和调度进程的程序,它是管理一切软硬资源的系统程序。
1.4 什么是嵌入式操作系统
嵌入式操作系统(Embedded Operating System,简称:EOS)是指用于嵌入式系统的操作系统。
嵌入式操作系统是一种用途广泛的系统软件,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等。
嵌入式操作系统负责嵌入式系统的全部软、硬件资源的分配、任务调度,控制、协调并发活动。
它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能。
在嵌入式领域广泛使用的操作系统有:
嵌入式实时操作系统µC/OS-II、嵌入式Linux、Windows Embedded、VxWorks等,以及应用在智能手机和平板电脑的Android、iOS等。
1.5 Linux操作系统
Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。
它能运行主要的Unix工具软件、应用程序和网络协议。
Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版,如基于社区开发的debian、archlinux,和基于商业开发的Red Hat Enterprise Linux、SUSE、Oracle Linux等。
伴随着互联网的发展,Linux得到了来自全世界软件爱好者、组织、公司的支持。它除了在服务器方面保持着强劲的发展势头以外,在个人电脑、嵌入式系统上都有着长足的进步。使用者不仅可以直观地获取该操作系统的实现机制,而且可以根据自身的需要来修改完善Linux,使其最大化地适应用户的需要。
Linux不仅系统性能稳定,而且是开源软件。其核心防火墙组件性能高效、配置简单,保证了系统的安全。在很多企业网络中,为了追求速度和安全,Linux不仅仅是被网络运维人员当作服务器使用,甚至当作网络防火墙,这是Linux的一大亮点。
Linux具有开放源码、没有版权、技术社区用户多等特点,开放源码使得用户可以自由裁剪,灵活性高,功能强大,成本低。尤其系统中内嵌网络协议栈,经过适当的配置就可实现路由器的功能。这些特点使得Linux成为开发路由交换设备的理想开发平台。
1.6 Linux操作系统的特点与好处
(1)完全免费
Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变,这让Linux吸收了无数程序员的精华,不断壮大。
(2)完全兼容POSIX1.0标准
这使得可以在Linux下通过相应的模拟器运行常见的DOS、Windows的程序。这为用户从Windows转到Linux奠定了基础。许多用户在考虑使用Linux时,就想到以前在Windows下常见的程序是否能正常运行,这一点就消除了他们的疑虑。
(3)多用户
Linux支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。
(4)多任务
多任务则是现代电脑最主要的一个特点,Linux可以使多个程序同时并独立地运行,每个程序是一个独立的任务,一个独立的进程。这里的多任务主要是指多进程的含义。
(5)良好的界面
Linux同时具有命令行字符界面和图形界面。
在字符界面用户可以通过键盘输入相应的指令来进行操作。
它同时也提供了类似Windows图形界面的X-Window系统,用户可以使用鼠标对其进行操作。在X-Window环境中就和在Windows中相似,可以说是一个Linux版的Windows。
(6)支持多种硬件平台
Linux可以运行在多种硬件平台上,如具有x86、680x0、SPARC、Alpha等处理器的平台。
此外Linux还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上。完全支持Intel64位芯片架构。同时Linux也支持多处理器技术。多个处理器同时工作,使系统性能大大提高。
1.7 Linux系统工具链完整
简单操作就可以配置出合适的开发环境,可以简化开发过程,减少开发中仿真工具的障碍,使系统具有较强的移植性;
1.8 Linux内核
操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。
一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。
计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。
但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。
Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。
Linux内核不包括rootfs文件系统中的应用程序。
第2章 Linux内核为应用程序提供哪些服务
2.1 Linux系统进程地址空间
地址空间不是数据存储的真实物理地址。它是一段虚拟地址。最终一定要以某种方式转化为物理地址。由此可知,我们在任何情况下在应用程序中打印出来的地址都是虚拟地址,而不是其真实物理地址。
在上图示例中,每个新创建的进程都可以拥有3G的逻辑地址空间。所有的进程共享相同的3G的物理地址空间,而逻辑地址空间到物理地址空间的动态分配和映射,都是由操作系统的内存管理单元来完成的。
2.2 POSIX接口
可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX)是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由理查德·斯托曼(RMS)应IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface(可移植操作系统接口)的缩写,而X则表明其对Unix API的传承。
为一个POSIX兼容的操作系统编写的操作系统之上的应用程序,可以在任何其他POSIX操作系统上编译执行。POSIX现在已经发展成为一个非常庞大的标准族,并不局限于Unix, 一些其他的操作系统,如Microsoft windows NT, Linux等都支持或者部分支持POSIX标准。
Linux操作系统提供的服务,就是基于POXIS的接口标准完成的。
2.3 应用程序的内存操作
2.3 内核控制
2.4 用户管理
2.5 进程管理
(1)架构
(2)主要操作
(3)进程间通信
2.6 本地文件操作
(1)架构
(2)主要操作
2.7 获取内存信息
(1)架构
(2)方法
2.8 字符硬件设备控制
(1)架构
(2)操作方法
2.9 网络操作
(1)架构
(2)操作方法
2.10 服务汇总
第3章 如何在目标板上构建Linux
3.1 Linux开发流程
3.2 Linux的编程框架
3.3 Linux 源代码目录
3.4 内核的配置
3.5内核的编译
3.6 内核的加载
3.7 Linux硬件驱动程序的自动加载
3.8 Linux目标系统
第4章 Linux内核的启动流程
4.1 嵌入式系统总体启动流程
(1)上电或复位
(2)ROM code或bootstrap:SOC芯片内的启动程序
(3)uboot:bootloader, 负责初始化RAM和CPU,然后加载Linux内核,Linux内核是一个独立于rootfs文件系统之外的内核镜像文件。
(4)文件系统:rootfs,Linux内核启动后的文件系统,包括各种系统级工具、库函数、系统程序、应用内程序等。
(5)应用程序:存在与rootfs中的应用程序,是运行在用户空间的特定应用的程序。
4.2 Linux系统启动过程
备注:
内核版本2.6以及之前的版本,内核是通过init进程和inittab来加载文件系统中的用户空间程序。
内核版本3.10以及以后的版本,内核是通过SystemD进程和xxx.target文件来加载文件系统中的用户空间程序。
这是两种不同启动和管理用户空间程序的机制
当然,用户空间程序包括(1)Linux的系统程序和(2)用户程序。
4.3 Linux内核通过init进程和inittab的方式加载用户进程
(1)init进程
init进程是内核启动的第一个用户级进程。
init有许多很重要的任务,比如像启动getty(用于用户登录)、实现运行级别、以及处理孤立进程。
对于Linux系统的运行来说,init程序是最基本的程序之一。但你仍可以大部分的忽略它。一个好的Linux发行版本通常随带有一个init的配置,这个配置适合于绝大多数系统的工作,在这样一些系统上不需要对init做任何事。
当内核启动了自己之后(已被装入内存、已经开始运行、已经初始化了所有的设备驱动程序和数据结构等等),通过启动用户级程序init来完成引导进程的内核部分。因此,init总是第一个进程(它的进程号总是1)。
内核在几个位置上来查寻init,这几个位置以前常用来放置init,但是init的最适当的位置(在Linux系统上)是/sbin/init。如果内核没有找到init,它就会试着运行/bin/sh,如果还是失败了,那么系统的启动就宣告失败了。
当init开始运行,它通过执行一些管理任务来结束引导进程,例如检查文件系统、清理/tmp、启动各种服务以及为每个终端和虚拟控制台启动getty,在这些地方用户将登录系统。
(2)inittab
当init启动后,init读取/etc/inittab配置文件。当系统正在运行时,如果发出HUP信号,init会重读它;这个特性就使得对init的配置文件作过的更改不需要再重新启动系统就能起作用了。
/etc/inittab文件有点复杂。
inittab为linux初始化文件系统时init初始化程序用到的配置文件。这个文件负责设置init初始化程序初始化脚本在哪里;每个运行级初始化时运行的命令; 开机、关机、重启对应的命令;各运行级登录时所运行的命令。
(3)initab示例
# Begin /etc/inittab
id:3:initdefault:
si::sysinit:/etc/rc.d/init.d/rc sysinit
l0:0:wait:/etc/rc.d/init.d/rc 0
l1:S1:wait:/etc/rc.d/init.d/rc 1
l2:2:wait:/etc/rc.d/init.d/rc 2
l3:3:wait:/etc/rc.d/init.d/rc 3
l4:4:wait:/etc/rc.d/init.d/rc 4
l5:5:wait:/etc/rc.d/init.d/rc 5
l6:6:wait:/etc/rc.d/init.d/rc 6
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
su:S016:once:/sbin/sulogin
1:2345:respawn:/sbin/agetty tty1 9600
2:2345:respawn:/sbin/agetty tty2 9600
3:2345:respawn:/sbin/agetty tty3 9600
4:2345:respawn:/sbin/agetty tty4 9600
5:2345:respawn:/sbin/agetty tty5 9600
6:2345:respawn:/sbin/agetty tty6 9600
# End /etc/inittab
(4)initab解读
格式: id:runlevels:action:process 其中某些部分可以为空。
id:1~2个字符,配置行的唯一标识,在配置文件中不能重复。
runlevels:
配置行适用的运行级别,在这里可填入多个运行级别,比如12345或者35等。
Linux有7个运行级别,如下:
- 0:关机。//关机的时候才会自动执行。
- 1:单用户字符界面。
- 2:不具备网络文件系统(NFS)功能的多用户字符界面。
- 3:具有网络功能的多用户字符界面。
- 4: 保留不用。
- 5:具有网络功能的图形用户界面。
- 6:重新启动系统。//重启机器时执行。
action
该域指定init线程如何处理后续的process程序。
行为 | 描述 |
respawn | 启动并监视第4项指定的process,若process终止则重启它 |
wait | 执行第4项指定的process,并等待它执行完毕 |
once | 执行第4项指定的process |
boot | 不论在哪个执行等级,系统启动时都会运行第4项指定的process |
bootwait | 不论在哪个执行等级,系统启动时都会运行第4项指定的process,且一直等它执行完备 |
off | 关闭任何动作,相当于忽略该配置行 |
ondemand | 进入ondemand执行等级时,执行第4项指定的process |
initdefault | 系统启动后进入的执行等级,该行不需要指定process |
sysinit | 不论在哪个执行等级,系统会在执行boot 及bootwait之前执行第4项指定的process |
powerwait | 当系统的供电不足时执行第4项指定的 process,且一直等它执行完毕 |
powerokwait | 当系统的供电恢复正常时执行第4项指定的process,且一直等它执行完毕 |
powerfailnow | 当系统的供电严重不足时执行第4项指定的process |
ctrlaltdel | 当用户按下【Ctrl+Alt+Del】时执行的操作 |
kbrequest | 当用户按下特殊的组合键时执行第4项指定的process,此组合键需在keymaps文件定义 |
process
所要执行的shell命令。任何合法的shell语法均适用于该字段。
4.4 Linux内核通过SystemD进程和xxx.targt的方式加载用户进程
(1)systemD进程
systemd这一名字源于Unix中的一个惯例:在Unix中常以“d”作为系统守护进程(英语:daemon,亦称后台进程)的后缀标识。除此以外,systemd亦是借代英文术语D体系,而这一术语即是用于描述一个人具有快速地适应环境并解决困难的能力。
systemd即为system daemon,是linux下的一种init软件。systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。
systemd 的优点是功能强大,使用方便,它能够自动处理和管理各种用户进程之间的依赖关系。并按照依赖关系按顺序启动用户进程,这是init进程所不具备的能力。
缺点是体系庞大,非常复杂;systemd不是简单的一个命令,而是非常复杂一组命令,涵盖系统管理的方方面面。systemd囊括的功能板块很多,内容更倾向运维工作,目前因项目需求,就服务板块进行分析。
systemd执行服务是并行的,如果没有人为的干预附加启动依赖,同级服务启动顺序是乱序的,这个在后续会体现出来。
(2)systemd中Target管理
启动计算机的时候,需要启动大量的进程。
如果每一次启动,都要一一写明本次启动需要哪些进行,先启动哪些进程,后启动哪些进程,进程的启动顺序和依赖关系,必须通过人工的方式进行维护,一旦出错,系统就无法启动,显然非常不方便。
4.5 init进程与systemD的比较
(1)init进程的缺点
- 启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
- 启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。
- 需要脚本自己解决进程之间的依赖关系。
- 需要其他辅助程序管理启动后的进程。
(2)systemd的优点
在较新的linux系统上,都使用systemd 取代了init,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。字母d是守护进程(daemon)的缩写。
systemd为系统启动和管理提供了完整的解决方案。
它不仅仅能够启动进程,还能够解决进程与进程之间的依赖关系,
它不仅仅能够启动进程,还能够串行地启动存在依赖关系的进程。
它不仅仅能够启动进程,还能够并行地启动没有依赖关系的进程。
它不仅仅能够启动线程,还能够监控、管理它启动的线程。
systemd不是简单的一个命令,它提供了非常复杂一组命令,涵盖系统管理的方方面面。
因此,systemd命令就集的功能远远大于init进程。
4.6 Linux shell、库函数、内核、应用程序的关系
(1)Linux内核
(2)系统调用
(3)Shell
Shell是系统的用户界面,是有Linux提供的、运行在用户空间的应用程序,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。
不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。
Linux系统提供的海量的一般用户或系统管理员的操作命令,就是通过借助要shell传递给内核的。
(4)库函数
函数库:函数库是由系统建立的具有一定功能的函数的集合。
库中存放函数的名称和对应的目标代码,以及连接过程中所需的重定位信息。各种编程语言都提供了自己的函数库功程序员使用,用户也可以根据自己的需要建立自己的用户函数库。
库函数:存放在函数库中的函数。库函数具有明确的功能、入口调用参数和返回值。
库函数(Library function)是将常用的访问操作系统的函数封装入库,供用户使用的一种方式。
方法是把一些常用到的函数编完放到一个文件里,供不同的人进行调用。
调用的时候把它所在的文件名用#include<>加到里面就可以了。
一般是放到lib文件里的。
(5)应用程序
应用程序,指为完成某项或多项特定工作的计算机程序,它运行在用户模式或用户空间,可以和用户进行交互,也具有可视的用户界面,具有可视化UI的应用程序通常又被分为两部分:图形用户接口(GUI)和引擎(engine)。
应用程序可以通过如下的几种方式访问或控制操作系统的资源:
- POSIX接口
- 库函数
- shell命令
以上是关于[架构之路-28]:目标系统 - 系统软件 - Linux OS内核功能架构图解内核构建内核启动流程的主要内容,如果未能解决你的问题,请参考以下文章
[架构之路-56]:目标系统 - 平台软件 - 总体架构概述
[架构之路-25]:目标系统 - 系统软件 - bootloader uboot内存映射与启动流程
[架构之路-21]:目标系统 - 系统软件 - 计算机系统架构计算机指令系统结构化程序与分层编程。
[架构之路-29]:目标系统 - 系统软件 - Linux OS内核以及内核驱动的调试技术