随笔分类 -  linux 内核源码分析

摘要:2017-03-02 在Linux下的物理内存管理中,对SLAB机制大致做了介绍,对SLAB管理结构对象也做了介绍,但是对于小内存块的分配没有介绍,本节重点介绍下slab对小内存块的管理。 内核中使用全局的kmem_cache数组kmalloc_caches组织不同大小的缓存块,每个缓存块由一个km 阅读全文
posted @ 2017-03-21 10:25 jack.chen 阅读(2658) 评论(0) 推荐(0)
摘要:最近看各种上下文,发现和ThreadInfo中的preemption字段密切,于是便调查了下。 看下Linux源码中的注释: /* * We put the hardirq and softirq counter into the preemption * counter. The bitmask 阅读全文
posted @ 2017-03-19 10:30 jack.chen 阅读(2148) 评论(0) 推荐(0)
摘要:2017-02-23 一、伙伴系统 LInux下用伙伴系统管理物理内存页,伙伴系统得益于其良好的算法,一定程度上可以避免外部碎片为何这么说?先回顾下Linux下虚拟地址空间的分布。 在X86架构下,系统有4GB的虚拟地址空间,其中0-3GB作为用户空间,而3-4GB是系统地址空间。linux系统系统 阅读全文
posted @ 2017-03-03 19:01 jack.chen 阅读(7187) 评论(0) 推荐(0)
摘要:2017-03-03 很遗憾之前在介绍进程调度的文章中,虽然涉及到了内核抢占,但是却没有对其进行深入介绍,今天就稍微总结下内核抢占。 内核抢占在一定程度上减少了对某种事件的响应延迟,这也是内核抢占被引入的目的。之前的内核中,除了显示调用系统调度器的某些点,内核其他地方是不允许中重新调度的,如果内核在 阅读全文
posted @ 2017-03-03 18:11 jack.chen 阅读(3647) 评论(0) 推荐(0)
摘要:2016-11-22 前面在看软中断的时候,牵扯到不少进程调度的知识,这方面自己确实一直不怎么了解,就趁这个机会好好学习下。 现代的操作系统都是多任务的操作系统,尽管随着科技的发展,硬件的处理器核心越来越多,但是仍然不能保证一个进程对应一个核心,这就势必需要一个管理单元,负责调度进程,由管理单元来决 阅读全文
posted @ 2016-11-28 20:13 jack.chen 阅读(11652) 评论(0) 推荐(0)
摘要:2016-11-02 中断这个特性相比大家都不会陌生,稍微懂点操作系统知识的人都可以说到一二。但是要真正把中断描述清楚,以及LInux中和windows中的实现方式,这可能还是有点难度的。今天笔者就想彻头彻尾的把中断给详细分析下。 说到中断还不得不从现代操作系统的特性说起,无论是桌面PC操作系统还是 阅读全文
posted @ 2016-11-24 16:19 jack.chen 阅读(32750) 评论(0) 推荐(3)
摘要:2016-11-18 记得之前看windows内核原理与实现的时候,在内存管理部分,看到涉及到PAE模式的部分,提到此模式下可以让系统在虚拟地址还是32位宽的情况下,支持64GB的物理内存或者更多。当时就没怎么想明白,今天突然想起就结合intel手册仔细研读了一番,但是手册所讲主要是其寻址过程以及各 阅读全文
posted @ 2016-11-18 16:32 jack.chen 阅读(6626) 评论(0) 推荐(1)
摘要:2016-11-08 在虚拟化环境下,intel CPU在处理器级别加入了对内存虚拟化的支持。即扩展页表EPT,而AMD也有类似的成为NPT。在此之前,内存虚拟化使用的一个重要技术为影子页表。 背景: 在虚拟化环境下,虚拟机使用的是客户机虚拟地址GVA,而其本身页表机制只能把客户机的虚拟地址转换成客 阅读全文
posted @ 2016-11-16 19:55 jack.chen 阅读(21088) 评论(0) 推荐(0)
摘要:2016-11-08 前段时间大致整理了下virtIO后端驱动的工作模式以及原理,今天就从前端驱动的角度描述下目前Linux内核代码中的virtIO驱动是如何配合后端进行工作的。 注:本节代码参考Linux 内核3.11.1代码 virtIO驱动从架构上来讲可以分为两部分,一个是其作为PCI设备本身 阅读全文
posted @ 2016-11-15 15:48 jack.chen 阅读(9250) 评论(2) 推荐(0)
摘要:2016-11-15 本来这是在前端驱动后期分析的,但是这部分内容比较多,且分析了后端notify前端的机制,所以还是单独拿出一节分析比较好! 还是拿网络驱动部分做案例,网络驱动部分有两个队列,(忽略控制队列):接收队列和发送队列;每个队列都对应一个virtqueue,两个队列之间是互不影响的。 前 阅读全文
posted @ 2016-11-15 15:43 jack.chen 阅读(15229) 评论(6) 推荐(2)
摘要:2016-10-08 virtIO是一种半虚拟化驱动,广泛用于在XEN平台和KVM虚拟化平台,用于提高客户机IO的效率,事实证明,virtIO极大的提高了VM IO 效率,配备virtIO前后端驱动的情况下,客户机IO效率基本达到和宿主机一样的水平。咱们本次的分析以qemu-kvm架构的虚拟化平台为 阅读全文
posted @ 2016-11-06 16:25 jack.chen 阅读(16997) 评论(6) 推荐(0)
摘要:上篇文章已经分析了探测PCI总线的部分代码,碍于篇幅,这里另启一篇。重点分析下pci_scan_root_bus函数 2016-10-24 pci_scan_root_bus函数 这里首先寻找bus总线号资源,前面在x86_pci_root_bus_resources函数中已经分配了,所以这里理论上 阅读全文
posted @ 2016-10-25 20:51 jack.chen 阅读(6327) 评论(0) 推荐(0)
摘要:在查看NAPI机制的时候发现一篇介绍NAPI引入初衷的文章写的很好,通俗易懂,就想要分享下,重要的是博主还做了可以在他基础上任意修改,而并不用注明出处的声明,着实令我敬佩,不过还是附上原文链接! http://blog.csdn.net/dog250/article/details/5302853 阅读全文
posted @ 2016-10-12 18:35 jack.chen 阅读(6750) 评论(0) 推荐(0)
摘要:2016-10-09 其实之前是简单学习过PCI设备的相关知识,但是总感觉 自己的理解很函数,很多东西说不清楚,正好今天接着写这篇文章自己重新梳理一下,文章想要分为三部分,首先介绍PCI设备硬件相关的知识,然后介绍LINux内核中对PCI设备的支持。本节讲第一部分。 PCI总线在目前计算机总线系统中 阅读全文
posted @ 2016-10-09 18:52 jack.chen 阅读(29793) 评论(0) 推荐(2)
摘要:纯属转载,不敢侵犯别人产权!! 一. SKB_BUFF的基本概念1. 一个完整的skb buff组成(1) struct sk_buff--用于维护socket buffer状态和描述信息(2) header data--独立于sk_buff结构体的数据缓冲区,用来存放报文分组,使各层协议的head 阅读全文
posted @ 2016-10-08 16:34 jack.chen 阅读(2822) 评论(0) 推荐(0)
摘要:2016-09-27 上篇文章大致介绍了qemu网络虚拟化相关的数据结构,本篇就结合qemu-kvm源代码分析下各个数据结构是如何初始化以及建立联系的。 这里还是分为三个部分: 1、Tap设备区 2、Hub区 3、NIC区 1、Tap设备区 在net.c中有数组记录下net client 初始化的相 阅读全文
posted @ 2016-09-27 20:51 jack.chen 阅读(1880) 评论(0) 推荐(1)
摘要:插曲: 今天下午欣喜的想写点关于qemu网络部分的功能,但是中途出现了点小插曲,电脑被某人搞得死机了,并且文章也没有保存。结果,,,就只能重新写了!!所以这里强烈建议开发团队提供自动保存的功能! 言归正传,前段时间自己写过关于Linux 内部网桥的实现原理以及数据包从物理网卡到达Linux网桥进行转 阅读全文
posted @ 2016-09-27 20:50 jack.chen 阅读(2158) 评论(0) 推荐(0)
摘要:由于想要编译kvm-kmod,编译的时候提示内核版本太低,所以就不得不升级下linux内核,目前最新版内核是4.7.2,编译内核并不是一件很难的事,但是这么久没编译过,还是有必要记录下这一过程。 首先下载linux内核最新版4.7.2 https://www.kernel.org/,这个可以放到任意 阅读全文
posted @ 2016-09-22 18:36 jack.chen 阅读(1990) 评论(0) 推荐(0)
摘要:上篇文章介绍了Linux内核桥接模式涉及到的几个结构,本节就重点放在数据包的处理上! 本节所有代码参考LInux 3.10.1内核! 前面已经提到一个数据包从网卡流到Linux内核中的L2层,最终被交付到__netif_receive_skb_core函数中,看下该函数中引用rx_hander的片段 阅读全文
posted @ 2016-09-22 16:19 jack.chen 阅读(8755) 评论(0) 推荐(0)
摘要:上篇文章导入博客园的比较早,而这篇自己在写的时候才发现内部复杂的很,以至于没能按时完成,造成两篇文章的间隔时间有点长! 话不多说,言归正传! 前面的文章介绍了桥接模式下的基础理论知识,其实本节想结合LInux源代码分析下桥接模式下的数据包的转发流程,但是看了源码才发现,这部分内容太多,非一篇文章可以 阅读全文
posted @ 2016-09-21 20:54 jack.chen 阅读(8481) 评论(0) 推荐(0)

以马内利