一文了解Linux内核-程序员宅基地

技术标签: Linux  OS  kernel  linux  服务器  内核  

本文来自  [https://www.ssdfans.com]

目录

什么是操作系统OS

操作系统的的组成

什么是内核kernel

内核的操作

内核的分类

Linux操作系统

Linux内核

内核源码结构

 Linux内核与硬件的关系

是什么使Linux内核与其他经典Unix内核不同?

Linux内核架构

Linux内核接口

 Linux可加载内核模块 (The Linux Loadable Kernel Module (LKM) )


什么是操作系统OS

操作系统(简称为OS)是一种软件平台,可创建一个环境,用户可以在该环境中在计算设备上运行不同的应用程序。 操作系统充当软件程序和系统硬件组件之间的桥梁。 它被移动设备,标签,台式机,Web服务器,视频游戏机等不同的设备所利用。市场上有各种操作系统可用,例如Windows,Linux,Unix和Mac OSX。


操作系统的的组成

Bootloader:它负责设备的启动过程。
Shell:Shell是一种编程语言,它可以控制其他文件,进程以及所有其他程序。
Kernel:它是操作系统的主要组件,管理内存,CPU和其他相关组件。
Desktop Environment:这是用户通常与之交互的环境。
Graphical server(图形服务器):它是操作系统的子系统,用于在屏幕上显示图形
Applications: 这些是执行不同用户任务(例如word,excel等)的程序集。
Daemons : 后台服务提供商。


什么是内核kernel

内核是操作系统的关键组件。 它借助进程间通信和系统调用,在硬件级别上充当应用程序和数据处理之间的桥梁。

每当将操作系统加载到内存中时,首先,将加载内核并将其保留在那里,直到操作系统关闭。 内核负责处理低级任务,例如任务管理,内存管理,风险管理等。

内核的任务

  • 用于应用程序执行的流程管理
  • 内存和I / O(输入/输出)管理
  • 系统调用控制(内核的核心行为)
  • 借助设备驱动程序进行设备管理

内核空间,用户空间是什么?

内核空间
内核处于提升的系统状态,其中包括受保护的内存空间以及对设备硬件的完全访问权限。 此系统状态和内存空间统称为内核空间。 在内核空间内,对硬件和系统服务的核心访问进行管理,并作为服务提供给系统的其余部分。

用户空间
用户空间或用户域是在操作系统内核环境之外运行的代码,用户空间定义为操作系统用来与内核连接的各种应用程序或程序或库。

用户的应用程序是在用户空间中执行的,它们可以通过内核系统调用访问计算机可用资源的一部分。 通过使用内核提供的核心服务,可以创建用户级别的应用程序,例如游戏或办公软件。


内核的操作

内核是任何操作系统的心脏,因为它控制系统中的所有其他程序。 当设备启动时,内核会经历一个初始化的过程,例如检查内存。 它负责内存分配部分,并创建了一个运行应用程序的环境,而没有任何干扰。

内核充当服务提供者,因此程序可以请求内核完成多项任务,例如请求使用磁盘,网卡或其他硬件,并且内核为CPU设置中断以启用多任务处理。 它不让错误的程序进入其他程序的操作功能,从而保护了计算环境。 它通过不允许存储空间来阻止未经授权的程序进入入口,并限制它们消耗的CPU时间。


内核的分类

通常有三类内核:

Monolithic kernel: 它包含许多设备驱动程序,可在设备的硬件和软件之间创建通信接口。

它是操作系统广泛使用的内核。 在单片架构中,内核由可以动态加载和卸载的各种模块组成。 这种体系结构将扩展OS的功能,并允许轻松扩展内核。

使用单片式体系结构,内核的维护变得容易,因为当需要修复特定模块中的错误时,它允许相关模块进行加载和卸载。 因此,它消除了繁琐的工作,即降低并重新编译整个内核以进行很小的更改。 在单片内核中,卸载不再使用的模块更加容易。

Micro kernel: 它只能执行基本功能。

微内核已经发展成为单片内核的替代产品,以解决单片内核无法做到的内核代码不断增长的问题。 这种体系结构允许某些基本服务(例如协议栈,设备驱动程序管理,文件系统等)在用户空间中运行。 这样可以以最少的代码增强OS的功能,提高安全性并确保稳定性。

它通过使系统的其余部分正常运行而不会造成任何中断,从而限制了对受影响区域的损坏。 在微内核体系结构中,所有基本OS服务都可以通过进程间通信(IPC)提供给程序。 微内核允许设备驱动程序和硬件之间的直接交互。

Hybrid kernel: 它结合了单片内核和微内核的各个方面。

混合内核可以决定要在用户模式和主管模式下运行什么。 通常,在混合内核环境中,设备驱动程序,文件系统I / O之类的内容将在用户模式下运行,而服务器调用和IPC则保持在管理者模式下。 它提供了两个世界的最佳体验。


Linux操作系统

Linux是Linus Torvalds在1991年开发的开源平台。 它在各种设备中用作操作系统,例如在计算机,服务器,移动设备,大型机和其他嵌入式设备中。 由于它是开源软件,因此用户可以根据需要自定义此操作系统。 它支持几乎所有主要的计算机平台,例如ARM,x86,SPARK等。Linux的最常见用法是用于Server,但也用于台式机,电子书阅读器,智能手机等。


Linux内核

内核是任何基于Linux的操作系统的核心组件。 它代表了台式机和服务器的Linux发行版的核心方面。 它具有整体架构,并且操作系统完全在内核空间中运行。 整体内核不仅包围中央处理器,IPC和内存,而且具有系统服务器调用,设备驱动程序和文件系统管理。 Linux内核充当设备软件和硬件之间的一层。

内核可以是单片,微内核或混合内核(例如OS X和Windows 7)。 Linux内核是类似于UNIX系统的单片计算机操作系统内核。 Linux操作系统系列(通常称为Linux发行版)基于此内核。与微内核不同,单块内核不仅包含中央处理单元,内存和IPC,还具有设备驱动程序,系统服务器调用和文件系统管理。他们最擅长与硬件通信并同时执行多项任务。由于这个原因,此处的过程反应速度很快。

但是,很少的挫折是所需的巨大安装和内存占用空间以及安全性不足,因为一切都以管理员模式运行。相反,随着用户服务和内核的分离,微内核对应用程序调用的反应可能会很慢。因此,与整体内核相比,它们的尺寸更小。微内核很容易扩展,但是编写微内核需要更多代码。 Linux内核是用C和Assembly编程语言编写的。


内核源码结构

在Linux系统中查看内核源码,如图所示

  • arch 特定体系结构的代码
  • block 块设备I/O层
  • crypo 加密API
  • Documentation 内核源码文档
  • drivers 设备驱动程序
  • firmware 使用某些驱动程序而需要的设备固件
  • fs VFS和各种文件系统
  • include 内核头文件
  • init 内核引导和初始化
  • ipc 进程间通信代码
  • kernel 像调度程序这样的核心子系统
  • lib 同样内核函数
  • mm 内存管理子系统和VM
  • net 网络子系统
  • samples 示例,示范代码
  • scripts 编译内核所用的脚本
  • security Linux 安全模块
  • sound 语音子系统
  • usr 早期用户空间代码(所谓的initramfs)
  • tools 在Linux开发中有用的工具
  • virt 虚拟化基础结构


 Linux内核与硬件的关系

内核可以通过所谓的中断来管理系统的硬件。 当硬件要与系统接口时,会发出一个中断,中断处理器,从而对内核执行相同的操作。 为了提供同步,内核可以禁用中断,无论是单个中断还是全部中断。 但是,在Linux中,中断处理程序不是在进程上下文中运行,而是在不与任何进程相关联的中断上下文中运行,这种特殊的中断上下文仅是为了让中断处理程序快速响应单个中断然后最终退出而存在 。


是什么使Linux内核与其他经典Unix内核不同?

Linux内核和经典 Unix内核之间存在显着差异,如下所示:

  • Linux支持内核模块的动态加载
  • Linux内核是抢占式的
  • Linux具有对称的多处理器支持
  • Linux具有开放软件特性,因此是免费的
  • Linux忽略了内核开发人员称为“设计不良”的某些标准Unix功能
  • Linux提供了带有设备类,可热插拔事件和用户空间设备文件系统的面向对象的设备模型
  • Linux内核无法区分线程和正常进程


Linux内核架构

内核仅仅是资源管理器。 被管理的资源可以是进程,内存或硬件设备。 它管理和仲裁多个竞争用户之间对资源的访问。 Linux内核存在于用户空间下方的内核空间中,该空间是执行用户应用程序的位置。 为了使用户空间与内核空间进行通信,已合并了一个GNU C库,该库为系统调用接口提供了一个论坛,以连接到内核空间并允许转换回用户空间。

Linux内核可以分为三个主要级别:

系统调用界面:这是最高层,并承担诸如读取和写入之类的基本操作。

内核代码:它位于系统调用接口下方,这是Linux支持的所有处理器体系结构的共同点,有时也定义为与体系结构无关的内核代码。

依赖于体系结构的代码:它在独立于体系结构的代码下,形成通常称为板级支持程序包(BSP)的程序-该程序包包含一个称为引导加载程序的小程序,它将操作系统和设备驱动程序放入内存。

Linux内核的体系结构主要包括:系统调用接口,进程管理,虚拟文件系统,内存管理,体系结构和设备驱动程序,这些称为Linux内核的主要子系统。

系统调用界面(System call interface)

简单来说,系统调用就是用户程序和硬件设备之间的桥梁。用户程序在需要的时候,通过系统调用来使用硬件设备。系统调用是一种编程过程,用于承担从用户空间到内核的函数调用,其中程序从操作系统内核请求服务。 该接口可能取决于体系结构。它包括各种硬件服务,例如与硬件设备连接以及在内核的各个组成部分之间创建通信接口。 系统调用在操作系统和进程之间创建有效的接口。

进程管理 (Process management)

执行进程,内核负责创建和删除不同的进程,并监视它们与外部世界的连接。例如输入和输出。 它通过信号,进程间通信原语或管道来处理不同方法之间的通信。 除了所有这些之外,它还有一个调度程序,用于控制共享CPU的进程。

内存管理(Memory management)

内存是操作系统的重要组成部分,内存在所谓的页面中进行管理以提高效率。 Linux包括管理可用内存的方法以及用于物理和虚拟映射的硬件机制,还提供交换空间。内存管理不仅仅管理4KB缓冲区,还远远不止于此。 Linux还提供了4kb缓冲区以外的抽象(称为slab分配器)。 Slab分配器使用4kb缓冲区作为基础,然后通过监视诸如页面已满,为空和部分使用之类的内容从内部分配结构。 这使方案可以动态增长,并可以支持系统的更重要需求。

虚拟文件系统(Virtual file system)

虚拟文件系统(VFS)是内核的重要组成部分,它为文件系统提供了标准的接口抽象。 它提供了系统调用接口和内核支持的文件系统之间的切换层。 VFS在内核支持的文件系统和SCI(系统调用接口)之间创建一个交换层。除了上述内容之外,Linux还支持各种类型的文件系统,这些文件系统需要以不同的方式组织数据以物理格式存储。 例如,可以使用常用的FAT文件系统,Linux标准ext3文件系统或其他几种格式来格式化磁盘。

设备驱动(Device drivers)

内核的大部分源代码存储在设备驱动程序中,这使特定的硬件设备可用。 Linux提供了一个驱动程序子目录,该子目录又分为支持的各种设备,例如I2蓝牙,串行等。

体系结构(Architecture-dependent code)

即使大多数Linux在其独立体系结构上运行,也应考虑某些因素以提高体系结构效率和正常运行。 Linux有许多子目录,每个体系结构子目录有许多其他子目录。 而且,这些子目录专注于内核的特定任务,例如内存管理,引导,内核等。

接口

系统调用和中断(System calls and Interrupts)

应用程序通过系统调用将信息传递给内核。 库包含应用程序可以使用的功能。 然后,这些库通过系统调用界面指示内核执行应用程序所需的任务。

中断提供了一种通过Linux内核管理系统硬件的方法。 如果硬件必须与系统通信,则可以通过处理器上的中断来解决问题,并将其传递给Linux内核。

Linux内核接口

Linux内核为执行不同任务和具有不同属性的用户空间应用程序提供了不同的接口。

它由两个独立的应用程序编程接口(API)组成:一个是内核用户空间,另一个是内核内部。

Linux API是内核用户空间API, 它使用户空间中的程序可以访问内核的系统资源和服务, 它由系统调用接口和GNU C库中的子例程组成。

Linux ABI

指的是内核用户空间ABI(Application Binary Interface), 它存在于程序模块之间,是两个二进制程序模块之间的接口:模块之一是操作系统工具或库,第二个模块是用户运行的程序。

比较API和ABI时,不同之处在于ABI用于访问已编译的外部代码,而API是用于管理软件的结构。 定义重要的ABI主要是Linux发行版的工作,而不是Linux内核。 应该为每个指令集定义一个特定的ABI,例如x86-64。 Linux产品的最终用户对ABI而不是API感兴趣。

它不过是内核用户空间ABI(应用程序二进制用户界面)。 它存在于程序模块之间。 ABI用于访问已编译并准备使用的代码。 ABI是两个二进制程序模块之间的接口:这些模块之一是操作系统工具或库,第二个模块是用户运行的程序。

模块化内核

以前版本的Linux内核的方式是将其所有部分静态固定为一个整体。 但是,现代Linux内核的大部分功能包含在动态放入内核的模块中。 与单片类型相反,这称为模块化内核。 这样的设置允许用户加载或替换正在运行的内核中的模块,而无需重新启动。

 Linux可加载内核模块 (The Linux Loadable Kernel Module (LKM) )

如果要向Linux内核添加代码,则要做的第一件事就是向内核源代码树中添加一些源文件。 在某些情况下,您可能需要在运行时向内核添加代码,此过程称为可加载内核模块。

LKM的好处

  • LKM节省时间并避免错误
  • 它有助于快速发现bugs
  • LKM可以节省内存,因为它们仅在需要时才加载到内存中
  • 它提供了更快的维护和调试时间
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013253075/article/details/123103323

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签