详解linux系统组成结构
Linux开发架构之路 2025-01-03


NB的架构师都要具备足够的技术深度,然后才能透过问题看本质,所谓技术深度就是扎实的基础知识,要不断深入,反复研究学习,打磨自己的硬实力。不论从事云计算、虚拟化、容器、大数据、人工智能,几乎都是基于 Linux 服务器部署服务。

一、linux系统结构

linux系统看似纷繁复杂,单其核心只有一点,那就冯洛伊曼体系“存储计算”,万变不离其宗。就像一颗大树一样,枝叶繁多,但主干却很清晰简单。

Linux系统一般有4个主要部分:programs/utilities/tools

内核、shell/工具(GUN工具)、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如图1-1所示。

Computer Resources:硬件资源

Kernel:内核

GUN工具:

Shell:shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器

Programs/Utilities/Tools:库函数、工具等

File systems:文件系统是文件存放在磁盘等存储设备上的组织方法。Linux系统能支持多种目前流行的文件系统,如EXT2、 EXT3、 FAT、 FAT32、 VFAT和ISO9660。

User Application:Linux应用,标准的Linux系统一般都有一套被称为应用程序的程序集,它包括文本编辑器、编程语言、X Window、办公套件、Internet工具和数据库等

Linux开机后,内核启动,激活内核空间,抽象硬件、初始化硬件参数等,运行并维护虚拟内存、调度器、信号及进程间通信(IPC)。内核启动后,再加载Shell和用户应用程序,用户应用程序使用C\C++编写,被编译成机器码,形成一个进程,通过系统调用(Syscall)与内核系统进行联通。进程间交流需要使用特殊的进程间通信(IPC)机制。

二. Linux系统1: linux内核组成

Linux内核是世界上最大的开源项目之一,内核是与计算机硬件接口的易替换软件的最低级别。它负责将所有以“用户模式”运行的应用程序连接到物理硬件,并允许称为服务器的进程使用进程间通信(IPC)彼此获取信息。

内核是操作系统的核心,具有很多最基本功能,其核心功能就是:管理硬件设备,供应用程序使用。硬件设备包括CPU、Memory(内存和外存)、输入输出设备、网络设备和其它的外围设备。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。

Linux 内核由如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理等。如图:

系统调用接口:

SCI 层提供了某些机制执行从用户空间到内核的函数调用。这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。

1、内存管理

负责管理Memory(内存)资源,以便让各个进程可以安全地共享机器的内存资源。另外,内存管理会提供虚拟内存的机制,该机制可以让进程使用多于系统可用Memory的内存,不用的内存会通过文件系统保存在外部非易失存储器中,需要使用的时候,再取回到内存中。

内存管理系统在操作系统中,不同的进程有不同的内存空间,这些内存空间需要统一的管理和分配,这就需要内存管理系统。

对任何一台计算机而言,其内存以及其它资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux  采用了称为“虚拟内存”的内存管理方式。Linux  将内存划分为容易处理的“内存页”(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。

不过内存管理要管理的可不止 4KB 缓冲区。Linux 提供了对 4KB 缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB 缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。

为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在 ./linux/mm 中找到。

2 .进程管理

进程管理系统在操作系统中,进程的执行也需要分配CPU来执行,所以,为了管理进程,我们还需要一个进程管理系统。如果运行的进程很多,则一个CPU会并发地运行多个进程,这就需要CPU的调度能力了。

进程实际是某特定应用程序的一个运行实体。在 Linux  系统中,能够同时运行多个进程,Linux  通过在短的时间间隔内轮流运行这些进程而实现“多任务”。这一短的时间间隔称为“时间片”,让进程轮流运行的方法称为“进程调度” ,完成调度的程序称为调度程序。

进程调度控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。

通过多任务机制,每个进程可认为只有自己独占计算机,从而简化程序的编写。每个进程有自己单独的地址空间,并且只能由这一进程访问,这样,操作系统避免了进程之间的互相干扰以及“坏”程序对系统可能造成的危害。为了完成某特定任务,有时需要综合两个程序的功能,例如一个程序输出文本,而另一个程序对文本进行排序。为此,操作系统还提供进程间的通讯机制来帮助完成这样的任务。Linux 中常见的进程间通讯机制有信号、管道、共享内存、信号量和套接字等。

内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface [POSⅨ] 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSⅨ 机制)。

3. 文件系统

Linux系统,一切皆文件:

1)启动一个进程,需要一个二进制文件。

2)启动进程时,需要加载一些配置文件如yml, properties等,这是文本文件

3)把日志打印到控制台上,是标准输出stdout文件

4)一个进程的输出作为另一个进程的输入,称为管道,管道也是一个文件

5)进程可以通过网络和其他进程通信,建立的socket,也是一个文件

6)进程需要访问的外部设备,也是一个文件

7)文件夹也是一个文件每个文件,Linux都会分配一个文件描述符(File Descriptor),这是一个整数。有了这个文件描述符,我们就可以使用系统调用,查看或干预进程运行的方方面面。

和 DOS 等操作系统不同,Linux 操作系统中单独的文件系统并不是由驱动器号或驱动器名称(如 A:  或 C:  等)来标识的。相反,和 UNIX  操作系统一样,Linux 操作系统将独立的文件系统组合成了一个层次化的树形结构,并且由一个单独的实体代表这一文件系统。Linux  将新的文件系统通过一个称为“挂装”或“挂上”的操作将其挂装到某个目录上,从而让不同的文件系统结合成为一个整体。Linux  操作系统的一个重要特点是它支持许多不同类型的文件系统。Linux 中最普遍使用的文件系统是 Ext2,它也是 Linux  土生土长的文件系统。但 Linux  也能够支持 FAT、VFAT、FAT32、MINIX 等不同类型的文件系统,从而可以方便地和其它操作系统交换数据。由于 Linux  支持许多不同的文件系统,并且将它们组织成了一个统一的虚拟文件系统.

虚拟文件系统(VirtualFileSystem,VFS):隐藏了各种硬件的具体细节,把文件系统操作和不同文件系统的具体实现细节分离了开来,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。

虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层。即VFS 在用户和文件系统之间提供了一个交换层。

VFS         在用户和文件系统之间提供了一个交换层:

在 VFS 上面,是对诸如 open、close、read 和 write 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文件系统(超过 50 个)的插件。文件系统的源代码可以在 ./linux/fs 中找到。

文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。

因此,用户和进程不需要知道文件所在的文件系统类型,而只需要象使用 Ext2  文件系统中的文件一样使用它们。

4. 设备驱动程序

设备驱动程序是 Linux  内核的主要部分。和操作系统的其它部分类似,设备驱动程序运行在高特权级的处理器环境中,从而可以直接对硬件进行操作,但正因为如此,任何一个设备驱动程序的错误都可能导致操作系统的崩溃。设备驱动程序实际控制操作系统和硬件设备之间的交互。设备驱动程序提供一组操作系统可理解的抽象接口完成和操作系统之间的交互,而与硬件相关的具体操作细节由设备驱动程序完成。一般而言,设备驱动程序和设备的控制芯片有关,例如,如果计算机硬盘是 SCSI  硬盘,则需要使用 SCSI  驱动程序,而不是 IDE 驱动程序。

5.网络接口(NET)

提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。众所周知,TCP/IP  协议是 Internet  的标准协议,同时也是事实上的工业标准。Linux  的网络实现支持 BSD 套接字,支持全部的TCP/IP协议。Linux内核的网络部分由BSD套接字、网络协议层和网络设备驱动程序组成。

网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。

需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享

二、Linux系统1: 内核运行原理

百度搜索:漫画趣解Linux内核:内容大概如下:

一幅来自 TurnOff.us 的漫画 “InSide The Linux Kernel” 。TurnOff.us 是一个极客漫画网站,作者 Daniel Stori 画了一些非常有趣的关于编程语言、Web、云计算、Linux 相关的漫画。


整体架构画面分为三层:(按我个人理解)

最下面一层看起来像是一个仓库,就是文件系统(File System);

地面层有很多人(大部分都是企鹅)在各种忙碌,代表着进程表(Process Table);

还有一个跃层,代表着人机交互界面(Terminals And Termina process);

这些就是Linux内核的基本层次架构,所有程序执行、资源调度、系统功能都在这个内核中运行和实现。

关于操作系统处理任务/服务的大体流程简单归纳为:1.输入—2.中断/异常处理——3.调度进程——4.服务进程处理——5.输出结果:

接下来我们按照漫画的分层分开说明一下这些流程:

1、顶层的半层:输入输出交互界面

交互界面是一个跃层,说明它是内核的一部分,但和进程管理大厅联系紧密。这里墙上有很多屏幕,代表它通过可视化的界面来处理信息,实际上就是系统和人的交互界面。

屏幕有很多个,代表系统可以同时处理多路的命令交互。屏幕上的内容都有不同,有的屏幕还没有开启,有的屏幕是字符界面,有的还有图形界面,代表不同的GUI的交互状态。

这里有两个进程来管理这些屏幕。有一个进程面向屏幕,正在一个控制板上进行操作,笔者的理解是它是一个输出进程,可以控制各个屏幕的不同状态和输出内容;另一个进程面向大厅,手中拿着一份文件,应该正在向大厅里面的进程下达质量,所以它是一个输入控制进程。这样我们也能够理解为什么这里是一个半层,因为它需要一个开放的架构来连接输入输出和执行进程。

跃层有很多不同的屏幕,每个屏幕上写着 TTY(这就是对外的终端)。比如说最左边 tty4 上输入了 “fre” ——这是想输入 “freshmeat…” 么 :d ;它旁边的 tty2 和 tty3 就正常多了,看起来是比较正常的命令;tty7 显示的图形界面,对,图形界面(X Window)一般就在 7 号终端;tty5 和 tty6 是空的,这表示这两个终端没人用。等等,tty1 呢?

跃 层,也是最接近用户的一层。两只企鹅在名为 TTY 的窗口面前工作,一只企鹅在控制台前戳戳点点,另一只在仔细端详程序的输出。TTY 中文为电传打字机,关于 TTY,可以追溯到计算机的远古时代,那时候我们使用的还只是没有主机的打字机。设备的输入要经过长长的串行线路才能到达那昂贵的大型主机 (Mainframe Computer)。

作为 Unix-like 的 Linux 也继承了这一特性,在 /dev 目录下和 ps 命令的输出中我们都可以看到它的身影。

TTY(终端)是对外沟通的渠道之一,但是,不是每一个进程都需要 tty,某些进程可以直接通过其他途径(比如端口)来和外部进行通信,对外提供服务的,所以,这一层不是完整的一层,只是个跃层。

2、中间层:进程和进程调度

中间层则体现的是流程中的:调度,服务以及输出,

进程调度处理任务:忙碌的大厅,各司其职。

大厅里,就是各种进程运行和忙碌的主要场所了。

大厅的中心,是一张长条桌。这里应该就是主进程表了,一个主进程正在和一堆进程开会,可能正在协调它们的运行;这些进程神态和状态各异,有的认真听讲,有的不屑一顾,有的左顾右盼,有的沉默不语...,确实很像系统中各种任务执行的状态。

大厅一角堆了很多管道,这是Linux处理信息的

应用进程(企鹅):

图中有很多企鹅,它们通常代表着在Linux内核中运行的进程。之所以使用企鹅,应该是因为Linux的Logo和形象代表就是一个企鹅。但如果我们认真观察,会发现虽然它们都是企鹅,但是它们的装扮、动作甚至神态都是不一样的,隐喻着它们有不同的特性和状态。一般情况下,企鹅的胸前会挂着一个写有数字的工牌,代表着这个进程的进程编号。

初始化(init)进程:左上角有一个小企鹅,站着,仿佛在说些什么这显然是一位家长式的人物,不过看起来周围坐的那些小企鹅不是很听话 —— 你看有好多走神、自顾自聊天的 —— “喂喂,说你呢,哇塞娃(171),转过身来”。它代表着 Linux 内核中的初始化(init)进程,也就是我们常说的 PID 为 1 的进程。桌子上坐的小企鹅都在等待状态(Wait)中,等待工作任务。

监控进程(看门狗):除了企鹅之外,我们还看到有几条小狗。这些都是看门狗(Watch Dog)。它们负责在系统内部进行巡查,处理各种异常状况。当小企鹅们不听话时,它就会汪汪地叫喊起来。

异常进程: 最后还有一个小丑,应该就代表着系统内部的异常进程,比如病毒木马等恶意软件。

cron 进程:看它急得头上都冒汗了,这位老弟不断的看着手表,执行着周期性任务。

web守护进程:一只 PID 为 1341 的小企鹅就是大名鼎鼎的 Apache HTTP 服务器进程。它坚守在 80 端口提供 HTTP 服务。它头上的羽毛就是 Apache 的标志。

ssh守护进程:墨镜的企鹅守护着 22 端口。它看着要比其他的企鹅要更加有威严,脸上彷佛写着生人勿进四个字。原来它看护的是用于 SSH 服务的 22 端口,SSH 服务常常用于远程登陆,所以必须要仔细审查。

进程交互:管道

两位企鹅累的满头大汗,任劳任怨的在搬动着管道。一只小企鹅可以把自己手上的东西通过这个管道,传递给后面的小企鹅。


进程端口号:门

这个大厅里面,有几扇门,代表着和外部世界沟通的网络端口。

通用web端口号80: 左边的那个门上面的编号是80,这是标准的HTTP的端口号,所以这是一个标准Web端口;端口旁边有一个守卫进程,熟悉网络编程的同学应该可以看出来它就是Apache Tomcat,因为它头上戴着那个熟悉的羽毛。


ssh端口号22:右边那个门编号是22,就是SSH的端口,旁边那个戒备森严,戴墨镜耳机的保安,表明了这个端口的安全级别比较高。


ftp端口21:中间角落里面那个门的门牌都歪了,因为它已经年久失修。因为它是ftp端口(端口编号21),现在已经基本上没人用了。

系统交互:楼梯

和shell界面交互:SSH旁边的楼梯,可以上到交互界面层;

和文件系统交互:而21端口旁边,还有一个隐蔽的楼梯,上面FS的指示牌,表明从这里可以下到文件系统层。

3、地基层:文件系统

文件系统是单独的一层。这里面有很多柜子,按照行列码放整齐,表明了文件系统保存文件的方式和结构。文件放在柜子的抽屉里面,而且也是按照索引依次存放。


大部分抽屉都是关闭的,说明现在还没有人来访问。库房里有编号是421(PID(Process ID) 为 421 的进程)的一个进程正在查看文件;还有一个柜子已经打开,但旁边却没有人,可能是那个进程打开了文件,却由于某种原因没有正常关闭(比如异常或强行退出,甚至进程本身就忘了要关闭文件句柄),所以需要一条看门狗(右下角有一只小狗Watchdog)来进行处理,这代表对文件系统的监控。

4、总结、使用银行柜台业务总结linux系统处理任务流程:

这里像不像去银行柜台办理业务处理:1.请求输入—2.中断/异常处理——3.调度进程——4.服务进程处理——5.输出结果:

大家应该都去过银行办业务,由于银行的柜台就那么几个,办业务的人数又多,所以,去银行的第一件事就是排队取号:

银行柜台办理不同的业务类型:

普通业务(存取款)柜台(80web端口服务线程池):、例如有个有两个固定普通业务窗口(核心线程数为2)3位工作人员(最大线程数为3),等候座位(任务队列),一个规则《超出银行最大接待能力处理办法》(饱和等待策略)。

vip业务柜台(22 ssh端口直接优先处理)

办卡业务(办卡机直接办理):直接shell脚本处理。

如果大家办理普通业务,

首先是内存管理(叫号系统的号码):

由于银行的普通业务柜台就那么2个,办业务的人数又多。所以,去银行的第一件事就是排队取号,注意这个号号,并不代表去哪个柜台办业务,只是说你前面等待办业务的人数,不过需要等着叫号系统叫到你之后,才能办理业务,而且最终办理业务的柜台是随机的。好了,类比一下就是,银行柜台好比是物理内存,而排队序号就是虚拟地址,我们想办业务只能通过手里拿着的这个 “虚拟地址”,然后,必须通过叫号系统,将虚拟地址,即排队序号 翻译成具体的物理地址,即柜台号,我们才能办理业务。

进程管理:

进程属性:

每个柜台窗口都有窗口id(进程ID和服务端口号)

进程调度:

按照叫号系统的指示,办理普通业务的客户被安排到普通业务窗口,办理办卡业务的客户被安排办卡机办理。

线程调度:

例如有个有两个固定普通业务窗口(核心线程数为2)3位工作人员(最大线程数为3),等候座位(任务队列),一个规则《超出银行最大接待能力处理办法》(饱和拒绝策略)。

A客户(任务A)去银行(线程池)办理业务,但银行刚开始营业,窗口服务员还未就位(相当于线程池中初始线程数量为0),于是经理(线程池管理者)就安排1号工作人员(创建核心线程1去执行任务)接待A客户。

在A客户业务还没办完时,B客户(任务B)又来了,于是经理(线程池管理者)就安排2号工作人员(创建核心线程2去执行任务)接待B客户。

在A、B客户都没有办完业务的情况下,C客户(任务C)来了,于是经理(线程池管理者)就安排C客户先坐到等候座位上,并告知他:如果1、2号工作人员空出,C客户就可以前去办理业务。

此时D客户(任务D)又来了,(两个窗口都在忙,等候座位也满了)于是经理(线程池管理者)赶紧安排3号工作人员(创建非核心线程3去临时执行任务D)在大堂站着给D客户办理业务。

假如前面的业务都没有结束的时候E客户(任务E)又来了,此时2位窗口工作人员,和1位临时工作人员都在忙,等候座位也满了,于是经理只能按《超出银行最大接待能力处理办法》(饱和处理机制)拒接接待E客户。

如果是vip客户,可以直接被被安排到前面,抢占其他客户的时间办理,这显然是调度算法显然调高了vip客户(某个应用程序)的优先级,可以快速抵达“柜台”。

这当于Linux中进程的调度,它的头脑十分强大,需要按照各个应用程序的优先级顺序,必要时可以进行“抢占式调度”,抢占调度指的是一个高优先级进程是否可以强行夺取低优先级进程的处理器资源。如果可以强行夺取,就是可抢占的调度。这也是础光Linux实时性改造的一大亮点。

中断处理:

中断是指CPU接受到I/O设备发送的中断信号的一种响应。CPU会暂停正在执行的程序,保留CPU环境后自动转去执行该I/O设备的中断处理程序。执行完毕后回到断点。继续执行原来的程序。中断是由外部程序引起的所以称为外中断。小企鹅们会根据各类中断请求来进行CPU的工作安排。

类比银行业务,当前窗口柜台的客户X办理业务需要一些手续盖章而中断一段时间,但业务员可以继续办理其他客户业务,当客户X办理业务的手续盖章完成了,业务员继续唤醒客户X来办理。

三 . linux系统2: shell

shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行,是一个命令解释器。另外,shell编程语言具有普通编程语言的很多特点,用这种编程语言编写的shell程序与其他应用程序具有同样的效果。

在Linux系统上,通常有好几种Linux shell可用。不同的shell有不同的特性,有些更利于创建脚本,有些则更利于管理进程。所有Linux发行版默认的shell都是bash shell。bash shell由GNU项目开发,被当作标准Unix shell。目前主要有下列版本的shell:

1.Bourne Shell:是贝尔实验室开发的。 

2.BASH:是GNU的Bourne Again Shell,是GNU操作系统上默认的shell,大部分linux的发行套件使用的都是这种shell。

3.Korn Shell:是对Bourne SHell的发展,在大部分内容上与Bourne Shell兼容。 

4.C Shell:是SUN公司Shell的BSD版本。

1、shell的类型

linux启动什么样的shell程序取决于用户ID配置。


在/etc/passwd文件中,在用户ID记录的第7个字段中列出了默认的shell程序。只要用户登录到某个虚拟控制台终端或是在GUI中启动终端仿真器,默认的shell程序就会开始运行。例如:用户root使用/bin/bash(bash shell)作为自己的默认shell程序.

不过还有另外一个默认shell是/bin/sh,它作为默认的系统shell,用于那些需要在启动时使用的系统shell脚本。你经常会看到某些发行版使用软链接将默认的系统shell设置成bash shell,如CentOS发行版:

$ ls -l /bin/sh


/bin/sh 相当于 /bin/bash --posix,使用 sh 调用执行脚本相当于打开了bash 的 POSIX 标准模式,它们之间的各种差异都是来自 POSIX 标准模式和bash的差异。

2、shell的父子关系

用于登录某个虚拟控制器终端或在GUI中运行终端仿真器时所启动的默认的交互shell,是一个父shell。

在CLI提示符后输入/bin/bash命令或其他等效的bash命令时,会创建一个新的shell程序。这个shell程序被称为子shell(child shell)。子shell也拥有CLI提示符,同样会等待命令输入。

例如:使用ps -f


使用ps -f的时候,显示出了两个进程:

第一个bash shell程序,也就是父shell进程,进程ID是3966191,运行的是bash shell程序。

第二个bash shell程序,即子shell进程,进程ID为3972365,对应的是命令ps -f。

在生成子shell进程时,只有部分父进程的环境被复制到子shell环境中。

3、常用的GUN命令总结

GUN是GNU的一种小工具,它是“GNU即不仅仅是UNIX”的缩写。GNU工具集是一系列用于UNIX操作系统的自由软件工具。这些工具提供了强大的功能,可以用于文件操作、文本处理、版本控制、编译和调试等任务。

下面是一些常见的GUN工具及其含义:

1). 文本处理工具

grep:用于在文件中搜索指定的字符串,并返回匹配的行。它支持正则表达式,可以进行高级搜索。

awk:一种强大的文本处理工具,它可以根据指定的规则对输入文件进行处理。它常用于提取、转换和格式化文本数据。

sed:流编辑器,用于对输入流进行文本转换。它可以在文件中查找和替换字符串,删除或插入行,并执行其他编辑操作。

2. 文件管理工具:

GUN命令集还包含了用于文件管理的工具。

ls:命令用于列出目录内容,

cp:命令用于复制文件,

mv:命令用于移动或重命名文件,

rm:命令用于删除文件等。

find:用于在指定目录中查找文件。它可以基于文件属性(如文件名、大小、时间戳等)进行搜索,并支持复杂的逻辑操作。

tar:用于创建和提取归档文件。它可以将多个文件和目录打包成一个单独的文件,也可以提取已打包的文件。

gzip:用于压缩文件。它使用Lempel-Ziv算法对文件进行压缩,以减小文件大小。

这些工具提供了对文件系统的基本操作。

3). 进程管理和系统监控:

GUN命令集中的一些工具可用于管理和监控系统中运行的进程。

ps:命令用于列出当前运行的进程,

top:命令用于实时监视系统资源的使用情况,

kill:命令用于终止正在运行的进程等。

4). 网络工具

GUN命令集包含了一些网络工具,用于管理和配置网络连接。

ifconfig:命令用于配置网络接口,

ping:命令用于测试网络连接的可达性,

netstat:命令用于显示当前网络连接和端口状态等。

5. 软件包管理:

GUN命令集中还包含了一些用于软件包管理的工具。

apt-get命令:用于在Debian和Ubuntu系统中安装和升级软件包,

yum命令:用于在Red Hat和CentOS系统中进行相同的操作。

这些工具简化了软件安装和更新的过程。

6. 软件编译相关:

make:用于自动构建软件项目。它根据指定的规则和依赖关系,自动编译和链接源代码文件,生成可执行文件或库文件。

gcc:GNU编译器集合,用于编译C、C++和其他支持的编程语言。它将源代码文件编译成可执行文件。

gdb:GNU调试器,用于调试程序。它可以在程序运行过程中暂停执行,并提供查看变量、堆栈和内存的功能。

四 . linux系统3: 文件管理系统

各操作系统使用的文件系统并不相同,例如,Windows98 以前的微软操作系统使用 FAT(FAT16)文件系统,Windows 2000 以后的版本使用 NTFS 文件系统,而 Linux 的正统文件系统是 Ext2。

在 CentOS 6.3 系统中,默认的文件系统是 Ext4,它是 Ext3(Ext2) 文件系统的升级版,在性能、伸缩性和可靠性方面进行了大量改进,变化可以说是翻天覆地的,比如:

  • 向下兼容 Ext3;

  • 最大 1EB 文件系统和 16TB 文件;

  • 无限数量子目录;

  • Extents 连续数据块概念;

  • 多块分配、延迟分配、持久预分配;

  • 快速 FSCK、日志校验、无日志模式、在线碎片整理、inode 增强、默认启用 barrier 等;

Linux支持的常见文件系统

Linux 系统能够支持的文件系统非常多,除 Linux 默认文件系统 Ext2、Ext3 和 Ext4 之外,还能支持 fat16、fat32、NTFS(需要重新编译内核)等 Windows 文件系统。也就是说,Linux 可以通过挂载的方式使用 Windows 文件系统中的数据。Linux 所能够支持的文件系统在 "/usr/src/kemels/当前系统版本/fs" 目录中(需要在安装时选择),该目录中的每个子目录都是一个可以识别的文件系统。我们介绍较为常见的 Linux 支持的文件系统,如表 1 所示。

五 . linux系统4: 应用程序,用户态和内核态

应用程序是无法直接访问硬件资源的,需要通过通过内核SCI 层提供的接口来访问硬件资源。


Linux系统将自身划分为两部分,一部分为核心软件,即是kernel,也称作内核空间,另一部分为普通应用程序,这部分称为用户空间。

区分用户空间和内核空间的目的是为确保系统安全。在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃。比如:清内存、设置时钟等。因为如果应用程序和内核在同一个保护级别,那么应用程序就有可能有意或者不小心进入了内核空间,破坏了内核空间的代码和数据,系统崩溃就不足为奇。所以CPU将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾难的指令。Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3, 内核空间级别为“RING0”, 用户空间级别为RING3。

linux的内核是一个有机的整体。每一个用户进程运行时都好像有一份内核的拷贝,每当用户进程使用系统调用时,都自动地将运行模式从用户级转为内核级,此时进程在内核的地址空间中运行。

当应用程序进程执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(RING0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(RING3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。

内核态与用户态是操作系统的两种运行级别,跟intel cpu没有必然的联系, 如上所提到的intel cpu提供Ring0-Ring3四种级别的运行模式,Ring0级别最高,Ring3最低。Linux使用了Ring3级别运行用户态,Ring0作为 内核态,没有使用Ring1和Ring2。

内核空间和用户空间

x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。

通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。64位内核地址空间划分是不同的。

32位与64位具体地址分布如下图:


64位地址时将0x0000,0000,0000,0000 – 0x0000,7fff,ffff,f000这128T地址用于用户空间。参见定义:

#define TASK_SIZE_MAX   ((1UL << 47) - PAGE_SIZE),注意这里还减去了一个页面的大小做为保护。

而0xffff,8000,0000,0000以上为系统空间地址。注意:该地址前4个都是f,这是因为目前实际上只用了64位地址中的48位(高16位是没有用的),而从地址0x0000,7fff,ffff,ffff到0xffff,8000,0000,0000中间是一个巨大的空洞,是为以后的扩展预留的。

而真正的系统空间的起始地址,是从0xffff,8800,0000,0000开始的,参见:

#define __PAGE_OFFSET     _AC(0xffff,8800,0000,0000, UL)

而32位地址时系统空间的起始地址为0xC000,0000。

另外0xffff,8800,0000,0000 – 0xffff,c7ff,ffff,ffff这64T直接和物理内存进行映射,0xffff,c900,0000,0000 – 0xffff,e8ff,ffff,ffff这32T用于vmalloc/ioremap的地址空间。

而32位地址空间时,当物理内存大于896M时(Linux2.4内核是896M,3.x内核是884M,是个经验值),由于地址空间的限制,内核只会将0~896M的地址进行映射,而896M以上的空间用做一些固定映射和vmalloc/ioremap。而64位地址时是将所有物理内存都进行映射。

内核态与用户态

用户态Ring3状态不能访问内核态Ring0的地址空间,包括代码和数据。(例如32位Linux进程的4GB地址空间,3G-4G部 分大家是共享的,是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据)。用户运行一个程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过write,send等系统调用,这些系统调用会调用内核中的代码来完成操作,这时,必 须切换到Ring0,然后进入内核地址空间去执行这些代码完成操作,完成后,切换回Ring3,回到用户态。这样,用户态的程序就不能 随意操作内核地址空间,具有一定的安全保护作用。

处理器总处于以下状态中的一种:

1、内核态,运行于进程上下文,内核代表进程运行于内核空间;

2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;

3、用户态,运行于用户空间。

从用户空间到内核空间有两种触发手段:

1.系统调用:

用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存器值、变量等。所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。

2.中断:

硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。例如网卡发送一个数据包或硬盘驱动器提供一次 IO 请求等。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)。



声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • RF
  • 射频
  • 通信
  • 无线
下载排行榜
更多
评测报告
更多
EE直播间
更多
广告