[架构之路-28]:目标系统 - 系统软件 - Linux OS内核功能架构图解、内核构建、内核启动流程

目录

第1章 Linux概述

1.1 嵌入式系统简介

1.2 嵌入式系统的架构

1.3 什么是操作系统OS与主流操作系统

1.4 什么是嵌入式操作系统

1.5 Linux操作系统

1.6 Linux操作系统的特点与好处

1.7  Linux系统工具链完整

1.8 Linux内核

第2章 Linux内核为应用程序提供哪些服务

2.1 Linux系统进程地址空间

2.2 POSIX接口

2.3 应用程序的内存操作

2.4 内核控制

2.5 用户管理

2.6 进程管理

2.7 本地文件操作

2.8 获取内存信息

2.9 字符硬件设备控制

2.10 网络操作

2.11 服务汇总

第3章 Linux五大功能模块总结

第4章 如何在目标板上构建Linux

4.1 Linux开发流程

4.2 Linux的编程框架

4.3 Linux 源代码目录

4.4 内核的配置

4.5内核的编译

4.6 内核的加载

4.7 Linux硬件驱动程序的自动加载

4.8 Linux目标系统

第5章 Linux内核的启动流程

5.1 嵌入式系统总体启动流程

5.2 Linux系统启动过程

5.3 Linux内核通过init进程和inittab的方式加载用户进程

5.4 Linux内核通过SystemD进程和xxx.targt的方式加载用户进程

5.5 init进程与systemD的比较

5.6 Linux shell、库函数、内核、应用程序的关系


第1章 Linux概述

1.1 嵌入式系统简介

1.2 嵌入式系统的架构

1.3 什么是操作系统OS与主流操作系统

操作系统(英语:Operating System,缩写:OS)一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序

根据运行的环境,操作系统可以分为桌面操作系统手机操作系统,服务器操作系统,嵌入式操作系统等。

 因此,操作系统不仅仅是管理进程和调度进程的程序,它是管理一切软硬资源的系统程序。

1.4 什么是嵌入式操作系统

嵌入式操作系统(Embedded Operating System,简称:EOS)是指用于嵌入式系统的操作系统。

嵌入式操作系统是一种用途广泛系统软件,通常包括与硬件相关的底层驱动软件系统内核设备驱动接口通信协议图形界面、标准化浏览器等。

嵌入式操作系统负责嵌入式系统的全部软、硬件资源的分配、任务调度,控制、协调并发活动。

它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能。

在嵌入式领域广泛使用的操作系统有:

嵌入式实时操作系统µC/OS-II嵌入式LinuxWindows EmbeddedVxWorks等,以及应用在智能手机和平板电脑的AndroidiOS等。

1.5 Linux操作系统

Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU操作系统

它能运行主要的Unix工具软件、应用程序和网络协议。

Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版,如基于社区开发的debianarchlinux,和基于商业开发的Red Hat Enterprise LinuxSUSEOracle 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.4 内核控制

2.5 用户管理

2.6 进程管理

(1)架构

(2)主要操作

(3)进程间通信

2.7 本地文件操作

(1)架构

(2)主要操作

 

2.8 获取内存信息

(1)架构

(2)方法

2.9 字符硬件设备控制

(1)架构

 (2)操作方法

2.10 网络操作

(1)架构

(2)操作方法

2.11 服务汇总

第3章 Linux五大功能模块总结

根据内核的核心功能,Linux内核提出了5个子系统,分别负责如下的功能:

(1)Process Scheduler,也称作进程管理、进程调度。

        负责管理CPU资源,以便让各个进程可以以尽量公平的方式共享CPU资源。

(2)Memory Manager,内存管理。

        负责管理Memory(内存)资源,以便让各个进程可以安全地共享内存资源

另外,内存管理会提供虚拟内存的机制,该机制可以让进程使用多于系统可用Memory的内存,不用的内存会通过文件系统保存在外部非易失存储器中,需要使用的时候,再取回到内存中。

(3)VFS(Virtual File System),虚拟文件系统。

Linux内核将不同功能的外部设备,例如Disk设备(硬盘、磁盘、NAND Flash、Nor Flash等)、输入输出设备、显示设备等等,统一抽象为可以通过统一的文件操作接口(open、close、read、write等)来访问。

        这就是Linux系统“一切皆是文件”的体现(其实Linux做的并不彻底,因为CPU、内存、网络等还不是文件)。

        VFS使得各个进程可以安全地共享除了CPU和内存之外的其他硬件设备资源

(4)IPC(Inter-Process Communication),进程间通信。

        IPC不管理任何的硬件,它主要负责Linux系统中进程之间的通信

(5)Network,网络子系统。

        负责管理系统的网络设备,并实现多种多样的网络标准。

       VFS使得各个进程可以安全地共享网络硬件设备。

        VFS使得不同机器上的进程之间可以安全地共享网络硬件设备,并进行相互通信。

第4章 如何在目标板上构建Linux

4.1 Linux开发流程

4.2 Linux的编程框架

4.3 Linux 源代码目录

4.4 内核的配置

 

4.5内核的编译

4.6 内核的加载

4.7 Linux硬件驱动程序的自动加载

4.8 Linux目标系统

第5章 Linux内核的启动流程

5.1 嵌入式系统总体启动流程

(1)上电或复位

(2)ROM code或bootstrap:SOC芯片内的启动程序

(3)uboot:bootloader, 负责初始化RAM和CPU,然后加载Linux内核,Linux内核是一个独立于rootfs文件系统之外的内核镜像文件。

(4)文件系统:rootfs,Linux内核启动后的文件系统,包括各种系统级工具、库函数、系统程序、应用内程序等。

(5)应用程序:存在与rootfs中的应用程序,是运行在用户空间的特定应用的程序。

5.2 Linux系统启动过程

备注:

内核版本2.6以及之前的版本,内核是通过init进程和inittab来加载文件系统中的用户空间程序。

内核版本3.10以及以后的版本,内核是通过SystemD进程和xxx.target文件来加载文件系统中的用户空间程序。

这是两种不同启动和管理用户空间程序的机制

当然,用户空间程序包括(1)Linux的系统程序和(2)用户程序。

5.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语法均适用于该字段。

5.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管理

启动计算机的时候,需要启动大量的进程。

如果每一次启动,都要一一写明本次启动需要哪些进行,先启动哪些进程,后启动哪些进程,进程的启动顺序和依赖关系,必须通过人工的方式进行维护,一旦出错,系统就无法启动,显然非常不方便。

5.5 init进程与systemD的比较

(1)init进程的缺点

  • 启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
  • 启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长
  • 需要脚本自己解决进程之间的依赖关系。
  • 需要其他辅助程序管理启动后的进程。

(2)systemd的优点

在较新的linux系统上,都使用systemd 取代了init,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。字母d是守护进程(daemon)的缩写。

systemd为系统启动和管理提供了完整的解决方案

它不仅仅能够启动进程,还能够解决进程与进程之间的依赖关系,

它不仅仅能够启动进程,还能够串行地启动存在依赖关系的进程。

它不仅仅能够启动进程,还能够并行地启动没有依赖关系的进程。

它不仅仅能够启动线程,还能够监控、管理它启动的线程。

systemd不是简单的一个命令,它提供了非常复杂一组命令,涵盖系统管理的方方面面

因此,systemd命令就集的功能远远大于init进程。

5.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命令

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
领航者Zynq是赛灵思公司推出的一系列可编程SoC(System on Chip)芯片,其独特之处在于将硬件逻辑部分(FPGA)与高性能处理器(ARM CPU)相结合,可以实现强大的硬件和软件协同设计。 对于领航者Zynq的Linux开发指南,以下是一些建议: 1. 理Zynq架构:了Zynq芯片的主要组件,包括处理系统(PS)和可编程逻辑部分(PL)。理PS与PL的连接方式以及它们之间的交互原理十分重要。 2. 安装开发环境:首先需要安装适用于Zynq的Linux开发工具。赛灵思推出了SDSoC和Vitis两个开发套件,可以便捷地进行软硬件协同开发。同时,还需要合适的Linux发行版,如PetaLinux。 3. 创建项目:在开发环境中创建一个新的Zynq项目。项目主要包括硬件设计和软件开发两部分,需要设置处理器系统的参数和外设连接方式,以及定义软件的编译选项和库文件。 4. 开发Linux驱动:根据所需的外设和功能,在Linux环境下开发相应的设备驱动程序。可以使用赛灵思提供的开源驱动程序作为参考,也可以根据具体需求自行编写。 5. 编写应用程序:根据项目的需求,编写相应的用户空间应用程序。可以使用C/C++或其他高级编程语言进行开发,与驱动程序进行交互,实现芯片的特定功能。 6. 调试和优化:在开发过程中,可能会遇到各种问题,如硬件和软件的兼容性、性能瓶颈等。需要使用调试工具对代码进行调试,分析系统的性能瓶颈,并进行相应的优化,以提升系统性能。 7. 部署和测试:当开发完成后,需要将软件和硬件一同部署到目标设备上进行测试。通过验证功能的正确性和性能的稳定性,确保项目能够正常运行并满足要求。 总之,领航者Zynq的Linux开发指南涵盖了从环境搭建到应用开发的全过程。对于开发者来说,需要理Zynq架构、熟悉开发工具、编写驱动和应用程序,进行调试和优化,并最终部署和测试项目。只有掌握这些基本步骤,才能充分发挥Zynq的优势,实现高性能的软硬件协同设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文火冰糖的硅基工坊

你的鼓励是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值