深入理解 Linux 内核笔记
文章平均质量分 94
谛听-
线上幽灵
展开
-
centos 开启防火墙端口
查看所有打开的端口:firewall-cmd--zone=public --list-ports添加端口:firewall-cmd --zone=public --add-port=80/tcp --permanent 重新载入:firewall-cmd --reload参考https://blog.csdn.net/u012498149/article/details/787...原创 2019-12-22 18:05:19 · 325 阅读 · 0 评论 -
epoll 的 maxevents 参数
maxevents: Size (in terms of number of events) of the caller event buffer.如果有超过 maxevents 的事件就绪,会被抛弃吗?epoll 源码:https://github.com/torvalds/linux/blob/master/fs/eventpoll.cepoll_wait 的调用栈:epoll_wai...原创 2019-12-12 17:22:27 · 1723 阅读 · 0 评论 -
Namespaces in operation, part 5: User namespaces
继续我们的命名空间系列文章,本文看一下用户命名空间,大部分实现于 Linux 3.8。(剩余的工作是 XFS 和其它文件系统中的一些改动;后者在 3.9 被合并)。用户命名空间与用户和组 ID 相映射。这意味着一个进程在某个用户命名空间内的用户和组 ID 可以与用户命名空间外的不同。最重要的是,一个进程可以在一个命名空间外有一个非 0 的用户 ID ,同时在命名空间内有一个为 0 的用户 ID;换...翻译 2019-11-01 11:13:55 · 357 阅读 · 0 评论 -
Mount namespaces and shared subtrees
挂载命名空间是创建每-用户和每-容器文件系统树的强大而灵活的工具。本文中,我们将仔细研究共享子树特性,它可通过自动、可控的方式在挂载命名空间之间传播挂载和卸载事件。引言挂载命名空间是第一个添加到 Linux 的命名空间类型,出现在 2002 年的 Linux 2.4.19 中。它们可隔离命名空间中的进程所看到的挂载点列表。换言之,每个挂载命名空间都有自己的挂载点列表,这意味着不同命名空间中的进...翻译 2019-11-03 20:55:40 · 377 阅读 · 0 评论 -
Mount namespaces, mount propagation, and unbindable mounts
在上一期命名空间系列的文章中,我们研究了挂载命名空间和共享子树的基本概念,包括挂载传播类型和对等组的概念。在这篇文章中,我们提供了各种传播类型操作的一些实际演示:MS_SHARED,MS_PRIVATE,MS_SLAVE 和 MS_UNBINDABLE。MS_SHARED 和 MS_PRIVATE 示例正如在上一篇文章中看到的,MS_SHARED 和 MS_PRIVATE 传播类型大致相反。共...翻译 2019-11-04 01:36:24 · 673 阅读 · 0 评论 -
Namespaces in operation, part 7: Network namespaces
自从上次我们研究 Linux 命名空间以来已经有一段时间了。我们的系列缺少了一篇,现在补上:网络命名空间。顾名思义,网络命名空间将网络设备、地址、端口、路由、防火墙规则等的使用划分在不同的盒子,基本上是在一个单独运行的内核实例中虚拟化网络。网络命名空间在 2.6.24 版进入内核,约 5 年前;大概一年后,它们才进入黄金时段。从那以后,它们似乎在很大程度上被开发人员忽略了。基本的网络命名空间管理...翻译 2019-11-03 16:43:36 · 258 阅读 · 0 评论 -
Namespaces in operation, part 6: more on user namespaces
本文中,继续上周关于用户命名空间的讨论。特别的,我们看一下更多有关与用户命名空间、capabilities 的交互及用户命名空间与其它类型的命名空间的结合。本文是命名空间系列的最后一篇。用户命名空间和 capabilities每个进程都会关联特定用户命名空间。一个通过不带 CLONE_NEWUSER 标志的 fork() 或 clone() 创建的进程与父进程位于同一用户命名空间。进程如果在目...翻译 2019-11-02 23:03:24 · 227 阅读 · 0 评论 -
Namespaces in operation, part 4: more on PID namespaces
在本文中,我们将继续上周关于 PID 命名空间的讨论(并扩展我们正在进行的关于命名空间的系列文章)。PID 命名空间的一个用途是实现一个进程包(容器),其行为类似于一个自包含的 Linux系统。init 进程是传统系统和 PID 命名空间容器的关键部分。因此,我们将研究 init 进程的特殊角色,并着重于它与传统 init 进程不同的几个方面。此外,我们还将研究命名空间 API 应用于 PID 命...翻译 2019-10-30 12:01:40 · 272 阅读 · 0 评论 -
Namespaces in operation, part 1: namespaces overview
Linux 3.8 合并窗口接受了 Eric Biederman 的大量用户命名空间及相关的补丁。尽管仍有一些细节待完成,例如,许多 Linux 文件系统还不知道用户命名空间,但用户命名空间的实现已经在功能上完成了。用户命名空间的完成是一个里程碑。首先,这项工作代表了迄今为止命名空间中最复杂实现之一的完成,因为自从用户命名空间实现首次实现(在Linux2.6.23中)以来,已经有五年左右的时间了...翻译 2019-10-29 19:21:39 · 302 阅读 · 0 评论 -
Namespaces in operation, part 3: PID namespaces
接着前两篇命名空间文章(Part 1: namespaces overview and Part 2: the namespaces API),现在看一下 PID 命名空间。与 PID 命名空间相关的全局资源就是进程 ID 数字空间。这意味着在不同 PID 命名空间中的进程可以有相同的进程 ID。PID 命名空间实现的容器可在主机之间迁移,并保持容器内的进程 ID 不变。对于传统 Linux (...翻译 2019-10-28 22:28:38 · 328 阅读 · 0 评论 -
Namespaces in operation, part 2: the namespaces API
命名空间将全局系统资源包装在一个抽象中,使得命名空间中的进程认为它们拥有独立的资源实例。命名空间可用于多种目的,最重要的是实现容器,一种轻量级虚拟化技术。本系列的第二篇文章将看一下命名空间的一些细节和 API。本系列中的第一篇文章对命名空间进行了总览。本文将看一下命名空间 API 中的一些细节,并在一些例子中展示运行中的 API。命名空间 API 包含三个系统调用:clone(),unshare...翻译 2019-10-29 17:20:32 · 247 阅读 · 0 评论 -
I/O模式和事件驱动
转自:https://github.com/jackfrued/Python-100-Days/blob/master/Day61-65/01.预备知识.md对于一次I/O操作(以读操作为例),数据会先被拷贝到操作系统内核的缓冲区中,然后从操作系统内核的缓冲区拷贝到应用程序的缓冲区(这种方式称为标准I/O或缓存I/O,大多数文件系统的默认I/O都是这种方式),最后交给进程。所以说,当一个读操作发...转载 2019-05-23 20:53:02 · 342 阅读 · 0 评论 -
深入理解 Linux 内核---程序的执行
尽管把一组指令装入内存并让 CPU 执行看起来不是大问题,但内核还必须灵活处理以下几方面的问题:不同的可执行文件格式。Linux 可在 64 位版本的机器上执行 32 位可执行代码。共享库。很多可执行文件并不包含执行程序所需的所有代码,而是期望内核在运行时从共享库中加载函数。执行上下文的其它信息。这包括命令行参数与环境变量。程序是以可执行文件的形式存放在磁盘上的,可执行文件既包括被执行...原创 2019-02-09 14:51:41 · 747 阅读 · 0 评论 -
深入理解 Linux 内核---进程通信
Unix 系统提供的进程间通信的基本机制:管道和 FIFO(命名管道)。最适合在进程之间实现生产者/消费者的交互。有些进程向管道中写入数据,另另外一些进程则从管道中读出数据。信号量。消息。允许进程在预定义的消息队列中读和写消息来交换消息。Linux 内核提供两种不同的消息版本:System V IPC 消息和 POSIX 消息。共享内存区。允许进程通过共享内存块来交换消息。在必须共享大...原创 2019-02-07 13:46:23 · 570 阅读 · 0 评论 -
深入理解 Linux 内核---Ex2 和 Ex3 文件系统
Ext2 的一般特征:引入 Ext2。Ext2 磁盘数据结构:说明把 Ext2 存放在磁盘上的数据结构。Ext2 的内存数据结构:说明如果把磁盘上的数据结构复制到内存中。创建 Ext2 文件系统:讨论如何在磁盘分区创建 Ext2。接着描述使用磁盘时内核所执行的操作,大部分是为索引节点和数据块分配磁盘空间。最后,对 Ext3 文件系统进行简短描述。Ext2 的一般特征以下特点有助于 E...原创 2019-02-03 15:56:10 · 2195 阅读 · 0 评论 -
深入理解 Linux 内核---回收页框
页框回收算法:阐述了内核回收页框的原因测量。反向映射:技术补充,介绍了内核使用的一种数据结构,借助该结构,内核可快速定位指向同一个页框的所有页表项。PFRA实现:介绍 Linux 使用的页框回收算法。交换:讲述了交换子系统,它将匿名页(并非文件的映射数据)保存到磁盘的内核。页框回收算法Linux 内核的页框回收算法(page frame reclaiming algorithm, PFR...原创 2019-01-31 18:01:21 · 1727 阅读 · 0 评论 -
深入理解 Linux 内核---访问文件
访问基于磁盘的文件是一种复杂的活动,既涉及 VFS 抽象层、块设备的处理,页涉及磁盘高速缓存的使用。将磁盘文件系统的普通文件和块设备文件都简单地统称为“文件”。访问文件的模式有多种:规范模式:规范模式下文件打开后,标志 O_SYNC 和 O_DIRECT 清 0,且它的内容是由系统调用 read() 和 write() 来存取。read() 将阻塞调用进程,直到数据被拷贝进用户态地址空间...原创 2019-01-05 22:29:06 · 2207 阅读 · 1 评论 -
深入理解 Linux 内核 --- 内存寻址
内存地址逻辑地址,段标识符(段选择符,16 位) + 段内偏移(32 位)。线性地址,也称虚拟地址,32 位无符号整数。物理地址,用于内存芯片级内存单元寻址,32 位或 36 位无符号整数。内存仲裁器。多处理器系统中,所有 CPU 共享同一内存,内存仲裁器可保证 RAM 芯片上的读写操作必须串行执行。即便单处理系统也需要,因为 DMA 控制器可以与 CPU 并发操作。段选择符段...原创 2018-10-08 20:17:42 · 520 阅读 · 0 评论 -
深入理解 Linux 内核---中断和异常
中断或异常会改变处理器执行的指令顺序。异常:来源:CPU 控制单元,时机:只有在一条指令终止执行后 CPU 才会发出中断。原因:程序产生错误,或内核必须处理的异常条件。中断:来源:间隔定时器或 I/O 设备。时机:随机产生。原因:依照 CPU 时钟信号。中断信号的作用为什么要引入中断信号?因为中断信可使得处理器转而去运行正常控制流之外的代码。当中断信号到来时,CPU ...原创 2018-10-23 21:18:07 · 2227 阅读 · 0 评论 -
深入理解 Linux 内核---内核同步
内核如何为不同的请求提供服务把内核看作必须满足两种请求的侍者:一种来自中断,另一种来自用户态进程发出的系统调用或异常。前者的优先级更高。侍者提供的服务对应于 CPU 处于内核态时所执行的代码。如果 CPU 在用户态执行,则认为侍者处于空闲状态。内核抢占如果进程正在执行内核函数时,即在内核态运行,允许发生内核切换,这个内核就是抢占的。Linux 中的抢占类型计划性进程切换:无论在抢占内...原创 2018-11-04 19:28:58 · 461 阅读 · 0 评论 -
深入理解 Linux 内核---定时测量
很多计算机化的活动都是由定时测量驱动的,这常常对用户不可见。Linux 内核必须完成两种主要的定时测量:保存当前的时间和日期,可由 time()、ftime()、gettimeofday() 返回给用户程序,也可由内核本身把当前时间作为文件和网络包的时间戳。维持定时器,告诉内核或用户程序某一时间间隔已经过去了。定时测量是由基于固定频率振荡器和计数器的几个硬件电路完成的。时钟和定时器电...原创 2018-11-10 14:26:33 · 1346 阅读 · 0 评论 -
深入理解 Linux 内核---进程调度
调度策略传统 Unix 操作系统的调度必须实现几个冲突的目标:进程响应时间尽可能快,后台作业的吞吐量尽可能高,尽可能避免进程的饥饿现象,低优先级和高优先级的需要尽可能调和等等。决定什么时候以怎样的方式选择一个新进程运行的规则为调度策略。Linux 的调度基于分时技术。调度策略也根据进程的优先级对它们进行分类。Linux 中,进程的优先级是动态的。进程分类方式一:I/O 受限。频繁使用...原创 2018-11-17 16:06:05 · 1689 阅读 · 0 评论 -
深入理解 Linux 内核---内存管理
RAM 的某些部分被永久地分配给内核,并用来存放内核代码及静态内核数据结构。RAM 的其余部分称为动态内存。整个系统的性能取决于如果有效地管理动态内存。页框管理Linux 采用 4KB 页框大小作为标准的内存分配单元,有如下两个原因:分页单元引发的缺页异常很容易得到解释,或者是请求的页存在但不允许进程对其访问,或者是请求的页不存在。主存和磁盘之间传输小块数据时更高效。页描述符页...原创 2018-12-01 16:13:08 · 648 阅读 · 0 评论 -
深入理解 Linux 内核---进程地址空间
后面讲述进程是怎样看待动态内存的。进程空间的基本组成。缺页异常处理程序在推迟给进程分配页框中所起的作用。内核怎样创建和删除进程的整个地址空间。与进程的地址空间管理有关的 API 和系统调用。进程的地址空间进程的地址空间由允许进程使用的全部线性地址组成。每个进程看到的线性地址集合是不同的。内核可通过增加或删除某些线性地址区间来动态地修改进程的地址空间。内核通过线性区来表示线性地址区...原创 2018-12-08 21:37:32 · 1385 阅读 · 0 评论 -
深入理解 Linux 内核---信号
信号的作用信号是很短的消息,可以被发送到一个进程或一组进程。发送给进程的唯一信息通常是一个数,来标识信号。前缀为 SIG 的一组宏标识信号。如,当一个进程引用无效的内存时,SIGSEGV 宏产生发送给进程的信号标识符。使用信号的两个目的:让进程知道已经发生了一个特定的事件。强迫进程执行它自己的代码中的信号处理程序。除了一些常规信号,POSIX 标准还引入了一类新的信号,叫做实时...原创 2018-12-15 15:10:01 · 6584 阅读 · 0 评论 -
深入理解 Linux 内核---系统调用
Unix 系统通过向内核发出系统调用实现了用户态进程和硬件设备之间的大部分接口。POSIX API 和系统调用应用编程接口:只是一个函数定义,说明如何获得一个给定的服务。系统调用:通过软中断向内核态发出一个明确的请求。一个 API 没必要对应一个特定的系统调用,比如抽象的数学函数。一个 API 可能调用几个系统调用。系统调用属于内核,而用户态的库函数不属于内核。系统调用处理程序及服务...原创 2018-12-10 20:02:35 · 1030 阅读 · 0 评论 -
深入理解 Linux 内核---I/O 体系结构和设备驱动程序
I/O 体系结构总线:让信息在个人计算机的 CPU、RAM 和 I/O 设备之间流动的数据通路。系统总线:所有计算机都拥有一条系统总线,连接大部分内部硬件设备。一种典型的系统总线是 PCI(Peripheral Component Interconect)总线。一台计算机包括几种不同类型的总线,它们通过称为“桥”的硬件设备连接在一起。两条高速总线在内存芯片上来回传送数据:前端总线将 CP...原创 2018-12-22 16:06:01 · 1749 阅读 · 0 评论 -
深入理解 Linux 内核---页高速缓存
磁盘高速缓存是一种软件机制,它允许系统把通常存放在磁盘上的一些数据保留在 RAM 中,以便对那些数据的进一步访问不用再访问磁盘而能尽快得到满足。页高速缓存几乎所有的文件读写操作都依赖于高速缓存,只有在 O_DIRECT 标志被置位,而进程打开文件的情况下才会出现例外。页高速缓存中的信息单位是一个完整的页。一个页包含的磁盘块在物理上不一定相邻,所以不能用设备号和块号标识,而是通过页的所有者和...原创 2018-12-28 20:31:13 · 2274 阅读 · 2 评论 -
深入理解 Linux 内核---虚拟文件系统
虚拟文件系统所隐含的思想是把表示很多不同种类文件系统的共同信息放入内核;其中有一个字段或函数来支持 Linux 所支持的所有实际文件系统所提供的任何操作。虚拟文件系统(VFS)的作用虚拟文件系统也可称为虚拟文件转换,是一个内核软件层,用来处理与 Unix 标志文件系统相关的所有系统调用。其健壮性表现在能为各种文件系统提供一个通用的接口。VFS 支持的文件系统可以划分为三种主要类型”...原创 2018-12-19 08:38:29 · 990 阅读 · 0 评论 -
深入理解 Linux 内核---块设备驱动程序
块设备的处理一个进程在某个磁盘文件上发出一个 read() 系统调用,内核对进程请求回应的一般步骤:read() 调用一个适当的 VFS 函数,将文件描述符和文件内的偏移量传递给它。虚拟文件系统位于块设备处理体系结构的上层,提供一个通用的文件系统模型,Linux 支持的所有系统均采用该模型。VFS 函数确定所请求的数据是否已经存在,如有必要,它决定如何执行 read 操作。有时候没有...原创 2018-12-24 20:31:11 · 3332 阅读 · 0 评论 -
深入理解 Linux 内核---进程
进程的静态特性进程是程序执行时的一个实例。从内核观点看,进程的目的就是担当分配系统资源(CPU 时间、内存等)的实体。一个进程创建时,几乎与父进程相同。父子进程共享包括程序代码(正文)的页,但有各自独立的栈和堆。实现多线程应用程序的一个简单方式是把轻量级进程与每个线程关联起来,既可以共享一些资源,如地址空间、打开的文件等,又能使得每个线程被内核独立调度。进程描述符为了管理进程,内核通过...原创 2018-10-12 22:07:53 · 1272 阅读 · 0 评论