内核链表
1-背景
链表是最最常用的数据结构之一,在c语言中没有cpp stl中那些可以动态申请的各种容器,所以链表是非常常用的用来动态分配的数据结构。
内核中也定义了一些基础的api,用来实现链表的各种操作,并且这些基础api也是经过了多年的维护、优化,最大程度的保障了性能以及安全。
在这片文章里总结、记录一下内核链表api的操作吧。
比较有趣的是,这些内核链表的api几乎都是linus 19年前实现的代码,这么多年一直没人修改或者说不必修改。
2-数据结构
内核定义了一个标准的基础链表数据结构list_head
struct
kdump调试
1-背景
kdump是linux用来分析crash问题的一种手段,在内核发生crash后,会主动启动第二内核,将当前内存中的所有状态转存至本地文件vmcore中。
但是有些服务器总是无法正常生产vmcore,我们这里总结一些简单的调试手段。
我们可以通过主动触发一个crash来验证机器是否可以生成kdump
echo c > /proc/sysrq-trigger
2-用户态服务
kdump存在一个用户态服务kdump.service,我们可以通过查看这个服务状态检查用户态是否已经住备好了正常捕获内核panic事件。
如下是一个正常的kdump.service状态
$ systemctl status
内存屏障
1、概述
参考:对优化说不 - Linux 中的 Barrier
1.1-load/store
在介绍内存屏障前,要先了解cpu中的load和store概念。正常来说,操作系统中的数据结构是存放在内存上的,而内存又分l1-l3 cache和主存,那么当CPU对数据结构进行读写操作的时候,就需要先将内存中的数据load到cache上,最后再load到cpu的寄存器内。
系统调用
1、概述
linux中有很多的命令是通过用户态实现的调用,例如最基础的read、write函数,通过系统调用,陷入内核态,执行内核中的相关系统sys_read、sys_writeAPI逻辑。
函数的命名也基本遵循上述规律,用户态的函数通常是xyz(),而内核态中的相关调用则是sys_xyz()。由于整个流程涉及到内核态与用户态的切换,所以系统调用的实现与架构强相关。
2、用户态实现
通常来说,
内核同步机制1
1、原子操作
原子操作的核心和是完成命令整个操作不会被打断。
原子操作(atomic operation),不可分割的操作。其通过原子变量来实现,以保证单个CPU周期内,读写该变量,不能被打断,进而判断该变量的值,来解决并发引起的互斥。
由于原子操作的原理,所以在功能实现上需要硬件平台的支持,以x86平台为例,在执行原子操作的时候会在指令前增加一个LOCK_PREFIX前缀,
static __always_
linux进程管理-2进程创建
0、前言
主要分析进程创建fork,线程、进程关系、copy_on_write。
1、复制进程
fork是通过复制父进程的方式来创建一个新的进程,内核中相关键函数和流程主要是被定义在了kernel/fork.c之中,通过fork.c里我们可以看到,有几个常用的sys_call:
* fork
* vfork
linux进程管理-1描述符和状态
1、task_struct数据结构
描述进程状态的基础数据结构名称是task_struct,在内核的include/linux/sched.h中定义。
随着内核的发展,这个结构体里的内容越来越多,6.6的版本上,现在直接800+行,下边截取一些关键的片段。
struct task_struct {
#ifdef
Makefile指南
0、前言
内核编译以及工具开发过程中,经常会涉及到Makefile文件,这一次详细来看一下Makefile相关的内容。
官方手册:Learn Makefiles
很好的学习文章:跟我一起写Makefile
1、入门
1.1-Makefile的作用
编译一个最简单的.c文件通常会使用到
gcc main.c
但是在大型复杂项目在构建的时候,
linux进程管理-kthread
0、背景
kthread是指代特殊的在内核态运行的线程,其创建、管理的逻辑与普通集成有所区别,但在调度上还是与其他进程或者线程是类似的。
1、创建
内核线程的创建主要是通过kthread_create,另外kthread_run也可创建线程,区别是在创建的同时还会直接运行这个线程。
可以看到kthread_create的实际原型是kthread_create_on_node。
#define kthread_
CPU虚拟化
1、CPU虚拟化概述
CPU虚拟化是一种技术,它允许单个物理CPU模拟多个虚拟CPU(VCPU)。这使得多个操作系统(OS)实例能够在同一个物理服务器上并行运行,每个实例都在自己的隔离环境中执行。在虚拟化环境中,操作系统通常运行在被称为虚拟机(VM)的封装环境中。每个VM都像拥有独立的物理硬件一样运行,尽管实际上它们共享着同一台物理机的资源。
1.1-虚拟化技术的关键挑战
1. 特权指令和敏感操作:在没有硬件支持的情况下,