精华内容
下载资源
问答
  • Linux 4.4.0 内核源码分析 TCP实现 - Linux4.40版本的TCP/IP协议栈源码分析
  • Linux内核源码分析代码详解 链接:https://pan.baidu.com/s/1MxbVZAKtDzW_ig1Njvb5Vw 提取码:ho3a 链接无效了的话请加Q群:832218493免费领取! 1、进程管理专题 1.1进程原理 进程生命周期 task_struct结构 进程...

    Linux内核源码分析代码详解

    链接:https://pan.baidu.com/s/1MxbVZAKtDzW_ig1Njvb5Vw
    提取码:ho3a
    链接无效了的话请加Q群:832218493免费领取!

    免费学习地址:https://ke.qq.com/course/417774?flowToken=1017067

    在这里插入图片描述

    本系列文章主要是近期针对Linux进程调度源码进行阅读与分析后的经验总结,分析过程中可能结合部分Linux网络编程的相关知识以便于理解,加深对Linux进程调度的理解和知识分享。

    本系列文章主要结合Linux3.10.1内核版本源代码以及部分Linux2.4内核版本源代码进行分析,主要涉及fork(),vfork(),clone()应用层函数的底层实现原理,schedule调度器的实现以及CFS完全公平调度策略算法的分析。

    1、进程管理专题

    1.1进程原理

    	进程生命周期
    	task_struct结构
    	进程优先级
    	进程系统调用
    

    1.2进程调度机制

    	调度器实现schedule()
    	完全公平调度类CFS
    	实时调度类原理
    	多核模式调度SMP
    

    1.3进程竞争机制

    	RCU机制原理
    	内存优化与屏障
    	大内核锁
    	per_CPU计数器
    

    1.4进程系统调用

    	写时复制原理
    	进程内存布局
    	进程堆栈管理
    	系统调用实现流程
    

    2.内存管理专题

    2.1内存原理

    	(N)UMA模型组织
    	页表原理
    	处理器高速缓存
    	TLB工作原理
    

    2.2物理内存

    	伴伙算法
    	slab/slub/slob分配器
    	内存映射
    	分配器原理
    	不连续页原理
    

    2.3虚拟内存

    	进程内存映射
    	进程堆栈管理
    	用户空间缺页异常
    	内核空间与用户空间
    

    2.4内存系统调用

    	kmalloc/vmaloc
    	BRK
    	内存池机制
    	内存优化
    

    3.设备驱动专题

    3.1设备子系统原理

    	字符设备子系统
    	块设备子系统
    	网络适配器子系统
    	I/O原理
    

    3.2字符设备驱动

    	file_operations原理
    	系统调用流程
    	ioctl流程
    	请求中断
    

    3.3块设备驱动

    	资源管理
    	I/O调度
    	BIO结构原理
    	PCI总线原理
    

    3.4网卡设备驱动

    	net_device/net_device_ops
    	sk_buff原理
    	网卡数据中断
    	网络适配器映射
    

    3.5内核模块架构

    	模块添加与删除
    	自动化与热插拔
    	主从设备号
    	版本控制
    

    4.网络协议专题

    4.1网络系统架构

    	接收缓冲区
    	发送缓冲区
    	netfilter
    	iptables
    

    4.2网络协议栈

    	TCP/UDP
    	TCP控制块
    	IP协议
    	netlink机制
    

    4.3系统API

    	POSIX网络API
    	epoll实现原理
    	socket初始化
    	网络系统参数设置
    

    5.内核组件专题

    5.1时间管理

    	通用时间子系统
    	高分辨率定时器
    	动态时钟结构
    	定时器系统调用实现
    

    6.2系统缓存

    	页缓存实现
    	块缓存实现
    

    7.3数据同步

    	数据同步原理
    	inode同步与拥塞
    	强制回写与完全同步
    

    8.文件系统专题

    8.1虚拟文件系统VFS

    	通用文件模型
    	VSF结构 
    	文件操作系统调用
    	file/inode原理
    

    8.2无存储文件系统

    	proc文件系统
    		文件系统数据结构
    		管理/proc数据项
    		系统控制机制
    	sysfs文件分析
    		sysfs数据结构
    		装载文件系统
    		文件目录 操作
    		向sysfs增加数据
    

    8.3磁盘文件系统

    	Ext2文件系统
    	Ext3文件系统
    	Ext4文件系统
    

    8.4用户态文件系统

    	FUSE使用场景
    	FUSE原理
    	FUSE实现 
    	用户态文件接口实现
    

    9.内核项目实战专题

    1、手把手实现进程间通信
    2、网络适合器实现
    3、无存储文件系统实现
    4、为内核添加自己系统调用
    5、添加进程调度器
    6、用户态文件系统实现
    7、为内核防火墙做贡献之iptables
    8、用slab实现内存池
    9、内核定制化系统
    10、向VFS添加自定义文件系统
    

    10.Linux内核学习参考书籍

    1、《深入理解LINUX内核》 第三版 [美] 博韦等著()
    2、《Linux设备驱动开发详解》 宋宝华 编著
    3、《Linux内核设计与实现》 原书第3版 拉芙 (RobertLove) 著
    4、《深入理解LINUX网络内幕》 [意] Benvenuti 著
    5、《Linux设备驱动程序》 [美] 科波特(Corbet J.) 著
    
    展开全文
  • 如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径。我们都知道,想成为优秀的程序员,需要大量的实践和代码的编写。编程固然重要,但是往往只编程的人很容易把自己局限在自己的知识领域内。如果要...
  • ARM Linux内核源码剖析.pdfARM Linux内核源码剖析.pdfARM Linux内核源码剖析.pdfARM Linux内核源码剖析.pdf 完整书签
  • 内存管理(Linux内核源码分析

    万次阅读 2017-07-12 10:03:53
    背景本篇博客试图通过linux内核源码分析linux的内存管理机制,并且对比内核提供的几个分配内存的接口函数。然后聊下slab层的用法以及接口函数。内核分配内存与用户态分配内存内核分配内存与用户态分配内存显然是不同...

    背景

    本篇博客试图通过linux内核源码分析linux的内存管理机制,并且对比内核提供的几个分配内存的接口函数。然后聊下slab层的用法以及接口函数。

    内核分配内存与用户态分配内存

    内核分配内存与用户态分配内存显然是不同的,内核不可以像用户态那样奢侈的使用内存,内核使用内存一定是谨小慎微的。并且,在用户态如果出现内存溢出因为有内存保护机制,可能只是一个报错或警告,而在内核态若出现内存溢出后果就会严重的多(毕竟再没有管理者了)。

    我们知道处理器处理数据的基本单位是字。而内核把页作为内存管理的基本单位。那么,页在内存中是如何描述的?
    内核用struct page结构体表示系统中的每一个物理页:
    这里写图片描述
    flags存放页的状态,如该页是不是脏页。
    _count域表示该页的使用计数,如果该页未被使用,就可以在新的分配中使用它。
    要注意的是,page结构体描述的是物理页而非逻辑页,描述的是内存页的信息而不是页中数据。
    实际上每个物理页面都由一个page结构体来描述,有的人可能会惊讶说那这得需要多少内存呢?我们可以来算一下,若一个struct page占用40字节内存,一个页有8KB,内存大小为4G的话,共有524288个页面,需要刚好20MB的大小来存放结构体。这相对于4G的内存根本九牛一毛。

    有些页是有特定用途的。比如内存中有些页是专门用于DMA的。
    内核使用区的概念将具有相似特性的页进行分组。区是一种逻辑上的分组的概念,而没有物理上的意义。
    区的实际使用和分布是与体系结构相关的。在x86体系结构中主要分为3个区:ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM。
    ZONE_DMA区中的页用来进行DMA时使用。ZONE_HIGHMEM是高端内存,其中的页不能永久的映射到内核地址空间,也就是说,没有虚拟地址。剩余的内存就属于ZONE_NORMAL区。
    我们可以看一下描述区的结构体struct zone(在linux/mmzone.h中定义)。
    这里写图片描述
    这个结构体比较长,我只截取了一部分出来。
    实际上不是所有的体系结构都定义了全部区,有些64位的体系结构,比如Intel的x86-64体系结构可以映射和处理64位的内存空间,所以其没有ZONE_HIGHMEM区。而有些体系结构中的所有地址都可用于DMA,所以这些体系结构就没有ZONE_DMA区。

    内核中内存分配接口

    我们现在已经大体了解了内核中的页与区的概念及描述。接下来我们就可以来看看内核中有哪些内存分配与释放的接口。在内核中,我们正是通过这些接口来分配与释放内存的。首先我们来看看以页为单位进行分配的接口函数。

    获得页与释放页

    获得页

    获得页使用的接口是alloc_pages函数,我们来看下它的源码(位于linux/gfp.h中)
    这里写图片描述
    可以看到,该函数返回值是指向page结构体的指针,参数gfp_mask是一个标志,简单来讲就是获得页所使用的行为方式。order参数规定分配多少页面,该函数分配2的order次方个连续的物理页面。返回的指针指向的是第一page页面。
    获得页的方式不只一种,我们还可以使用__get_free_pages函数来获得页,该函数和alloc_pages的参数一样,然而它会返回一个虚拟地址。源码如下:
    这里写图片描述
    可以看到,这个函数其实也是调用了alloc_pages函数,只不过在获得了struct page结构体后使用page_address函数获得了虚拟地址。
    另外还有alloc_page函数与__get_free_page函数,都是获得一个页,其实就是将前面两个函数的order分别置为了0而已。这里不赘述了。

    我们在使用这些接口获取页的时候可能会面对一个问题,我们获得的这些页若是给用户态用,虽然这些页中的数据都是随机产生的垃圾数据,不过,虽然概率很低,但是也有可能会包含某些敏感信息。所以,更谨慎些,我们可以将获得的页都填充为0。这会用到get_zeroed_page函数。看下它的源码:
    这里写图片描述
    这个函数也用到了__get_free_pages函数。只是加了一种叫做__GFP_ZERO的gfp_mask方式。所以,这些获得页的函数最终调用的都是alloc_pages函数。alloc_pages函数是获得页的核心函数。

    释放页

    当我们不再需要某些页时可以使用下面的函数释放它们:
    __free_pages(struct page *page, unsigned int order)
    __free_page
    free_pages
    free_page(unsigned long addr, unsigned int order)
    这些接口都在linux/gfp.h中。
    释放页的时候一定要小心谨慎,内核中操作不同于在用户态,若是将地址写错,或是order写错,那么都可能会导致系统的崩溃。若是在用户态进行非法操作,内核作为管理者还会阻止并发出警告,而内核是完全信赖自己的,若是在内核态中有非法操作,那么内核可能会挂掉的。

    kmalloc与vmalloc

    前面讲的那些接口都是以页为单位进行内存分配与释放的。而在实际中内核需要的内存不一定是整个页,可能只是以字节为单位的一片区域。这两个函数就是实现这样的目的。不同之处在于,kmalloc分配的是虚拟地址连续,物理地址也连续的一片区域,vmalloc分配的是虚拟地址连续,物理地址不一定连续的一片区域。这里依然需要特别注意的就是使用释放内存的函数kfree与vfree时一定要注意准确释放,否则会发生不可预测的严重后果。

    slab层

    分配和释放数据结构是内核中的基本操作。有些多次会用到的数据结构如果频繁分配内存必然导致效率低下。slab层就是用于解决频繁分配和释放数据结构的问题。为便于理解slab层的层次结构,请看下图
    这里写图片描述
    简单的说,物理内存中有多个高速缓存,每个高速缓存都是一个结构体类型,一个高速缓存中会有一个或多个slab,slab通常为一页,其中存放着数据结构类型的实例化对象。
    分配高速缓存的接口是struct kmem_cache kmem_cache_create (const char *name, size_t size, size_t align,unsigned long flags, void (*ctor)(void ))。
    它返回的是kmem_cache结构体。第一个参数是缓存的名字,第二个参数是高速缓存中每个对象的大小,第三个参数是slab内第一个对象的偏移量。剩下的就不细说。
    总之,这个接口函数为一个结构体分配了高速缓存,那么高速缓存有了,是不是就要为缓存中分配实例化的对象呢?这个接口是
    void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)
    参数是kmem_cache结构体,也就是分配好的高速缓存,flags是标志位。
    抽象的介绍看着不直观, 我们看个具体的例子。之前我写过一个关于jbd2日志系统的博客,介绍过jbd2的模块初始化过程。其中就提到过jbd2在进行模块初始化的时候是会创建几个高速缓冲区的。如下:
    这里写图片描述
    我们看看第一个创建缓冲区的函数。
    这里写图片描述
    首先是断言缓冲区一定为空的。然后用kmem_cache_create创建了两个缓冲区。两个高速缓冲区就这么创建好了。看下图
    这里写图片描述
    这里用kmem_cache结构体,也就是jbd2_revoke_record_cache高速缓存实例化了一个对象。

    总结

    内存管理的linux内核源码我只分析了一小部分,主要是总结了一下内核分配与回收内存的接口函数及其用法。

    展开全文
  • Linux内核源码分析之系统初始化.pdf
  • 基于代码分析linux内核,极大程度剖析其原理。配上简单易懂的注释,使人阅读起来轻轻松松!
  • linux内核源码分析

    2012-09-25 10:36:53
    结合源码进行内核分析的电子书,很不错的。
  • 经历过内核源码阅读的小伙伴,相信你在最初面对如此庞大的内核源码时,一定会有种“面对茫茫大海,无从下手”的感觉,即便幸运的找到了逻辑入口,却在繁琐的函数跳转中晕头转向,无法把握住整个控制路径上的重难点。...
     
    
    原创文章,转载请注明: 转载自 SunliyMonkey技术博客
    本文链接地址: Linux内核源码分析之文件系统(1) -- 三思而后行

    URL: http://blog.csdn.net/sunliymonkey/article/details/48657757

    最近开始研究Linux文件系统,希望通过阅读源码,了解文件系统的设计要素、控制逻辑,最终自己能够实现出一个简易的文件系统。
        
    经历过内核源码阅读的小伙伴,相信你在最初面对如此庞大的内核源码时,一定会有种“面对茫茫大海,无从下手”的感觉,即便幸运的找到了逻辑入口,却在繁琐的函数跳转中晕头转向,无法把握住整个控制路径上的重难点。代码阅读之后,无法上升到整体设计,提炼出实现者的出发点,对代码逻辑,常常感觉迷惑,无法洞悉代码背后的原理。

    鉴于此,在研究该部分代码前,我从实现的角度出发,根据文件系统的功能往下进行推敲,提炼出文件系统的重难点,有方向性地阅读代码、印证想法、解决疑问。

    挖掘出技术难点,带着问题有方向性的阅读代码,这样能够做到事半功倍,同时对整体结构的理解,更加透彻

    1. 文件系统是什么                                                           


    首先,我们先来考虑下“文件系统是什么?”,在早期操作系统还未出现文件系统这个概念的时候,如果程序需要存储数据,那么它必须自己实现文件存储、文件管理的代码,程序本身需要与硬盘驱动器打交道。最令人头痛的是,你存储文件的地方可能被其他程序覆盖,导致数据的丢失。


    为了解决这个“各自为营,重复创造”的现象,大家提出采用统一的中间层,管理应用程序与硬盘之间的文件交互。这样做的好处就是:
    • 应用程序不再关注文件的存储与管理,能够专注于自身的应用逻辑控制
    • 统一的中间层知道所有文件存储的信息,能够避免文件覆盖现象的出现,进行更有效的数据管理
    总结来说:
        文件系统是应用程序与块设备(磁盘等)之间的桥梁,是对文件进行统一管理的中间层。          
             对上: 向上层用户提供读写文件的操作接口
                                             
             对下: 将文件在磁盘上进行存储及有效的管理                                        


    2. 文件系统涉及什么                                                        


    2.1 文件系统挂载                                                                                 


    在Linux环境下,磁盘作为一种特殊的文件(Linux系统中一切皆文件),允许用户进行读写操作,但是如果我们想要正常使用,在其上创建文件夹,文件等,则必须经过以下几道工序:

    • 采用某种文件系统格式化磁盘

          mkfs -t ext3 /dev/sdb              

    • 为磁盘创建挂载点

          mkdir /sdb_dir                     

    • 挂载磁盘到指定目录下

          mount /dev/sdb /sdb_dir           

    • 修改/ext/fstab配置文件,设置开机自启

          /dev/sdb /sdb_dir ext3 defaults 0 0


    我们可以将上面的步骤大体分为两步:

    (1)磁盘格式化  : 写入超块信息,按照特有的数据布局,对磁盘进行格式化

    (2)文件目录入口: 在整个系统文件目录上,为其寻一入口,以后由此进入


    2.2  技术点初总结                                                                                  

     

    从上面的步骤中,我们可以发现磁盘无法直接使用,首先需要经过某种文件系统的格式化,而这个格式化过程,包括注册超块信息,将磁盘划分成数据块进行管理,也就是说:文件是由多个数据块联接在一起进行表示。从这里出发,我们来思考一下,文件系统可能涉及哪些技术点:


      1. 文件存储方式
    • 应用程序直接打交道的是文件,文件是采用何种方式持久化在磁盘上呢?
    • 如果采用数据分块的方式,数据块如何有效组织在一起,表示成一个文件?
      2. 读、写、定位的实现
    • 如何快速定位文件中一个数据块的位置?比如要查看文件某个位置的数据。
      3. 元数据的管理
    • 元数据有哪些?目录树,空闲块的维护?
      4. 数据一致性保证
    • 内存的数据与硬盘上的数据如何来往? 何时将内存中的数据固化到磁盘,以防断电等造成的数据丢失。
    上面我是想到啥,说到啥,整体感觉,有些凌乱,可能会遗漏某些技术点。接下来,从文件系统的基本功能“读写文件”出发,我们来尝试挖掘出一些有用的技术点。

    2.3 读写流程分析                                                                              

    在这里,我们尝试分析下读写逻辑,整理其控制路径,当然这里只是一个粗糙的版本,毕竟此时我们还未读代码,只是猜想其过程,同时暂且不讨论Page Cache,均采用Direct IO的方式:
        
           

    (1)根据文件路径,查找目录树,获得当前文件目录项

    (2)通过文件目录项,可以获得该文件起始块,文件大小,权限等信息

    (3)通过文件起始块,文件偏移,以某种方式,得到目标数据块位置 (这里需要研读下如何快速定位某数据块)

    (4)读整个目标数据块,数据缓存于内存当中  (是否将整个目标数据块读出来,这里不确定,有待源码印证)

    (5)拷贝数据到读请求的buffer当中



            

    (1)根据文件路径,查找目录树,获得当前文件目录项

    (2)通过文件目录项,可以获得该文件起始块,文件大小,权限等信息

    (3)通过文件大小,如果发现文件偏移超过文件大小,则通过“空闲块管理”获取新的数据块位置。否则,通过文件起始块,文件偏移,以某种方式,得到目标数据块位置;

    (4)将数据buffer中的数据写入对应磁盘位置(这里可能使用写buffer,不知如何实现的) 



    2.3 技术点总结                                                                                     
      
    通过上面的控制逻辑推敲,我们对文件系统想必有更加清晰的认识了,这次,我们再来总结总结,可能涉及的知识点:


    正常读写流程
       

      应用读写请求(文件描述符,位置,长度,数据buffer)

      读:文件系统如何填充到buffer当中,在内核态到用户态buffer,是否会有一次拷贝

      写:将buffer当中的数据以IO的方式,发送到下层
     
        目标:
        1. 读写经过的路径:系统调用 --> 文件系统 --> 下层调用接口
        2. 元数据之间的交互:目录树,空闲块的使用
        3. buffer中数据的来龙去脉,能观察到经过了多少次拷贝

    磁盘数据固化
    • 数据分布:超级块?目录树?空闲块?数据块? 这些如何记录在案   
    • 数据固化:数据一致性保证,目录树这些在内存中的元数据,何时固化到磁盘上?采用什么方式,保证数据在突然断电的情况下,不会丢失

    目录树

      查找文件的入口地址,希望维护快,查找快

    •   数据结构:目录树采用何种数据结构进行维护:BTree?红黑树?
    •   磁盘固化:关机之后, 如何在硬盘上进行存储?
    •   加载方式:运行时,是将所有的目录信息均加载到内存当中,还是按需加载,缓存频繁的目录数据块?

    空闲块表

       记录哪些数据块还未被使用            

    •   数据结构:采用何种数据结构进行维护:Bitmap?BTree?红黑树?
            猜测:构造排序二叉树(红黑树啥的),维护关键字<空闲长度,位置>,这样就能快速找到满足长度的一段联系空闲块??
    •   磁盘固化:关机之后, 如何在硬盘上进行存储?
                                                                               

    通过上面这些,让我们清楚认识哪些问题需要去注意,能够有方向性的去阅读代码。小伙伴们,让我们带着这些问题,去探索,阅读代码吧!!

    当然每个人的关注点可能不一样,在此分享自己源码阅读的方式,希望抛砖引玉,大家相互交流。


    展开全文
  • Linux内核源码分析.rar

    2009-06-03 15:49:06
    Linux内核源码分析.rar Linux内核源码分析.rar Linux内核源码分析.rar
  • Linux内核源码0.11版本

    2017-10-24 16:13:41
    完整的内核源码可以供个人学习Linux内核作为必不可少的资料使用
  • Linux 4.4.0内核源码分析——TCP实现 https://github.com/fzyz999/Analysis_TCP_in_Linux
    展开全文
  • Linux内核源码剖析 TCP-IP 实现(上下册)
  • Linux内核源码分析(0.11版本)

    热门讨论 2009-09-01 11:29:01
    最近因为课程的关系,学到操作系统原理了,忍不住想要...2.Linux内核源码分析 3.linux-0.00-041217.tar.gz 4.linux-0.11-040327-rh9.tar.gz 说明:最后两个都是Linux早期版本源码包,估计已经很难找到了(反正我是没找到)
  • Linux内核源码分析之系统初Linux内核源码分析之系统初始化始化,Linux内核源码分析之系统初始化
  • 内核版本 3.4.39 实现一个IPv6报文转发功能的时候,需要对IPv6报文的扩展选项进行处理,还是直接参考下内核的处理比较稳妥,整理了IPv6报文的内核处理流程,如下图: ...
  • Linux内核情景分析

    2018-11-09 16:45:58
    LINUX内核源代码情景分析》采取类似于英语教学中行之有效的情景会话的教学方法,全面深入地剖析了Linux最新版本核心源代码,并对Linux核心的独特优点和需要进一步改进的问题作了精辟的评述。
  • 深入分析Linux内核源码
  • Linux内核源码阅读以及工具详解

    千次阅读 2020-02-02 12:08:39
    接上篇Linux内核源码下载方法 这篇总结了如何利用source insight对Linux内核代码进行阅读和学习(资料来源于网络) 随着linux的逐步普及,现在有不少人对于Linux的安装及设置已经比较熟悉了。与Linux 的蓬勃发展...
  • linux内核源码剖析 TCPIP实现上下册
  • linux内核源码,linux3版本内核源码,编写内核驱动参考的源代码,分析研究内核源码框架必备的工具
  • ARM Linux内核源码剖析_ PDF电子书下载 带书签目录 完整版
  • 1.4 分析Linux内核的意义 1.4.1 开发适合自己的操作系统 1.4.2 开发高水平软件 1.4.3 有助于计算机科学的教学和科研 1.5 Linux内核结构 1.5.1 Linux内核在整个操系统中的位置 1.5.2 Linux内核的作用 ...
  • linux内核源码分析资料,感兴趣的可以看看,研究一下。
  • Linux内核源代码分析

    2014-11-30 15:33:32
    本书写法独特,论述精辟,不回避代码分析中的难点,可以作为操作系统高级课程的教材,也可以作为计算机软件专业和相关专业大学本科高年级学生和研究生深入学习操作系统以至软件核心技术的重要参考书。同时,还可作为...
  • ARM Linux内核源码剖析(带书签目录完整版) 加q2456102575

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,848
精华内容 27,539
关键字:

linux内核源码分析

linux 订阅