一文了解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

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签