在《Linux 内核调试利器 | kprobe 的使用》一文中,我们介绍过怎么使用 kprobe 来追踪内核函数,而本文将会介绍 kprobe 的原理和实现。...kprobe 原理 kprobe 可以用来跟踪内核函数中某一条指令在运行前和运行后的情况。...如果你读过我们之前写的一篇文章《断点的原理》,那么就比较容易理解 kprobe 的原理了,因为 kprobe 使用了类似于断点的机制来实现的。...为了解决这个问题,Linux 内核使用单步调试模式来处理这种情况。...总结 本文主要介绍了 kprobe 的原理与实现,正如本文开始时所说,kprobe 机制的细节很多,所以本文不可能对所有细节进行分析。
线程在linux中的实现 4.1 liunx线程概述 一组线程共享进程内的内存地址空间,打开的文件和其他资源 线程机制支持并发程序设计技术,多处理器上保证真正的并行处理 linux实现线程的机制非常独特...,从内核角度看,没有线程的概念 linux把所有线程都当做进程来实现,内核没有特别的调度算法或数据结构来表征线程,被视为一个使用某些共享资源的进程 每个线程有自己的task_struct,就像一个普通的进程...调度算法 3.1 概述 linux调度程序定义与kernel/sched.c 2.5版本内核重写调度算法,和以前版本区别很大,实现以下目标 充分实现O(1)调度,不管多少进程或什么输入,每个算法能在恒定时间内完成...自旋锁可用于防止多个线程同时进入临界区 自旋时特别浪费cpu,所以不应该被长时间持有 接口定义在,具体与体系结构相关的实现在 linux中自旋锁不可用递归 自旋锁的使用spinlock_t mr_lock...临时局部原理:数据一旦被访问,很有可能在短期内再次被访问 执行io操作前,内核会检查数据是否已经在页高速缓存中,如果在就可以立马返回 2.
1.2、可靠的容错能力 1、集群级容错 与集群管理器集成 Flink与集群管理器紧密集成,例如Yarn、K8s。当进程挂掉时,将自动启动一个新进程来接管它工作。...2、应用级容错 Flink使用轻量级分布式快照机制,设计了检查点(CheckPoint)来实现可靠的容错。 一致性 Flink的恢复机基于应用程序状态的一致性检查点。...API层 API层是Flink对外提供能力的接口,实现了面向流计算的DataStream Api和面向批次处理的DataSetApi。...抽象,是Source和Sink的具体实现。...参考书籍《Flink 内核原理与实现》
读取外部数据 Flink作为分布式执行引擎,本身没有数据存储能力,所以定义了一系列接口、连接器与外部存储进行交互,读写数据。...JoinedStreams & CoGroupedStreams Join是CoGroup的一种特例,JoinedStreams底层 使用CoGroupedStreams来实现。...KeyBy()使用Hash Partition实现。该运算应用在DataStream上,输出结果为KeyedStream。...Reduce 按照KeyedStream中的逻辑分组,将当前数据与最后一次的Reduce结果进行合并,合并逻辑由开发者自己实现。...参考书籍《Flink 内核原理与实现》
linux内核分析———SLAB原理及实现 Slab原理及实现 1. 整体关系图 ! ?...注:SLAB,SLOB,SLUB都是内核提供的分配器,其前端接口都是一致的,其中SLAB是通用的分配器,SLOB针对微小的嵌入式系统,其算法较为简单(最先适配算法),SLUB是面向配备大量物理内存的大规模并行系统...kmalloc_sizes.h struct cache_sizes malloc_sizes[] = { #define CACHE(x) { .cs_size = (x) }, #include <linux
在Linux内核中,进程又称为任务(task),进程的虚拟地址空间可以分为用户虚拟地址空间和内核虚拟地址空间,所有进程共享内核虚拟地址空间,又各自拥有独立的用户虚拟地址空间。...图片 Linux内核提供了一组宏值来表示进程的状态: TASK_RUNNING(可运行状态或就绪状态);Linux并没有严格区分运行态或就绪态,统一为TASK_RUNNING...Linux不支持硬实时处理,至少在主流的内核中不支持。...内核线程是直接由内核本身启动的线程,内核线程实际上是将内核函数委托给独立的进程,与系统中其他进程“并行执行”(实际上也并行于内核自身的执行)。....实现文件系统的事务日志 内核线程是独立运行在内核空间的进程,与普通用户进程区别在于内核线程没有独立的进程地址空间。
作者简介 谢欢,大家可以叫我Jeff, 我目前就职于某国际知名linux发行版开源公司, 热衷于linux内核。...我平时把linux内核源码当小说一样阅读学习,也一直把能给linux社区贡献更多有质量的代码而努力。...今年10月中旬,我向Linux内核社区提交了一个关于tracing 的patchset. tracing 的 Maintainer steve 和kprobe的maintainer Masami都非常感兴趣...有老师带着学,我们可以事半功倍,搞懂了原理,再去使用工具,更加得心应手了 老师如果有精力,也可以出一些内核子系统的实现讲解,就像ftrace这种讲法就挺好 Jeff老师:我是准备之后讲解block子系统的...其实第一节课的内容能听懂,后面就都好懂了, 第四课的trace_event 我后来自己搜了一些文章看了一遍,再结合视频又听了一遍,能大致听懂 trace_event 的实现原理和逻辑,只是还是有刚才上面的疑问
一、概念: 大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣。...为了满足这个需求,也即是让某个子系统在发生某个事件时通知其它的子 系统,Linux内核提供了通知链的机制。通知链表只能够在内核的子系统之间使用,而不能够在内核与用户空间之间进行事件的通知。...所以对于通知链表来说有一个通知 方与一个接收方。在通知这个事件时所运行的函数由被通知方决定,实际上也即是被通知方注册了某个函数,在发生某个事件时这些函数就得到执行。...内核代码中一般把通知链命名为xxx_chain, xxx_nofitier_chain这种形式的变量名。 三、运作机制: 通知链的运作机制包括两个角色: 被通知者:对某一事件感兴趣一方。...分别在代码buildchain.c与regchain.c中。发送通知信息的代码为notify.c。 代码1 buildchain.c。
具体的实现方式基本都是由操作系统将虚拟地址空间划分为两部分,一部分为内核空间,另一部分为用户空间。...为什么需要区分内核空间与用户空间 在 CPU 的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃,比如清内存、设置时钟等。...内核态与用户态 好了我们现在需要再解释一下什么是内核态、用户态: 当进程运行在内核空间时就处于内核态,而进程运行在用户空间时则处于用户态。...对于 Linux 来说,通过区分内核空间和用户空间的设计,隔离了操作系统代码(操作系统的代码要比应用程序的代码健壮很多)与应用程序代码。...所以说,Linux 中每个进程有两个栈,分别用于用户态和内核态。 下图简明的描述了用户态与内核态之间的转换: ?
T 状态意味着:(TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态,接下来就可以通过 GDB 实现各种调试的操作了。...我们这次也要实现类似的效果,不过只是一个超简化版本,只考虑:在指定的位置暂停,获得进程的控制权。...实现思路 实现的思路非常简单 1. 先确定我们要断点的地址 在 GDB 中,我们是习惯对 行号 或者 函数名 直接设置断点,行号相对来说比较复杂,我们先展示 函数名 的。...在 Linux 环境下编译出来的可执行文件都是遵循 ELF 格式,如果没有特殊处理,它会保留比较完整的 符号表。 就拿开头的程序来当例子,可以通过 readelf -s a.out 查看: ?.../trace_test 22346 # 本文开头的进程 总结 关于断点的原理网上有很多文章提到,但比较多也是蜻蜓点水一笔带过,意犹未尽,干脆直接用最浅显的例子降低大家练手 成本!
这本书属于学习Linux内核原理必读推荐书目之一!...对Linux内核的设计原理进行了细致的说明,也有具体实现部分的介绍,结合源码能很好的理解Linux内核; 在简单翻了一遍之后,带着如下几个疑问,整理了下相关知识点: 1、内核是什么时候加载运行的; 2、...根据《Linux内核设计与实现》说明,CPU在某个任何特定的时间点上的活动必然概括为下列三种之一: 运行于用户空间,执行用户进程; 运行于内核空间,处于进程上下文,代表某个特定的进程执行; 运行于内核空间...Linux设备驱动作为一个linux内核模块存在,模块都有2个接口函数,模块初始化函数和模块退出函数。 上面提到的驱动程序的注册。一般是由模块初始化函数来实现的。...MMU/Cache line CPU L1/L2高速缓存 页高速缓存:Linux内核实现的磁盘缓存,主要用来减少对磁盘的I/O操作。
Linux kprobes调试技术是内核开发者们专门为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术。...本文首先简单描述这3种探测技术的原理与区别,然后主要围绕其中的kprobe技术进行分析并给出一个简单的实例介绍如何利用kprobe进行内核函数探测,最后分析kprobe的实现过程(jprobe和kretprobe...内核源码:Linux-4.1.15 实验环境:CentOS(x86_64)、树莓派1b 2022年嵌入式开发想进互联网大厂,你技术过硬吗?...kprobes的技术原理并不仅仅包含存软件的实现方案,它也需要硬件架构提供支持。...内核学习网站: Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈 二、kprobe原理 下面来介绍一下kprobe是如何工作的。
Linux kprobes调试技术是内核开发者们专门为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术。...本文首先简单描述这3种探测技术的原理与区别,然后主要围绕其中的kprobe技术进行分析并给出一个简单的实例介绍如何利用kprobe进行内核函数探测,最后分析kprobe的实现过程(jprobe和kretprobe...内核源码:Linux-4.1.15 实验环境:CentOS(x86_64)、树莓派1b 一、kprobes技术背景 开发人员在内核或者模块的调试过程中,往往会需要要知道其中的一些函数有无被调用、何时被调用...kprobes的技术原理并不仅仅包含存软件的实现方案,它也需要硬件架构提供支持。...4.2、x86_64架构实现 x86_64架构的单步执行函数与arm架构的原理不同,其主要原理是:当程序执行到某条想要单独执行CPU指令时,在执行之前产生一次CPU异常,此时把异常返回时的CPU的EFLAGS
《Linux内核设计与实现》第3版,英文版已经出版,中文版即将出版。...本书基于linux 2.6介绍了linux内核的设计与实现,涵盖了从核心内核系统的应用到内核设计与实现等各方面内容,主要内容包括:进程管理、调度、时间管理和定时器、系统调用接口、内存寻址、内存管理、页缓存...本书详细描述了linux内核的主要子系统和特点,包括其设计、实现和接口,既介绍理论也讨论具体应用,填补了linux内核理论和实践细节之间的鸿沟。...本版新增内容: ·增加一章专门描述内核数据结构 ·详细描述中断处理程序 ·扩充虚拟内存和内存分配的内容 ·调试linux内核的技巧 ·内核同步和锁机制的深度描述 ·提交内核补丁以及参与linux...就我们的经验,内核初学者(不是编程初学者)可以从这本书着手,对内核各个核心子系统有个整体把握,包括它们提供什么样的服务,为什么要提供这样的服务,又是怎样实现的。
(1)硬中断 由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。...linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。...(3)中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。...内核在执行完中断处理程序以后,马上就会调用do_softirq(),于是软中断开始执行中断处理程序完成剩余的任务。 下面来看下do_softirq()的具体实现。...内核不会立即处理重新触发的软中断。
本文介绍连接跟踪(connection tracking,conntrack,CT)的原理,应用,及其在 Linux 内核中的实现。 代码分析基于内核 4.19。...Netfilter architecture inside Linux kernel Linux 的连接跟踪是在 Netfilter 中实现的。...但由 1.2 节的讨论可知, 连接跟踪概念是独立于 Netfilter 的,Netfilter 只是 Linux 内核中的一种连接跟踪实现。...其基本原理是: 基于 BPF hook 实现数据包的拦截功能(等价于 netfilter 里面的 hook 机制) 在 BPF hook 的基础上,实现一套全新的 conntrack 和 NAT 因此,...4 Netfilter NAT 实现 NAT 是与连接跟踪独立的模块。
如果是32位处理器, 则内存地址总线是32位的,与CPU 执行单元相连,而经过MMU转换后的外地址总线则不一定是32位。...也就是说,虚拟地址空间与物理地址空间是独立的,32位处理器的虚拟地址空间是4GB,而物理地址空间既可以大于也可以小于4G。...用户空间和内核空间 通常操作系统把虚拟地址划分为用户空间和内核空间,例如 X86平台的Linux 系统虚拟地址空间是0x00000000 - 0xFFFFFFFF,前3GB(0x00000000 - 0xBFFFFFFF...用户程序加载到用户空间,在用户模式下执行,不能访问内核中的数据,也不能跳转到内核代码中执行。 这样可以保护内核,如果一个进程访问了非法地址,顶多这一个进程崩溃,而不会影响到内核和整个系统的稳定性。...内核把这个异常解释为段错误,把相发异常的进程终止掉。
当进程要获取某些资源(例如从网卡读取数据)的时候,但资源并没有准备好(例如网卡还没接收到数据),这时候内核必须切换到其他进程运行,直到资源准备好再唤醒进程。...waitqueue (等待队列) 就是内核用于管理等待资源的进程,当某个进程获取的资源没有准备好的时候,可以通过调用 add_wait_queue() 函数把进程添加到 waitqueue 中,然后切换到其他进程继续执行...可以通过调用 init_waitqueue_head() 函数来初始化 wait_queue_head_t 结构,其实现如下: void init_waitqueue_head(wait_queue_head_t...可以通过调用 init_waitqueue_entry() 函数来初始化 wait_queue_t 结构变量,其实现如下: static inline void init_waitqueue_entry...wait_queue_head_t 结构与 wait_queue_t 结构之间的关系如下图: ?
直接I/O 直接I/O 就是对用户进行的 I/O 操作直接与块设备进行交互,而不进行缓存。...直接I/O 的缺点是:每次 I/O 操作都直接与块设备进行交互,增加了对块设备的读写操作。...直接I/O 实现 当调用 open() 系统调用时,在 flags 参数指定 O_DIRECT 标志即可使用 直接I/O。我们从 虚拟文件系统 开始跟踪 Linux 对 直接I/O 的处理过程。...tmp = getname(filename); // 把文件名从用户空间拷贝到内核空间 fd = PTR_ERR(tmp); if (!...可以看出,对于 I/O 操作后的数据会直接保存到用户空间的内存,而没有通过内核缓存作为中转,从而达到 直接I/O 的目的。
1、jprobe使用实例 使用jprobe探测函数的入参值,需要编写内核模块。...同kprobe一样,内核同样提供了jprobe的实例程序jprobe_example.c(位于sample/kprobes目录),该程序实现了探测do_fork函数入参的功能,用户可以以它为模板来探测其他函数...在分析jprobe_example.c之前先熟悉一下jprobe的基本结构与API接口。 1.1、jprobe结构体与API介绍 struct jprobe结构体定义如下: ?...2.1、jprobe实现原理 利用kprobe,jprobe是一种特殊形式的kprobe,它有自己的pre_handler和break_handler回调函数,其中pre_handler回调函数负责保存原始调用上下文并为调用用户指定的探测函数...3、总结 jprobe探测技术基于kprobe实现,是kprobes三种探测技术中的第二种,内核开发人员可以用它来探测内核函数的调用以及调用时的入参值,使用非常方便。
领取专属 10元无门槛券
手把手带您无忧上云