30分钟了解linux操作系统内核总结

news2024/11/18 5:31:23

【推荐阅读】

概述Linux内核驱动之GPIO子系统API接口

一篇长文叙述Linux内核虚拟地址空间的基本概括

轻松学会linux下查看内存频率,内核函数,cpu频率

纯干货,linux内存管理——内存管理架构(建议收藏)

Linux 内核性能优化的全景指南,可都在这里了,强烈推荐收藏~

体系架构

dma可以在用户空间也可以在内核空间执行。

gdt(全局描述符表):所有进程的总目录表,包含每个任务的ldt和tss的地址。进程各段寻址,现场保护和恢复。

gdtr:存放gdt地址的寄存器

idt(中断描述符表):中断服务程序的入口地址。

idtr:存放idt地址的寄存器

流程:

1.bios执行实16位地址模式,检验内存磁盘等硬件,加载代码,执行初始化idt,gdt,pgd(页目录表)以及机器系统数据,为保护模式分页模式的main做准备。

2.执行start_kernel函数,初始化内存管理,文件系统,调度,时钟,设备等等。

3.启动初始化进程0,使用中断改变特权级别0操作系统层到3应用层。

4.进程0(初始化后变成idle进程), fork创建进程1。

5.进程1(init进程),fork创建进程2(kthreadd进程)。

cpu管理:
使用bitmap管理,有possible,present,online,active四种状态。
cpu分层为smt mc die

tlb和mmu

elf加载

内存屏障

1.内存乱序原因:编译器优化,多核cpu交叉访问。

2.barrier,让编译器不要优化。

3.smp_mb,保证smp多核cpu执行的顺序,屏障后的代码,invalidate cache。

mb,rmb,wmb,smp_mb,smp_rmb,smp_wmb,read_barrier_depends

内存管理

物理内存管理

1.物理内存初始化

2.node(numa)->zone

3.伙伴系统 alloc_pages

4.slab分配器 kmem_cache_create kmem_cache_alloc kmalloc

5.vmalloc分配不连续的内存。

虚拟内存管理

1.vma 遍历mm_rb红黑树,插入查找合并。

2.brk使用vma接口。

3.mmap

物理内存

4.缺页中断 do_page_fault,匿名页缺页中断

5.do_wp_page写时复制

6.page页(物理页面)引用计数,_count,_mapcount,pg_locked页面锁

7.反向映射rmap

8.kswapd回收页面

9.页面迁移migrate_pages

10.内存规整,处理内存碎片 __alloc_pages_direct_compact

11.ksm合并页面

12.oomkiller,swap

关注点

hugetlbpage,ksm,pagemap,Transparent Hugepage

进程管理

初始化相关的函数sched_init,fork_init。0号进程的内核线程栈大小是2个页8k。主线程默认大小2m或者8m平台不一样大小也不一样,线程有线程栈大小至少是2个页面,一个保存task_struct,一个保存->stack指向的空间(alloc_thread_stack_node)。

fork,vfork,clone

不管是进程还是线程,linux内核都是需要至少一个内核线程的,创建进程和线程的函数差不多,都可以使用clone,区别是参数的差别。

_do_fork->copy_process->dup_task_struct

根据不同的clone_flags参数,可以细粒度控制拷贝的对象范围:

sched_fork,copy_files,copy_fs,copy_signal,copy_mm,copy_io

然后执行生成pid或者连接线程到pid,cgroup的操作也在这里执行。

wake_up_new_task将新进程加入调度器中。

current

获取当前cpu对应的执行进程。

调度器

cfs调度是根据nice值算出权值,得出可以执行的时间。有两个时间一个是虚拟运行时间vruntime,一个是时间运行时间,cfs也有一个默认调度时间片6ms,执行时间粒度比较细,但至少有6ms。

调度切换 __schedule,切换时机:

锁,中断,主动执行schedule,系统调用,异常,cond_resched。

核心函数pick_next_task

stop_sched_class->dl_sched_class(sched_daedline)->rt_sched_class(sched_rr,sched_fifo)->fair_sched_class(sched_normal,sched_batch)->idle_sched_class(sched_idle)

优先执行实时进程,然后执行cfs调度器的进程,cfs调度器使用红黑树管理。这里还做了流水线分支优化,默认先判断当前使用的调度器是不是cfs公平调度或者idle调度。

核心切换函数context_switch

switch_mm_irqs_off:切换内存指向,切换后会有内存屏障,invalid cache。

switch_to:切换到新进程(切换的是寄存器状态和栈,使用汇编实现)。

总结:

1.每个cpu都有一个自己的struct rq队列

2.每个进程内嵌一个调度实体struct sched_entity ,sched_class,sched_rt_entity,sched_dl_entity,sched_info。

cgroup的组调度

task_group

进程管理模块调用其他模块

kmem_cache_alloc_node 通过slab.h引入,头文件在最外层的include中,模块划分很清晰。
wake_up_new_task 通过sched.h引入
红黑树实现在rbtree.h

关注点

cgroup

同步与锁操作

1.原子操作,指令实现:

ldrex Rt,[Rn] //将Rn寄存器指向地址的内容加载到Rt寄存器中

strex Rd,Rt,[Rn] //Rt寄存器值保存到Rn指向的地址中,Rd保存更新结果。0成功,1失败。

2.spinlock自旋锁,numa下存在公平性问题,L1 cache引起的,改良后变成排队自旋锁。改良后仍然存在缓存行颠簸现象(多个cpu的cacheline反复失效)。需要关闭抢占。spin_lock_irq还会关闭中断。新版本使用raw_spin_lock,保证不被抢占和睡眠。

3.信号量,pv操作,允许进程进入睡眠状态。sema_init初始化,计数器使用spinlock来锁定,如果需要睡眠调用schedule_timeout。

4.mutex互斥锁,可以自旋等待一段时间,睡眠之前尝试获取锁,mcs机制保证只有一个人自旋等待或者释放锁。mcs可以解决缓存行颠簸,核心思想是只在本地cpu自旋,全局的不自旋。

5.读写锁,可以是spinlock类型也可以是信号量类型。

6.rcu(read copy update),使用限制:受保护资源必须通过指针访问,例如链表。读无开销,写有开销,无锁编程。

中断

软中断:分上下部分
tasklet:软中断下半部分
workqueue:也是下半部机制

文件系统

vfs

inode结构体可以描述目录和文件。

特殊文件系统

/proc 进程的实时信息和配置信息。
/sys

内核的网络模块

sk_buff 套接字缓冲

napi

netfilter

netlink:取代ioctl

进程间通信

strace ptrace跟踪系统调用

其他

gdt ldt idt tr

pgd pmd pte

TLB地址变换高速缓存

mesi

alloc_pages分配物理页

vmalloc分配虚拟页,64位系统一般没有高端内存

malloc调用brk,按页分配vma,是虚拟内存,内部自己维护内存池,free,不立刻释放

kmalloc内核内部使用,使用slab对象的内存,slab着色区为了提高cacheline命中

32位系统使用高端内存可以使用vmalloc(high_mem)或者使用kmap永久或者临时映射

64位系统一般全部用线性映射就足够

物理内存分配alloc_page()分配一页使用per_cpu_pageset,大于一页会用到buddy系统分配

物理内存初始化分成zonedma,zonenormal,zonehighmem

smp每个cpu有自己的独立内存区,但是大部分内存都是共享的

numa每个内存划分到每个cpu上,优先访问本地内存,不够才使用其他cpu的内存

mpp基本相当于多个cpu独立工作

vma挂在task_stuct的mm_struct上,属于进程,内存虚拟地址都是在用户空间

mmap可以将用户空间的地址映射到和内核地址同一块物理内存,一段时间刷盘

vma使用链表+红黑树存储

page cahe:文件的内存缓存

kswapd页面回收,每个numa节点有一个kswapd线程,按zone回收,每个zone有一个lru链表

伙伴系统从zone_high到zone_normal分配内存,kswapd则从zone_normal到zone_high回收内存

如果内存碎片很多,kswapd会进行内存规整

pgd(10)-pmd(0)-pte(10)-page-物理页面(匿名页面,page cache)

task_struct->mm_struct->pgd/vma_areastruct

sched_fifo sched_rr 实时调度 优先级0-99 ,sched_normal sched_batch 普通调度cfs调度器优先级 100-139,sched_idel sched_daedline static_prio ->普通进程的优先级,根据normal_prio计算出来,不会动态变化;rt_priority->实时进程的优先级,独立的prio某些情况可动态提高,如实时互斥量,是调度类考虑的优先级nice值-20到19 对应的weight 88761到15,nice值越低优先级越高实时进程都跑完了状态变成空闲才会轮到普通进程调度。

多核cpu,使用多线程可以访问的变量时需要注意变量的取值,加上volatile能保证获取到最新的值,atomic原子变量也会从内存读取(arm 原子变量使用三个寄存器读取值volatile,都需要从内存重新读,cache每次读取写入都刷新最新的,smp多核的情况下使用LDREX STREX指令,操作失败会重新操作,锁的实现也有这部分;intel使用lock前缀,猜测直接使用mesi缓存锁可实现:理论上cpu1,cpu2都要执行原子操作,cpu1将本地cache修改后通知invalidate并把自己改成m,cpu2想写入发现自己是i就会失败重新执行)

spinlock自旋锁忙等待,信号量和mutex互斥锁则可能会进入睡眠,mutex会尝试自旋等待

读写锁写类似spinlock,读类似信号量;rcu读者开销小,读的过程可以拷贝一份写完成后直接切换指针,等读者读完后原来的数据销毁原来的数据

1.文件锁flock

2.gdt(全局描述符表)每个cpu有一个,ldt每个进程都可以有一份(用户空间一般共享一个);gdt定义了18个段描述符和14个空,ldt包含5个,改变特权的用途

3.mem_map保存页描述符(struct page 32字节),对应的页面属于物理页面

4.numa每个cpu核管理一块node内存(pg_data_t),每个node包含几个zone内存

5.用户态进内核两种方式,int 80和sysenter;内核退回用户态iret和sysexit;sysenter开销大概200ns,软中断大概3-5us。vdso速度更快,直接调用内核提供的动态共享库。

6.ipc共享内存可以在tmpfs查看

7.cpu访问数据先找L1cache(存虚拟地址),找不到mmu如果有tlb就找tlb,没有mmu通过映射表查找到物理地址(需要访问映射表内存),找到后找L2cache里有没有对应的物理地址,找不到就需要访问物理内存,然后存回L2,L1和tlb

发展中的技术

opencapi和pcie竞争的一种新型技术,运行cpu,fpga等任意芯片接入。
infiniband,rdma

内核开发调试工具

kcov gcov 性能分析
kasan 内存分析
kgdb 调试
Kmemleak 内存泄漏分析
kselftest 测试框架
Sparse 静态代码检查
UBSAN 运行时未定义行为检测
kdump
总结:基本上内核工具和应用层的工具功能差不多。

内核全景图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/72749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中学语文杂志中学语文杂志社中学语文编辑部2022年第30期目录

理论_视点《中学语文》投稿:cn7kantougao163.com 追求服务于学的“智慧语文”教育 陈维贤; 3-5 教学_阅读教学 高中古诗词群文阅读教学特点新探 张红娟; 6-8 导读需导思 领读方领悟 罗艳兰; 9-10 学习任务群背景下的群文阅读教学研究 丁雪云; 11-12…

守门员VS软件测试

虽然刚刚为世界杯贡献了点彩票钱,但我依然热爱着足球这项赛事。最近熬夜看球,突然发现我们软件开发团队里,守门员这个职位就像我们公司的那个测试倒霉蛋儿一样。 1、球队配比VS开发团队人员配比 △ 不管你的球队是443,还是552&am…

如何自定义SpringBoot中的starter,并且使用它

目录 1 简介 2 规范 2.1 命名 2.2 模块划分 3 示例 1 简介 SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁琐的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就自动扫描到要加载…

PyTorch笔记 - A ConvNet for the 2020s (ConvNeXt) 网络

欢迎关注我的CSDN:https://blog.csdn.net/caroline_wendy 本文地址:https://blog.csdn.net/caroline_wendy/article/details/128236899 Paper:A ConvNet for the 2020s,FAIR,Berkeley Code:https://github.com/facebookresearch/ConvNeXt 网络结构: stem layer:骨干层…

【k8s宝典】2022年12月份Kubernetes 认证管理员CKA轻松通过攻坚克难技巧

目标:攻克三大难点 提示:本人是12月近期通过的cka考试,所以总结的技巧是当前最新的,后面如果有稍许变化,这些技巧照样适用,题目请以实际为主 复制键不能用怎么办? 新版考试系统使用Ctrl c不…

【论文阅读笔记】Noise2Noise: Learning Image Restoration without Clean Data

官方代码地址:https://github.com/NVlabs/noise2noise 论文地址:https://arxiv.org/abs/1803.04189 第一次接触这方向,相当于翻译了。 摘要 作者通过机器学习将基础统计推理应用于信号重建上:学习将损坏的观察结果(co…

商务与经济统计 | 描述统计学

一.表格法和图形法 条形图 是一种描述已在一个频数,相对频数或百分数频数分布中汇总的品质数据的图形方法 饼形图 是一种常用的描绘品质数据的相对频数分布的图形方法 直方图 横轴上表示所关心的变量,纵轴上表示频数,相对频数或百分数频数…

23软考备考已开始,网络工程师知识点速记~(5)

新一轮软考备考来啦~ 为了帮助大家提高备考效率,将2023上半年软考网络工程师知识点速记分享给大家,快来跟着一起打卡学习吧! 进程的同步和互斥 计算机有了操作系统后性能大幅度提升,其根本原因就在于实现了进程的并发运行。多个…

接口多实现

一、什么是接口 接口是抽象类的延伸,可以将它看作是纯粹的对象类 二、接口模式的特性 (1)接口不可以被实例化。 (2)实现类必须实现接口的所有方法(类似于抽象类和抽象方法)。 (3&…

基于百度飞桨PaddleOCR的图片文字识别

PaddleOCR项目源码:https://github.com/PaddlePaddle/PaddleOCR 飞桨开源文字识别模型套件PaddleOCR,目标是打造丰富、领先、实用的文本识别模型/工具库。最新开源的超轻量PP-OCRv3模型大小仅为16.2M。同时支持中英文识别;支持倾斜、竖排等多…

[附源码]Python计算机毕业设计Django-中国传统手工艺销售平台

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

相似度衡量:苏剑林博客-3

本文主要是对苏剑林老师之前的博客中,对相似度相关的内容稍作整理。 Sentence-bert 是利用bert对两个句子判断相似度。 左图是训练期间的相似度计算方法,右图是推来过程中的相似度计算方法。 训练过程中使用时dense-linear方法,推理过程中…

vue 实现通过字符串关键字符动态渲染 input 输入框

vue 实现通过字符串关键字符动态渲染 input 输入框 今天做一个简单的demo,就是有一个字符串,字符串里面有标识符,前端检测到标识符之后,需要将这个标识符转换成一个 input 输入框并且进行数据输入和绑定功能。 问题描述 就比如现…

SOLIDWORKS 2023新功能揭秘!SOLIDWORKS Simulation 2023版本

SOLIDWORKS 2023新版本已经与大家见面,今天众联亿诚与大家分享SOLIDWORKS Simulation 2023新功能,让我们先一起来看看视频—— 点击观看SOLIDWORKS Simulation 2023新功能 一直以来,SOLIDWORKS Simulation以其易学易用和与设计深度集成深受广…

Docker自定义jdk镜像与上传阿里云

目录 自定义jdk镜像 制作jdk8 :v1.0镜像 alpine制作jdk镜像 alpine简介 基于Alpine制作jdk镜像 Alpine制作jre镜像 Docker镜像上传至阿里云 由于官方没有提供jdk,所以需要自定义jdk来配置java环境,以便于后期部署项目 自定义jdk镜像 制作jdk8 :v1.0…

【JavaWeb】第八章 Servlet

文章目录1、初识Servlet2、Servlet的HelloWorld3、Servlet的生命周期4、Servlet-请求的分发处理5、通过集成HttpServlet类来实现Servlet程序1、初识Servlet Servlet是JavaEE规范之一。规范就是接口。 Servlet是JavaWeb三大组件之一,三大组件分别是Servlet程序、Fi…

JAVA SCRIPT设计模式--行为型--设计模式之Iterator迭代器模式(16)

JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能,所以不可能像C,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVA SCRIPT代码,代码只是实现了设计模式的主体功能,不代…

[附源码]Python计算机毕业设计Django在线影院系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

[附源码]计算机毕业设计JAVA中小学微课学习系统

[附源码]计算机毕业设计JAVA中小学微课学习系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM myba…

JVM相关学习

一、了解JVM JVM就是Java虚拟机。好处: 一次编写,到处运行;自动内存管理,垃圾回收功能;数组下标越界越界检查;多态。 二、学习JVM 1.程序计数器(寄存器): 作用&#x…