Linux内核之 基本概念
一直想写写Linux内核的文章,特别是进程这方面的,说实话,不好写,也不太敢写:)直到遇到了一本好书。《Linux内核设计与实现》,原书《Linux Kernel Development》Third Edition,作者Robert Love。
在之前买了几本厚书,比如《深入理解Linux内核》、《深入理解计算机系统》,对于我而言还是太厚了。前者主要看了文件系统的一些知识,后者主要看内存管理的一些知识。
但是,我最爱的还是《Linux内核设计与实现》。给个大写的赞,读起来很让人兴奋的那种。本书只有335页,基本上不到上面两本书的一半,但是却很接地气。因为作者是Linux内核开发人员,有丰富的内核开发经验,而且是一位80后,语言简洁幽默。所以该书比前面两者少了五分理论,多了五分实践。值得一看。当然上面的书也可以加深理解Linux内核。
首先,什么是操作系统,没有统一标准。书上的定义,操作系统是指在整个系统中负责完成最基本功能和系统管理功能的那些部分。这些部分应该包括内核、设备驱动程序、启动引导程序、命令行Shell或者其他种类的用户界面、基本的文件管理工具和系统工具。
而系统则是指包含了操作系统和所有运行在它之上的应用程序。
所以,内核可以称作操作系统核心或者管理者。如下图所示,应用系统、内核和硬件的关系。

事实上该图中,显示了更多的关系。首先我们说一个系统分为三大层次,最底下是硬件,中间是内核空间,最上面是用户空间。
我们普通的应用程序一般运行在用户态,也就是一般用户能见到的。但是在实际运行过程中,它需要使用硬件资源,例如可能需要计算用到CPU,需要写文件用到硬盘和内存,显示在屏幕上同样需要内存还有终端。那怎么访问这些硬件的,其中的原理是什么。这些都是中间的内核空间需要完成的事情,如果一个应用程序切换到内核空间运行,就处于内核态。
用户态到内核态的切换往往通过系统调用接口来实现,而一般在系统调用接口之上还会封装成标准的库函数,例如C或者C++库。
上面提到的硬件是各种物理设备,事实上,都需要有相应的驱动程序管理,例如硬盘、键盘、鼠标、显示器等等。这些设备和驱动如何管理呢,内核子系统管理大部分,有一小部分直接封装成系统调用接口。内核与硬件设备之间往往提供了中断机制。
我们上面提到的程序,在一般操作操作系统中,也被称为进程。我们再把上面的描述进行归纳。
Linux内核有两大基本抽象概念
- 文件,Linux下一切皆文件
- 进程,运行中的程序
如果说前者是静态的抽象,那么后者就是动态的抽象。
Linux进程又有两大虚拟机制
- 虚拟处理器,CPU 时间的虚拟化
- 虚拟内存, 内存空间的虚拟化
所以一个运行的程序会自以为拥有了所有的处理器和内存资源。
Linux内核有四大服务
中断服务,响应硬件设备的中断提供中断机制。与进程无关,在专门的中断上下文中运行。
进程管理与调度,管理多个进程以及如何分享处理器时间。
内存管理,管理进程地址空间。
网络、进程间通信,多个进程之间以及进程与外界如何通信。
Linux内核空间有两大上下文
- 进程上下文,代表某个特定的进程执行。
- 中断上下文,与任何进程无关,处理某个特定的中断。
我们一般对Linux内核的理解在于进程管理和虚拟内存的管理,而对中断服务会有些陌生,更不知道中断上下文。而此书非常清晰的介绍了中断服务和中断机制,以及中断上下文。简单概括的话,中断服务是专门针对硬件设备的,是设备驱动程序开发一定需要考虑的,是必须及时得到响应的不能像进程可以睡眠的,当然中断可以被另外的中断打断;当执行一个中断处理程序时,内核处于中断上下文(interrupt context)。中断也不能说完全不能睡眠,中断处理又可以分为两部分:上、下半部,前面说的及时响应放在上半部(叫中断处理程序),而可以延迟执行的放在下半部,所以,下半部也可以睡眠。所以它对应的机制又有不同,有多种机制,而个别机制(比如工作队列)和进程调度的机制又有些接近。
对于进程管理、进程调度和进程上下文,后续文章将详细介绍。所以对中断和中断处理的一些概念只是在这里提一下。如果是设备驱动开发的,建议看看本书。
ps:对文件系统和虚拟内存本人之前有不少文章进行了介绍,必要时再进行补充。
Linux内核之 基本概念的更多相关文章
- Linux内核的基本概念
Linux内核学习,推荐的书籍: <linux设备驱动开发详解第二版>.<Linux内核设计与实现第三版>.<嵌入式Linux应用开发完全手册> 第一篇:讲解Lin ...
- 菜鸟装逼指南--linux内核中听过就能记住的概念
打算给我们部门弄个内部分享.发现大家对一些底层知识的认知停留在一句一句的,比如听说JVM使用-XX:-UseBiasedLocking取消偏向锁可以提高性能,因为它只适用于非多线程高并发应用.使用数字 ...
- linux内核中听过就能记住的概念
打算给我们部门弄个内部分享.发现大家对一些底层知识的认知停留在一句一句的,比如听说JVM使用-XX:-UseBiasedLocking取消偏向锁可以提高性能,因为它只适用于非多线程高并发应用.使用数字 ...
- Linux内核中网络数据包的接收-第一部分 概念和框架
与网络数据包的发送不同,网络收包是异步的的.由于你不确定谁会在什么时候突然发一个网络包给你.因此这个网络收包逻辑事实上包括两件事:1.数据包到来后的通知2.收到通知并从数据包中获取数据这两件事发生在协 ...
- Linux内核设计与实现笔记_1_基本概念
Linux内核设计与实现笔记_1_基本概念 操作系统 系统这个词包含了操作系统和所有运行在它上面的应用程序.操作系统是指在整个系统中负责完成分最基本功能和系统管理的那些部分,这些部分应该包括: 内核, ...
- linux内核,驱动,应用程三者的概念和之间的关系
驱动程序属于内核的一个部分.准确的说是内核的一个组件.不包含驱动的内核也叫做内核,并且这也是我们常说的内核.内核要干的事情无非5件. 1,内存管理 2,虚拟文件系统 3,进程调度 4,网络接口 5,进 ...
- <Linux内核源码>文件系统VFS内核4.0.4版本基本概念源码
题外话:Linux内核从2.x和3.x到现在最新的4.x变化非常大,最直观的表现就是很多书上的内核代码已经无法直接继续使用,所以看看新的源码是非常有意义的! (下文中的内核源码都来自于 kernel ...
- Linux 内核版本命名
Linux 内核版本命名在不同的时期有其不同的规范,我们熟悉的也许是 2.x 版本奇数表示开发版.偶数表示稳定版,但到 2.6.x 以及 3.x 甚至将来的 4.x ,内核版本命名都不遵守这样的约定. ...
- Linux内核--内核数据类型
转自:http://www.linuxidc.com/Linux/2013-12/93637.htm 将Linux 移植到新的体系结构时,开发者遇到的若干问题都与不正确的数据类型有关.坚持使用严格的数 ...
随机推荐
- layui 魔改:富文本编辑器添加上传视频功能
甲方又整新需求了:富文本编辑器需要可以传视频. layui本身的富文本编辑器没有传视频的功能,所以,又到了咱们魔改的时候了. 友情提醒,富文本编辑器 layedit 只有layui的V1版有,V2版没 ...
- Python数据分析之全球人口数据
这篇文章用pandas对全球的人口数据做个简单分析.我收集全球各国1960-2019年人口数据,包含男女和不同年龄段,共6个文件. pop_total.csv: 各国每年总人口 pop_female. ...
- JVM系列之:Contend注解和false-sharing
目录 简介 false-sharing的由来 怎么解决? 使用JOL分析 Contended在JDK9中的问题 padded和unpadded性能对比 Contended在JDK中的使用 总结 简介 ...
- three.js 数学方法之Matrix3
今天郭先生来说一说three.js的三维矩阵,这块知识需要结合线性代数的一些知识,毕业时间有点长,线性代数的知识大部分都还给了老师.于是一起简单的复习了一下.所有的计算都是使用列优先顺序进行的.然而, ...
- ASP.NET WebAPI2复杂请求跨域设置
ASP.Net Core的跨域设置比较简单 官方都整合了 具体的参见微软官方文档: https://docs.microsoft.com/zh-cn/aspnet/core/security/cor ...
- Go语言系列之手把手教你撸一个ORM(一)
项目地址:https://github.com/yoyofxteam/yoyodata 欢迎星星,感谢 前言:最近在学习Go语言,就出于学习目的手撸个小架子,欢迎提出宝贵意见,项目使用Mysql数据库 ...
- MySQL组复制MGR(一)-- 技术概述
(一)复制技术的发展 MySQL的复制技术主要经历了异步主从复制,半同步复制,组复制(Group Replication)3个阶段. (1)传统的异步主从复制 传统的MySQL提供了一种简单的主从复制 ...
- SOLID:面向对象设计的前五项原则
S.O.L.I.D是Robert C. Martin提出的前五个面向对象设计(OOD)原则的首字母缩写,他更为人所熟知的名字是Uncle Bob. 将这些原理结合在一起,可使程序员轻松开发易于维护 ...
- LQB201808全球变暖 bfs
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<time.h> #in ...
- 使用 eval(input()) 的便利
输入列表或者字典时使用eval可以自动转换为其类型 2020-06-18