钻进 Linux 内核看个究竟
Linux 内核,这个经常听见,却不不知道它具体是干嘛的东西,是不是觉得非常神秘?
Linux 内核看不见摸不着,而对于这类东西,我们经常无从下手。本文就以浅显易懂的语言,带你钻进 Linux 内核,看它到底长啥样。
内核是 Linux 操作系统的核心组件,它向上连接应用程序,向下直接与硬件打交道。其代码主要由 C 语言及少量汇编语言写成,并且它可以适配多种多样不同的硬件架构。
内核并发运行着一系列的进程,并管理着硬件的各种资源。具体来讲,因为系统的资源有限,内核就为各个进程分配着诸如 CPU 时间、内存空间、网络连接等各方面的资源。
Linux 操作系统架构
下图是一个典型的 Linux 操作系统架构图。

Linux 操作系统主要分成两部分:
- 用户空间
- 内核空间
1. 用户空间
所有的用户应用程序都是在用户空间运行,它们不能直接访问内存等硬件资源,而是间接通过内核来访问。GNU C 库(glibc)提供了从用户空间切换至内核空间的机制。
2. 内核空间
内核直接管理着系统的 CPU、内存、输入输出设备、网络设备和其它的外围设备,它被分为不同模块来管理系统的不同操作,比如:文件管理,内存管理,进程管理等等。
用户空间的应用程序可以通过调用内核提供的 API 来访问硬件资源。比如,对于文件操作,我们可以调用 open() ,read() ,write() 等接口。
内核直接管理着硬件,又与硬件相互独立,它可以通过简单配置然后运行在 Intel,ARM ,Atemel 等芯片架构上。
Linux 内核主要子系统
根据内核的核心功能,Linux 内核提出了 5 个子系统,分别为:系统调用、进程管理、内存管理、文件系统、网络管理,如下图示:

1. 系统调用(System Call Interface)
系统调用接口。进程调度子系统通过系统调用接口,将需要提供给用户空间的接口开放出去,同时屏蔽掉不需要用户空间程序关心的细节。
SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。
2. 进程管理(Process Management)
用户空间有那么多进程,如何让他们有条不紊地进行着正是进程管理所要做的事。每个进程都要使用到 CPU 资源(如 CPU ,内存),但 CPU 资源毕竟有限,不可能让某个进程一进独占着资源。
因此,进程管理就充当着管理员的角色,它调度着所有的进程,当需要选择下一进程运行时,会由调度算法来选择最需要运行的进程。如果某个进程在等待其它硬件资源,则它就会被挂起。
因此,通过一系列的调度算法,内核尽可能地公平地让各个进程使用到 CPU 资源。
3. 内存管理(Memory Management)
内存管理主要提供对内存资源的访问控制,以便让各个进程可以安全地共享机器的内存资源。它提供了物理内存与虚拟内存的一种映射关系,因而不同的进程可以使用相同的虚拟内存,而这些相同的虚拟内存,可以映射到不同的物理内存上。这个映射关系主要由 MMU 来完成。
另外,内存管理会提供虚拟内存的机制,该机制可以让进程使用多于系统可用的内存,不用的内存会通过文件系统保存在外部非易失存储器中,需要使用的时候,再取回到内存中。
4. 虚拟文件系统(Virtual File System)
内核隐藏了不同功能的外部设备,例如硬盘、输入输出设备、显示设备等等的具体细节,将它们抽象为可以通过统一的文件操作接口(open、close、read、write等)来访问,也就是我们所熟知的「一切皆文件」。
随着计算机技术的发展,历史上出现了多种文件系统,比如:FAT、FAT32、NTFS、EXT2、EXT3 等等。为了兼容这些文件系统,内核将它们抽象为统一的表现形式,这就是虚拟文件系统的概念。
虚拟文件系统可分为逻辑文件系统和设备驱动程序。逻辑文件系统指 Linux 所支持的文件系统,如ext2, fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。
5. 网络管理(Network Stack)
网络子系统在 Linux 内核中主要负责管理各种网络设备,并实现各种网络协议栈,最终实现通过网络连接其它系统的功能。
网络接口提供了对各种网络标准协议的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序两部分。网络协议部分负责实现每一种可能的网络传输协议,网络设备驱动程序负责与硬件设备进行通信,每一种可能的硬件设备都有相应的设备驱动程序。
小结
以上就是 Linux 内核的一些很基础的知识,对于内核的学习还有非常多的内容,决不是一篇文章能够写完的。所以,对于内核的学习,需要多看书,多看视频,并自己动手去实践,才能真正掌握。
昨天是良许公众号运营一周年的日子,本想在昨天就发福利的,但昨天的文章写得太长了,怕朋友们翻不到最后,所以就换到今天来。
为了答谢良许的读者朋友们一直以来的支持与帮助,本次为大家送出两个福利:1. 内核书籍;2. 现金红包。
1. 书籍赠送
其中内核书籍是《Linux内核深度解析》,是由异步社区所赞助,在此感谢异步社区的大力支持!该书籍比较优质,且售价比较贵 138 元,所以本书赠送 10 本。书籍介绍如下:
因为我不希望真正想得到这本书的人没抽到,而只是过来打酱油的人却得到了这本书,这样书本就发挥不了它的作用。所以为了让书籍送给真正有需要的人,赠书规则如下:
- 在评论区留言,写下你想要得到这本书的理由。要走心哦,不走心不上墙哦;
- 邀请好友为你的评论点赞,赞数前 10 名者中奖;
- 为防止刷赞,赞数超过 100 的朋友必须提供拉票证据,否则失去获奖资格;
- 活动时间即日起至 6 月 5 日晚 8:00 ,中奖者需在 24 小时内联系良许提供地址。良许有多个微信,联系其中一个即可,还没有良许微信的,请在公众号后台回复 良许 二字即可得到良许的最新微信。
2. 现金红包
没错,就是那么粗暴,直接发红包!直接点击以下链接即可领取,先到先得哦!由于良许还比较穷,不能发很大的红包,还请见谅!
公众号:良许Linux

有收获?希望老铁们来个三连击,给更多的人看到这篇文章
钻进 Linux 内核看个究竟的更多相关文章
- [转]透过 Linux 内核看无锁编程
非阻塞型同步 (Non-blocking Synchronization) 简介 如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步.同步可分为阻塞型同步(Blocking ...
- 【读书笔记】《Linux内核设计与实现》进程管理与进程调度
大学跟老师做嵌入式项目,写过I2C的设备驱动,但对Linux内核的了解也仅限于此.Android系统许多导致root的漏洞都是内核中的,研究起来很有趣,但看相关的分析文章总感觉隔着一层窗户纸,不能完全 ...
- 从操作系统内核看设计模式--linux内核的facade模式
linux的内核当中处处充满了设计模式,本文先讨论一下外观模式.外观模式就是将客户和子系统解耦,为客户将复杂的子系统进行封装,从而使得客户可以使用简单易用的接口. 众所周知,linux和unix是十 ...
- 羽夏看Linux内核——段相关入门知识
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...
- 羽夏看Linux内核——环境搭建
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...
- 羽夏看Linux内核——启动那些事
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...
- 羽夏看Linux内核——门相关入门知识
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...
- 羽夏看Linux内核——中断与分页相关入门知识
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...
- 羽夏看Linux内核——引导启动(上)
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...
随机推荐
- 力扣题解-560. 和为K的子数组
题目描述 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] ...
- 搞懂:前端跨域问题JS解决跨域问题VUE代理解决跨域问题原理
什么是跨域 跨域:一个域下的文档或脚本试图去请求另一个域下的资源 广义的跨域包含一下内容: 1.资源跳转(链接跳转,重定向跳转,表单提交) 2.资源请求(内部的引用,脚本script,图片img,fr ...
- 解决 es CircuitBreakingException 问题
比如频繁报如下错误, [2019-06-16T15:31:22,778][DEBUG][o.e.a.a.c.n.i.TransportNodesInfoAction] [node-xxx] faile ...
- React组件proptypes, ref
一.使用props.children访问嵌套数据 import React from 'react'; class Button extends React.Component { render () ...
- nginx配置之虚拟主机功能
虚拟主机功能: 一个nginx下运行多个网址(站点域名) 方式一:nginx.conf中的http{}中的每一个server{}就是一个站点(相同端口): #虚拟主机1 server { listen ...
- Linux下分析bin文件的10种方法
这世界有10种人,一种人懂二进制,另一种人不懂二进制. --鲁迅 大家好,我是良许. 二进制文件是我们几乎每天都需要打交道的文件类型,但很少人知道他们的工作原理.这里所讲的二进制文件,是指一些可执行文 ...
- J2EE项目中,servlet跳转到相应的JSP页面后,JSP页面丢失了样式效果
原因: js和css的引用路径是相对路径.跳转后路径改变. 解决方法: 先在head标签中加入一下代码 <% String path = request.getContextPath(); St ...
- 一,初次接触html+css需要注意的小问题
不足之处请不吝赐教,在评论区帮忙补充 html最基础的,入门学习的是标签,常用的标签有<a> 定义锚.<b> 定义粗体字.<br> 单 ...
- mysql 的大文本存储TEXT & BLOB
TEXT & BLOB 一般在保存少量字符串的时候,我们会选择 CHAR 或者 VARCHAR:而在保存较大文本时,通常会选择使用 TEXT 或者 BLOB,二者之间的主要差别是 BLOB 能 ...
- 一元三次方程组求解 luogu P1024
题目传送门 首先,要明确题目信息,f(x1) * f(x2) < 0, 则一定存在实数根在区间(x1, x2).且所有的根都在[-100, 100)之间.根与根的绝对值之差 >= 1 那么 ...