
深入Linux内核架构
静能生悟
静生智,定生慧,一勤天下无难事,俭以养德,厚德载物!!
展开
-
Linux内存管理之内存检测技术(slub_debug/kmemleak/kasan)
請參考https://www.cnblogs.com/arnoldlu/p/8568090.html转载 2020-12-21 16:14:20 · 787 阅读 · 0 评论 -
WiFi-常用iwpriv命令
请参考博客:https://blog.youkuaiyun.com/bingyu9875/article/details/52833594转载 2020-10-26 17:59:48 · 2412 阅读 · 0 评论 -
深入Linux内核架构—内存管理(三)
一、页表层次化的页表用于支持对大地址空间的快速、高效的管理。考察具体的技术实现。页表用于建立用户进程的虚拟地址空间和系统物理内存之间的关联。到目前为止讨论的结构主要用来描述内存的结构(划分为结点和内存域),同时指定其中包含的页帧的数量和状态(使用中或空闲)。页表用于向每个进程提供一致的虚拟地址空间。应用程序看到的地址空间是一个连续的内存区。该表也将虚拟内存页映射到物理内存,因而支持共享内存...原创 2020-04-29 16:54:09 · 280 阅读 · 0 评论 -
深入Linux内核架构—内存管理(二)
一、(N)UMA 模型中的内存组织Linux支持的各种不同体系结构在内存管理方面差别很大。由于内核的明智设计,以及某些情况下插入的兼容层,这些差别被隐藏起来了。按照先前讨论过的,一个主要的问题是页表中不同数目的间接层。另一个关键是NUMA和UMA系统的划分。内核对一致和非一致内存访问系统使用相同的数据结构,针对各种不同形式的内存布局,各个算法几乎没有什么差别。在UMA系统上,只使用一个NU...原创 2020-04-28 12:01:03 · 305 阅读 · 0 评论 -
深入Linux内核架构—内存管理(一)
内存管理是内核最复杂同时也是最重要的一部分。特点在于非常需要处理器和内核之间的协作。本章从技术方面讲解具体的实现。一、概述内存管理的实现涵盖了许多领域:内存中的物理内存页的管理;分配大块内存的伙伴系统;分配较小块内存的slab、 slub和slob分配器;分配非连续内存块的vmalloc机制;进程的地址空间。Linux内核一般将处理器的虚拟地址空间划分为两个部分。底...原创 2020-04-20 17:35:36 · 460 阅读 · 0 评论 -
深入Linux内核架构-进程管理和调度(十三)—调度器增强
一、调度器增强到目前为止,只考虑了实时系统上的调度。事实上, Linux可以做得更好些。除了支持多个CPU之外,内核也提供其他几种与调度相关的增强功能。请注意,这些增强功能大大增加了调度器的复杂性,主要考虑简化的情形,目的在于说明实质性的原理,而不考虑所有的边界情形和调度中出现的奇异情况。1、SMP调度多处理器系统上,内核必须考虑几个额外的问题,以确保良好的调度。CPU负荷必须尽可...原创 2020-04-20 14:45:50 · 402 阅读 · 0 评论 -
深入Linux内核架构-进程管理和调度(十二)-实时调度类
一、实时调度类按照POSIX标准的强制要求,除了“普通”进程之外, Linux还支持两种实时调度类。调度器结构使得实时进程可以平滑地集成到内核中,而无需修改核心调度器,这是调度类带来的好处。实时进程的特点在于其优先级比普通进程高,对应地,其static_prio值总是比普通进程低。rt_task通过检查其优先级来证实给定进程是否是实时进程,而task_has_rt_policy则检测进程是...原创 2020-04-15 11:55:09 · 269 阅读 · 0 评论 -
深入Linux内核架构-进程管理和调度(十一)
4、选择下一个进程选择下一个将要运行的进程由pick_next_task_fair执行。代码流程图在图2-21给出。kernel/sched_fair.c如果nr_running计数器为0,即当前队列上没有可运行进程,则无事可做,函数可以立即返回。否则将具体工作委托给pick_next_entity。kernel/sched_fair.ckernel/sched_f...原创 2020-04-14 15:39:42 · 393 阅读 · 0 评论 -
深入Linux内核架构-进程管理和调度(十)
一、完全公平调度类核心调度器必须知道的有关完全公平调度器的所有信息,都包含在fair_sched_class中:kernel/sched_fair.c在先前的讨论中,已经看到主调度器调用这些函数,接下来将考察这些函数在CFS(完全公平调度)中的实现方式。1、数据结构首先,需要介绍一下CFS的就绪队列。回想一下,可知主调度器的每个就绪队列中都嵌入了一个该结构的实例:ker...原创 2020-04-13 17:41:22 · 210 阅读 · 0 评论 -
深入Linux内核架构-进程管理和调度(九)
一、处理优先级内核内部对优先级的处理相当复杂。1、优先级的内核表示在用户空间可以通过nice命令设置进程的静态优先级,这在内部会调用nice系统调用。进程的nice值在-20和+19之间(包含)。值越低,表明优先级越高。内核使用一个简单些的数值范围,从0到139(包含),用来表示内部优先级。同样是值越低,优先级越高。从0到99的范围专供实时进程使用。nice值[-20, +19]映...原创 2020-04-12 18:06:43 · 236 阅读 · 0 评论 -
深入Linux内核架构-进程管理和调度(八)
一、调度器的实现原创 2020-04-10 15:27:21 · 215 阅读 · 0 评论 -
深入Linux内核架构-进程管理和调度(七)
一、启动新程序通过用新代码替换现存程序,即可启动新程序。Linux提供的execve系统调用可用于该目的。1、execve的实现该系统调用的入口点是体系结构相关的sys_execve函数。该函数很快将其工作委托给系统无关的do_execve例程。fs/exec.cint do_execve(char * filename, char __user *__user *argv, ...原创 2020-04-03 11:32:25 · 265 阅读 · 0 评论 -
深入Linux内核架构-进程管理和调度(六)
一、内核线程内核线程是直接由内核本身启动的进程。内核线程实际上是将内核函数委托给独立的进程,与系统中其他进程并行执行(实际上,也并行于内核自身的执行)。内核线程称之为(内核) 守护进程。它们用于执行下列任务。周期性地将修改的内存页与页来源块设备同步(例如,使用mmap的文件映射)。如果内存页很少使用,则写入交换区。管理延时动作。实现文件系统的事务日志。基本上,有两种类型的内...原创 2020-04-02 17:26:17 · 180 阅读 · 0 评论 -
深入Linux内核架构-进程管理和调度(五)
在此讨论各个copy_xxx函数的概述其作用。kernel/fork.c如果CLONE_SYSVSEM置位,则copy_semundo使用父进程的System V信号量。...原创 2020-04-02 14:29:26 · 277 阅读 · 0 评论 -
深入Linux内核架构-进程管理和调度(四)
一、进程管理相关的系统调用讨论 fork 和 exec 函数族(用来用指定的程序替换当前进程的所有内容)系统调用的实现。通常这些调用不是由应用程序直接发出的,而是通过一个中间层调用,即负责与内核通信的C标准库。从用户状态切换到核心态的方法,依不同的体系结构而各有不同。用于在这两种状态之间切换的机制,并解释了用户空间和内核空间之间如何交换参数。就目前而言,将内核视为由C标准库使用的“程序库...原创 2020-01-20 16:17:10 · 306 阅读 · 0 评论 -
深入Linux内核架构-进程管理和调度(三)
一、进程ID号UNIX进程会分配一个号码用于在其命名空间中唯一地标识它们。该号码被称作进程ID号,简称PID。用fork或clone产生的每个进程都由内核自动地分配了一个新的唯一的PID值。1、进程ID但每个进程除了PID之外,还有其他的ID。有下列几种可能的类型。1)处于某个线程组中的所有进程都有统一的线程组ID。如果进程没有使用线程,则其PID和TGID相同。线程组中的主进...原创 2019-11-14 17:22:11 · 245 阅读 · 0 评论 -
深入Linux内核架构-进程管理和调度(二)
一、进程表示Linux内核涉及进程和程序的所有算法都围绕一个名为task_struct的数据结构建立,该结构定义在include/sched.h中。这是系统中主要的一个结构。在阐述调度器的实现之前,了解一下Linux管理进程的方式很有必要。task_struct包含很多成员,将进程与各个内核子系统联系起来,会逐一讨论。task_struct定义如下:include/sched.h...原创 2019-11-10 17:04:57 · 211 阅读 · 0 评论 -
深入Linux内核架构-进程管理和调度(一)
现代操作系统都能够同时运行若干进程。如果系统只有一个处理器,那么在给定时刻只有一个程序可以运行。在多处理器系统上,可以真正并行运行的进程数目,取决于物理CPU的数目。内核和处理器建立了多任务的错觉,即可以并行做几种操作,这是通过以很短的间隔在系统运行的应用程序之间不停切换而做到的。由于切换间隔如此之短,使得用户无法注意到短时间内的停滞,在感观上觉得计算机能够同时做几件事情。这种系统管理方式...原创 2019-11-03 22:08:24 · 319 阅读 · 0 评论 -
深入Linux内核架构—简介和概述(七)
一、数据类型与用户层程序相比,内核对与数据类型有关的一些问题采取了不同的处理方法。1、类型定义内核使用typedef来定义各种数据类型,以避免依赖于体系结构相关的特性,比如,各个处理器上标准类型的位长可能都不见得相同。定义的类型名称如定义的类型名称如 sector_t (用于指定块设备上的扇区编号)、 pid_t (表示进程ID)等,这些都是由内核在特定于体系结构的代码中定义的,以确保...原创 2019-10-20 21:28:44 · 358 阅读 · 0 评论 -
深入Linux内核架构—简介和概述(六)
一、对象管理和引用计数内核中很多地方都需要跟踪记录C语言中结构的实例。尽管这些对象的用法大不相同,但各个不同子系统的某些操作非常类似,例如引用计数。这导致了代码复制。由于这是个糟糕的问题,因此在内核版本2.5的开发期间,内核采用了一般性的方法来管理内核对象。所引入的框架并不只是为了防止代码复制,同时也为内核不同部分管理的对象提供了一致的视图,在内核的许多部分可以有效地使用相关信息,如电源管理。...原创 2019-10-20 17:13:02 · 230 阅读 · 0 评论 -
深入Linux内核架构—简介和概述(五)
一、文件系统Linux系统由数以千计乃至百万计的文件组成,其数据存储在硬盘或其他块设备。存储使用层次式文件系统。文件系统使用目录结构组织存储的数据,并将其他元信息(例如所有者、访问权限等)与实际数据关联起来。Linux支持许多不同的文件系统:标准的Ext2(第二版扩展文件系统)和Ext3(第三版扩展文件系统)、ReiserFS、XFS(一种高性能的日志文件系统)、VFAT(FAT32文件系统格...原创 2019-10-13 22:48:18 · 370 阅读 · 0 评论 -
深入Linux内核架构—简介和概述(四)
一、页表用来将虚拟地址空间映射到物理地址空间的数据结构称为页表。实现两个地址空间(虚拟地址空间、物理地址空间)的关联最容易的方法是使用数组,对虚拟地址空间中的每一页,都分配一个数组项。该数组项指向与之关联的页帧(物理内存页),但有一个问题。例如,IA-32体系结构使用4KB页,在虚拟地址空间为4GB的前提下,则需要包含100万项的数组。在64位体系结构上,情况会更糟糕。每个进程都需要自身的页表...原创 2019-10-13 17:45:14 · 327 阅读 · 0 评论 -
深入Linux内核架构—简介和概述(三)
一、地址空间与特权级别1K=1024B=2^10(2的10次方)B1M=1024K1G=1024M由于内存区域通过指针寻址,因此CPU的字长(32位、64位)决定所能管理的地址空间的最大长度。对32位系统,是2^32B=4GB,对64位处理器,可以管理2^64(2的64次方)B。地址空间的最大长度与实际可用的物理内存数量无关,因此被称为虚拟地址空间。从系统中每个进程的角度来看,...原创 2019-10-07 19:04:23 · 272 阅读 · 0 评论 -
深入Linux内核架构—简介和概述(二)
一、Linux内核的组成部分主要概述Linux内核的各个组成部分。尽管Linux是整体式的宏内核,但其具有相当良好的结构。Linux内核各个组成部分之间的彼此交互是不可避免的。各部分会共享数据结构,而且与严格隔离的系统相比,各部分(因为性能原因)协同工作时需要更多的函数。图1-1概述了组成完整Linux系统的各个层次、以及内核所包含的一些重要子系统。但要注意,各个子系统之间实际上会以各种方式进...原创 2019-09-15 20:18:26 · 447 阅读 · 0 评论 -
深入Linux内核架构—简介和概述(一)
一、内核的任务在纯技术层面上,内核是硬件与软件之间的一个中间层。其作用是将应用程序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。1、从应用程序的视角来看,内核可以被认为是一台增强的计算机,将计算机抽象到一个高层次上。例如,在内核寻址硬盘时,它必须确定使用哪个路径来从磁盘向内存复制数据,数据的位置,经由哪个路径向磁盘发送哪一条命令,等等。另一方面,应用程序只需发出传...原创 2019-09-15 15:53:23 · 732 阅读 · 0 评论