![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux内核分析
文章平均质量分 90
FreeeLinux
A3GM5H3647LPD4QVYMYAER2S47P4WZ2UKBXBCGZES2V62WEY2HULQA
展开
-
linux内存管理--用户空间和内核空间
有用户进程进行系统调用(代表用户进程在内核态执行)等时刻可以访问到内核空间。用户空间对应进程,所以每当进程切换,用户空间就会跟着变化;而内核空间是由内核负责映射,它并不会跟着进程变化,是固定的。内核空间地址有自己对应的页表,用户进程各自有不同的页表。转载 2017-01-07 20:21:17 · 575 阅读 · 0 评论 -
slab机制总结篇
唔,花了一个星期看完了slab机制的源码,不愧是linux内核源码,和我当初看libevnt源码有一拼。两者都是资料比较少,只有零散的博客,没有成文的书,因此加大了自己理解的难度。如果有书籍的话,那么根本不需要一个星期。下面要开始总结了。 一: slab是为了解决内部碎片提出的,还是外部碎片? 为了解决内部碎片。 内部碎片的产生:因为所有的内存分配必须起始于可被 4原创 2017-01-16 16:55:41 · 7527 阅读 · 0 评论 -
mmap内核源码分析
对于mmap函数,我之前的理解太单一了。这几天好好复习了一下以前学过的知识,重新对该函数有了新的认识。之前我的认识是,mmap是用来映射内存的,它映射的内存来自磁盘上文件。所以我以为malloc函数底层也映射文件内存。后来一直想不通。实际上,mmap函数再malloc底层实现中采用了匿名映射(就是这个匿名映射,我之前一直概念不清)。先说下malloc调用mmap一般的形式://原型//mmap(v原创 2017-02-27 22:47:35 · 3224 阅读 · 2 评论 -
Linux内存管理复习总结
首先来看一张图:这张图就是Linux分配内存的大致流程。下面我来总结一下。分页首先Linux是基于内存管理采用分页机制,内核代码中它将所有段基址都设置为0,Linux采用这样的方法直接避过了分段机制。仅仅用分段来控制用户态和用户态的访问权限。内核内存分配内核对于大块内存的分配基于伙伴算法,用来解决外部碎片的问题。伙伴算法最低分配的单位是一页。在物理内存的每个Zone中都有一个free_area[]数原创 2017-02-28 12:20:52 · 1116 阅读 · 0 评论 -
slub机制彻底图解分析
内核管理页面使用了2个算法:伙伴算法和slub算法,伙伴算法以页为单位管理内存,但在大多数情况下,程序需要的并不是一整页,而是几个、几十个字节的小内存。于是需要另外一套系统来完成对小内存的管理,这就是slub系统。slub系统运行在伙伴系统之上,为内核提供小内存管理的功能。 slub把内存分组管理,每个组分别包含2^3、2^4、...2^11个字节,在4K页大小的默认情况下,另外转载 2017-01-27 08:57:17 · 7439 阅读 · 1 评论 -
linux slub分配器浅析
在《linux内存管理浅析》中提到内核管理自己使用的内存时,使用了SLAB对象池。SLAB确实是比较复杂,所以一直以来都没有深入看一看。不过现在,linux内核中,SLAB已经被它的简化版--SLUB所代替。最近抽时间看了一下SLUB的代码,略记一些自己的理解。尽管SLUB是在内核里面实现的,用户态的对象池其实也可以借鉴这样的做法。SLUB的总体思想还是跟SLAB类似,对象池里面的转载 2017-01-29 16:31:01 · 892 阅读 · 0 评论 -
多核心Linux内核路径优化的不二法门之-slab与伙伴系统
作为这个系列的第一篇,我先来描述一下slab系统。因为近些天有和同事,朋友讨论过这个主题,而且觉得这个主题还算比较典型,所以就作为第一篇了。其实按照操作系统理论来讲,进程管理应该更加重要些,按照我自己的兴趣来讲,IO管理以及TCP/IP协议栈会更加有分量,关于这些内容,我会陆续给出。 Linux内核的slab来自一种很简单的思想,即事先准备好一些会频繁分配,释放的数据结构。然而转载 2017-01-29 16:32:33 · 493 阅读 · 0 评论 -
slub机制伪总结
slub机制源码分析地址:Linux Slub分配器(一)–概述,我自己就不一一分析了。先占个坑,几个月后再做个精炼的总结。原创 2017-01-29 16:38:55 · 502 阅读 · 0 评论 -
Linux堆内存管理深入分析
Linux堆内存管理深入分析https://jaq.alibaba.com/community/art/show?articleid=315http://www.cnblogs.com/alisecurity/p/5520847.html0 前言近年来,漏洞挖掘越来越火,各种漏洞挖掘、利用的分析文章层出不穷。从大方向来看,主要有基于栈转载 2017-02-02 13:34:59 · 1385 阅读 · 0 评论 -
Linux 2.6 中的页面回收与反向映射
引用网址:http://rritw.com/a/caozuoxitong/Linux/20110617/89155.html为什么要进行页面回收操作系统管理内存中的物理页面,同时也担任着内存分配的职责。应用程序可以通过内存分配函数向操作系统申请物理页面;在使用完这些物理页面之后,应用程序可以通过相应的内存释放函数释放这些物理页面。但是,对于内存中的某些物理页面来说,页面的使用者转载 2017-02-26 11:38:47 · 440 阅读 · 0 评论 -
slab源码分析--销毁函数
这次来谈一下slab机制中的所有销毁函数。释放对象注意释放对象仅仅是回收回slab,并不会将内存还给伙伴系统。回收对象时有以下原则:本地高速缓存的空间还可以容纳空闲对象,则直接将对象放回本地高速缓存。本地高速缓存的空间已满,则按batchcount的值将对象从本地高速缓存转移到本地共享缓存shared中,如果没有设置本地共享缓存,那么就转移到slab三链中。转移时基于先进先出原则的,也就是转移e原创 2017-01-16 15:45:30 · 1631 阅读 · 1 评论 -
Linux-2.6 所有版本内核源码下载
在这里分享给大家一个链接,链接里面有Linux-2.6所有版本的下载链接,可以复制到迅雷上面一件下载,2.6版本还是比较适合用来剖析的,往上就有点难了。 下载地址:https://www.kernel.org/pub/linux/kernel/v2.6/ 拿走 :)原创 2017-01-11 16:18:11 · 17166 阅读 · 1 评论 -
slab源码分析--kmalloc函数分析
这次来说一个关键函数,kmalloc()函数。 函数原型#include Linux/slab.h> void *kmalloc(size_t size, int flags); size是要分配内存的大小,不过内核会对大小进行适配,比如取32,64等等,是和缓存行等体系结构有关系的,总之可能会比你要申请的内存大一些。 flags是与伙伴系统交互的标记,虽说kmalloc()是从slab分配原创 2017-01-16 14:49:37 · 1961 阅读 · 0 评论 -
Linux进程调度内核实现分析
进程选择 使用红黑树存放进程队列,以 vruntime 为键值,每次选择 vruntime 最小的进程。这里有用到了一个 trick,使用 leftmost 缓存了红黑树的最左叶子节点,提高效率(STL也这么干了)。调度器入口 schedule() 函数调用 pick_next_task() 函数,按照优先级从大到小一次检查每一个调度类,从最高优先级调度类中,选择最高优先级进原创 2017-01-08 11:11:55 · 912 阅读 · 0 评论 -
中断下半部的三种机制
中断下半部的处理实现下半部中断的三种机制软中断Tasklet工作队列各种机制的比较 之前提到过,之所以中断会分成上下两部分,Linux 的上半部就是中断处理程序,下半部采用三种机制来实现,这样分两部执行的策略有利于缩短响应硬件的时限。 中断下半部的处理 对于一个中断,如何划分出上下两部分呢?哪些处理放在上半步,哪些放在下半部? 这里有一些经验可供借鉴:如果一个任务对时间十分原创 2017-01-09 01:08:45 · 6731 阅读 · 0 评论 -
内核中各种同步机制(自旋锁大内核锁顺序锁等)
原子操作自旋锁读写自旋锁信号量读写信号量互斥量完成变量大内核锁顺序锁禁止抢占顺序和屏障如何选择 原子操作 原子操作是由编译器来保证的,保证一个线程对数据的操作不会被其他线程打断。 自旋锁 原子操作只能用于临界区只有一个变量的情况,实际应用中,临界区的情况要复杂的多。对于复杂的临界区,Linux 内核提供了多种方法,自旋锁就是其一。自旋锁的特点就是当一个线程获取了锁之原创 2017-01-09 01:13:35 · 3669 阅读 · 1 评论 -
Linux中断机制分析
目录目录中断的类型中断的上半部和下半部中断相关函数注册中断的函数释放中断的函数中断程序的声明中断处理机制 中断的类型 中断一般分为异步中断(一般由硬件引起)和同步中断(一般由处理器本身引起)。 异步中断:CPU 处理中断的时间过长,所以先将硬件复位,使硬件可以继续做自己的工作。然后再适当时候处理中断请求中耗时的部分。举个例子:网卡的工作原理网卡收到数据包后,向 CPU 发转载 2017-01-08 16:27:00 · 1053 阅读 · 0 评论 -
Linux进程管理、进程创建、线程实现、僵尸进程
目录目录概述进程描述符及任务结构分配进程描述符进程描述符的存放进程状态进程家族树进程创建写时拷贝forkvfork线程实现创建线程内核线程进程终结删除进程描述符如何处理僵尸进程 概述 在 Linux 系统中,通过复制一个现有的进程来创建一个全新的进程。调用 fork() 的进程称为父进程,新产生的进程称为子进程。调用结束时,在返回点这个相同位置上,父进程恢复执行,原创 2017-01-08 10:08:56 · 672 阅读 · 0 评论 -
slab源码分析--主要数据结构分析
基本原理管理机构图示kmem_cache 缓冲区slab 结构体 基本原理Linux 保护模式下,内存管理采用分页机制,由伙伴系统负责,分配内存的单位是页。在伙伴系统之上,Linux 又增加了 slab 机制,其工作是针对一些经常分配并释放的对象,如 task_struct 结构体等,这种对象的大小一般比较小,如果直接采用伙伴系统来进行分配和释放,不仅会造成大量的内部碎片,而且处理速度也太慢。原创 2017-01-13 22:36:32 · 1206 阅读 · 0 评论 -
slab源码分析--从slab初始化说起
上次说了 slab 的主要数据结构,这次从初始化开始进行源码剖析。   slab 的初始化,当然是从内核启动就开始了。内核启动的 start_kernel() 函数://内核的启动程序啊:)asmlinkage void __init start_kernel(void){ ... mem_init(); //内存相关初始化 kmem_cache原创 2017-01-14 14:24:44 · 2469 阅读 · 0 评论 -
slab源码分析--缓存器的创建
这篇博客来剖析一下 kmem_cache_create() 函数,就是所谓合成缓存器函数。这个函数通常是在内核初始化时进行的,或者在首次加载模块时进行的。struct kmem_cache *kmem_cache_create(const char* name, size_t size, size_t align, unsigned long flags, void (*ctor)(voi原创 2017-01-15 21:32:58 · 901 阅读 · 0 评论 -
slab源码分析--setup_cpu_cache函数
之前剖析过了 slab 的初始化,以及 kmem_cache_create() 函数,留下了一个 setup_cpu_cache() 函数没有处理,今天来分析一下。说明:本文缓存器指 kmem_cache 结构,slab 三链即 kmem_list3,又称 slab 分配器。setup_cpu_cache() 函数和 slab 分配器的初始化状态是息息相关的。我们知道,slab 分配器初始化会经历以原创 2017-01-16 13:56:17 · 1752 阅读 · 1 评论 -
fork,你拿什么证明你的写时拷贝(COW)
前段时间在学习内核的进程管理方面的东西,看了进程创建和进程调度的代码,想写个大而全的东西,即有内核代码分析,又有一些实验在效果上证明内核的代码。 但是这篇文章很难产,感觉自己还是驾驭不了这个宏大的主题。 好久没写文章了,今天就放弃这个想法,写一个简单的东西。 我们都知道fork创建进程的时候,并没有真正的copy内存,因为我们知道,对于fork来讲,有一个很讨厌的东西叫转载 2017-07-25 08:53:14 · 975 阅读 · 0 评论