一直想写写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内核之 基本概念的更多相关文章

  1. Linux内核的基本概念

    Linux内核学习,推荐的书籍: <linux设备驱动开发详解第二版>.<Linux内核设计与实现第三版>.<嵌入式Linux应用开发完全手册> 第一篇:讲解Lin ...

  2. 菜鸟装逼指南--linux内核中听过就能记住的概念

    打算给我们部门弄个内部分享.发现大家对一些底层知识的认知停留在一句一句的,比如听说JVM使用-XX:-UseBiasedLocking取消偏向锁可以提高性能,因为它只适用于非多线程高并发应用.使用数字 ...

  3. linux内核中听过就能记住的概念

    打算给我们部门弄个内部分享.发现大家对一些底层知识的认知停留在一句一句的,比如听说JVM使用-XX:-UseBiasedLocking取消偏向锁可以提高性能,因为它只适用于非多线程高并发应用.使用数字 ...

  4. Linux内核中网络数据包的接收-第一部分 概念和框架

    与网络数据包的发送不同,网络收包是异步的的.由于你不确定谁会在什么时候突然发一个网络包给你.因此这个网络收包逻辑事实上包括两件事:1.数据包到来后的通知2.收到通知并从数据包中获取数据这两件事发生在协 ...

  5. Linux内核设计与实现笔记_1_基本概念

    Linux内核设计与实现笔记_1_基本概念 操作系统 系统这个词包含了操作系统和所有运行在它上面的应用程序.操作系统是指在整个系统中负责完成分最基本功能和系统管理的那些部分,这些部分应该包括: 内核, ...

  6. linux内核,驱动,应用程三者的概念和之间的关系

    驱动程序属于内核的一个部分.准确的说是内核的一个组件.不包含驱动的内核也叫做内核,并且这也是我们常说的内核.内核要干的事情无非5件. 1,内存管理 2,虚拟文件系统 3,进程调度 4,网络接口 5,进 ...

  7. <Linux内核源码>文件系统VFS内核4.0.4版本基本概念源码

    题外话:Linux内核从2.x和3.x到现在最新的4.x变化非常大,最直观的表现就是很多书上的内核代码已经无法直接继续使用,所以看看新的源码是非常有意义的! (下文中的内核源码都来自于 kernel ...

  8. Linux 内核版本命名

    Linux 内核版本命名在不同的时期有其不同的规范,我们熟悉的也许是 2.x 版本奇数表示开发版.偶数表示稳定版,但到 2.6.x 以及 3.x 甚至将来的 4.x ,内核版本命名都不遵守这样的约定. ...

  9. Linux内核--内核数据类型

    转自:http://www.linuxidc.com/Linux/2013-12/93637.htm 将Linux 移植到新的体系结构时,开发者遇到的若干问题都与不正确的数据类型有关.坚持使用严格的数 ...

随机推荐

  1. npm\cnpm\yarn\tyarn 关于源和代理的问题

    npm 是一个包管理器.Node.js 自带. cnpm 是 npm 的阿里版,用的阿里源. yarn 是另一个包管理器,不自带,需要另外装.可以单独装,也可以用 npm 装. tyarn 是 yar ...

  2. 技术干货:Ceph搭建硬件建议详解

    Ceph是专为在商品硬件上运行而设计的,这使得构建和维护超大规模的数据集群在经济上是可行的.当规划出你的集群硬件时,你需要平衡一些考虑因素,包括故障域和潜在的性能问题.硬件规划应该包括将Ceph守护进 ...

  3. js JQ动态添加div标签

    function renderList(data){ var str = ''; for(var i = 0; i < data.length; i++){ // 动态添加li str += ' ...

  4. Gradle系列之认识Gradle任务

    原文发于微信公众号 jzman-blog,欢迎关注交流. 前面几篇学习了 Gradle 构建任务的基础知识,了解了 Project 和 Task 这两个概念,建议先阅读前面几篇文章: Gradle系列 ...

  5. Linux上搭建文件浏览的web服务(创建软件仓库)(一)

    软件仓库的创建方式有很多,这是一种很简单的创建方式: python -m SimpleHTTPServer 快速搭建一个http服务,提供一个文件浏览的web服务. 使用:Python SimpleH ...

  6. 小白必看,Python入门你要懂那些

    Python作为为数不多的全场景开发语言之一,近年来已经获得了越来越多人的关注,而整个IT行业也释放出了大量的Python就业岗位.因此,当前学习Python语言是非常不错的选择,文泽带你进一步走进P ...

  7. TSGCTF-web Beginner's Web (js内置方法__defineSetter__)

    const fastify = require('fastify'); const nunjucks = require('nunjucks'); const crypto = require('cr ...

  8. python处理文本数据

    处理文本数据,主要是通过Seris的str访问.遇到NaN时不做任何处理,保留结果为NaN,遇到数字全部处理为NaN. str是Seris的方法,DataFrame不能直接使用,但是通过索引选择Dat ...

  9. 史蒂夫-乔布斯(Steve Jobs)斯坦福大学演讲稿(中英对照)

    这是苹果公司和Pixar动画工作室的CEO Steve Jobs于2005年6月12号在斯坦福大学的毕业典礼上面的演讲稿. Thank you. I'm honored to be with you ...

  10. 不看会后悔系列之idea的使用小技巧

    虽然用idea已多达N年,但你对其所有的功能都了如指掌吗?了解如下小tips助你开发更通畅. 调试专题 (1)不用每次都重启debugdebug程序时,只修改了一点代码,怎么在不重启程序的前提下,看到 ...