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

摘要:上一篇文章对工作队列原理以及核心数据结构做了简单介绍,本文重点介绍下workqueue的创建以及worker的管理。 一、工作队列的创建(__alloc_workqueue_key) 该函数主要任务就是通过kzalloc分配一个workqueue_struct结构,然后格式化一个名称,对workqu 阅读全文
posted @ 2018-01-24 11:49 jack.chen 阅读(1334) 评论(0) 推荐(0)
摘要:2018-01-18 工作队列是Linux内核中把工作延迟执行的一种手段,其目的不同于软中断,软中断是提高CPU的响应,尽可能的缩短关中断的时间;而工作队列主要目的是节省资源,其比较适合很微小的任务,比如执行某个唤醒工作等。通过创建线程同样可以达到目的,但是线程毕竟有其自身的资源开销如CPU、内存等 阅读全文
posted @ 2018-01-23 10:05 jack.chen 阅读(7093) 评论(0) 推荐(0)
摘要:2018-01-18 其实在之前的文章中已经简要介绍了VHOST中通过irqfd通知guest,但是并没有对irqfd的具体工作机制做深入分析,本节简要对irqfd的工作机制分析下。这里暂且不讨论具体中断虚拟化的问题,因为那是另一个内容,这里仅仅讨论vhost如何使用中断的方式对guest进行通知, 阅读全文
posted @ 2018-01-18 14:57 jack.chen 阅读(3926) 评论(0) 推荐(0)
摘要:一直以为PROC文件系统很是晦涩难懂,平时仅仅是使用它,不愿意去触碰内核中的具体实现。今天突发奇想,想看看里面究竟是怎么实现的,结果……真是大跌眼镜,没想到里面并不复杂 关于PROC文件系统的功能以及在Linux中的地位就不多说了,在用户空间和内核空间交互的界面也扮演者举足轻重的地位。我们今天就从p 阅读全文
posted @ 2017-09-05 09:21 jack.chen 阅读(13213) 评论(1) 推荐(1)
摘要:2017-08-24 今天咱们聊聊KVM中断虚拟化,虚拟机的中断源大致有两种方式,来自于用户空间qemu和来自于KVM内部。 中断虚拟化起始关键在于对中断控制器的虚拟化,中断控制器目前主要有APIC,这种架构下设备控制器通过某种触发方式通知IO APIC,IO APIC根据自身维护的重定向表pci 阅读全文
posted @ 2017-09-04 19:25 jack.chen 阅读(7388) 评论(0) 推荐(1)
摘要:2017-07-19 一、前言 之前有分析过虚拟化环境下virtIO的实现,virtIO相关于传统的虚拟IO在性能方面的确提高了不少,但是按照virtIO虚拟网卡为例,每次虚拟机接收数据包的时候,数据包从linux bridge经过tap设备发送到用户空间,这是一层数据的复制并且伴有内核到用户层的切 阅读全文
posted @ 2017-08-23 09:18 jack.chen 阅读(11733) 评论(4) 推荐(1)
摘要:POLL机制的作用这里就不进行介绍,根据linux man手册,解释为在一个文件描述符上等待某个事件。按照抽象一点的理解,当某个事件被触发(条件被满足),文件描述符变为有状态,那么用户空间可以根据此进行操作,结合多个文件描述符,可以实现文件描述符的无阻塞访问。其实个人感觉这里的无阻塞主要是在监听多个 阅读全文
posted @ 2017-07-31 19:50 jack.chen 阅读(1423) 评论(0) 推荐(0)
摘要:2017-07-20 eventfd在linux中是一个较新的进程通信方式,和信号量等不同的是event不仅可以用于进程间的通信,还可以用户内核发信号给用户层的进程。eventfd在virtIO后端驱动vHost的实现中作为vhost和KVM交互的媒介,起到了重大作用。本节结合linux源码就eve 阅读全文
posted @ 2017-07-20 20:22 jack.chen 阅读(11982) 评论(0) 推荐(1)
摘要:2017-07-09 今天周末,闲来无事聊聊linux内核内存分配那点事……重点在于分析vmalloc的执行 流程 以传统x86架构为例,内核空间内存(3G-4G)主要分为三大部分:DMA映射区,一致映射区、高端内存区。其中前两者占据低端892M,而剩下的128M作为高端内存区。DMA映射区涉及到外 阅读全文
posted @ 2017-07-10 14:28 jack.chen 阅读(5495) 评论(1) 推荐(0)
摘要:2017-07-06 上节主讲了用户层通过netlink和内核交互的详细过程,本节分析下用户层接收数据的过程…… 有了之前基础知识的介绍,用户层接收数据只涉及到一个核心调用readmsg(), 其他的就不多介绍了,不太明白的请参考之前的文章,我们还是重点看下内核究竟在背后做了什么!该函数在内核对应于 阅读全文
posted @ 2017-07-06 17:05 jack.chen 阅读(1166) 评论(0) 推荐(0)
摘要:2017-07-05 本节从一个小案例入手,结合源码分析下通过netlink进行内核和用户通信的流程。 内核端 按照传统CS模式,其实内核端可以作为是服务器端,用以接收用户的请求并作出处理,但是从netlink本身的特性,其更像是一个对等实体。双方都可以进行主动数据的传递。 内核中首先调用netli 阅读全文
posted @ 2017-07-06 10:59 jack.chen 阅读(4161) 评论(0) 推荐(0)
摘要:2017-07-05 上文以一个简单的案例描述了通过Netlink进行用户、内核通信的流程,本节针对流程中的各个要点进行深入分析 sock的创建 sock管理结构 sendmsg源码分析 sock的创建 这点包含用户socket的创建以及内核socket的创建,前者通过socket调用实现,后者通过 阅读全文
posted @ 2017-07-06 10:59 jack.chen 阅读(1788) 评论(0) 推荐(0)
摘要:2017-07-04 netlink是一种基于网络的通信机制,一般用于内核内部或者内核与用户层之间的通信。其有一个明显的特点就是异步性,通信的双方不要求同时在线,也就不用阻塞等待。NetLink按照数据包的格式发送/接收消息,提供双向通信,和其他内核与用户层通信机制相比,NetLink有其特有的优势 阅读全文
posted @ 2017-07-06 10:58 jack.chen 阅读(2551) 评论(1) 推荐(2)
摘要:2017-06-27 上篇文章简要介绍了Linux进程调度,以及结合源代码窥探了下CFS的调度实例。但是没有深入内部区分析调度下面的操作,比如就绪队列的维护以及进程时间的更新等。本节就这些问题做深入讨论。 回想进程调度,在thread_info中有一个重调度位,标识当前进程是否需要被调度,如果该位被 阅读全文
posted @ 2017-06-30 10:20 jack.chen 阅读(2879) 评论(0) 推荐(0)
摘要:上篇文章大致描述了Linux时间管理的基本情况,看了一些大牛们的博客感觉自己写的内容很匮乏,但是没办法,只能通过这种方式提升自己……闲话不说,本节介绍下时间管理下重要的数据结构 设备相关数据结构 //时钟源结构 struct clocksource{} //时钟设备结构 struct tick_de 阅读全文
posted @ 2017-06-27 17:58 jack.chen 阅读(752) 评论(0) 推荐(0)
摘要:2017/6/21 时间这一概念在生活中至关重要,而在操作系统中也同样重要,其在系统中的功能绝不仅仅是给用户提供时间这么简单,内核的许多机制都依赖于时间子系统。但凡是要在某个精确的时间执行某个事件,必然会用到时间子系统。而内核中定时器的发展可以以2.6版本的内核作为一个分界点。之前主要是低分辨率定时 阅读全文
posted @ 2017-06-26 19:52 jack.chen 阅读(898) 评论(0) 推荐(0)
摘要:2017-06-20 Linux的内核模块机制允许开发者动态的向内核添加功能,我们常见的文件系统、驱动程序等都可以通过模块的方式添加到内核而无需对内核重新编译,这在很大程度上减少了操作的复杂度。模块机制使内核预编译时不必包含很多无关功能,把内核做到最精简,后期可以根据需要进行添加。而针对驱动程序,因 阅读全文
posted @ 2017-06-21 14:51 jack.chen 阅读(6869) 评论(0) 推荐(0)
摘要:2017-06-03 周末闲暇无事,聊聊内核中的wait_event*类函数的具体实现,等待事件必定涉及到某个条件,而这些函数的区别主要是等待后唤醒的方式……直奔主题,上源码 wait_event_interruptible 调用该宏首先会先检查条件,如果条件已经满足,则不用等了呀,返回吧……,否则 阅读全文
posted @ 2017-06-03 19:55 jack.chen 阅读(6842) 评论(0) 推荐(0)
摘要:在内核中分配内存,最后要通过伙伴系统接口进行实际物理页面的分配,一个重要的接口便是alloc_page.本文介绍下alloc_page的主要流程,各个部分的执行。主要包含正常分配流程,当页面不足的时候的处理方式。先定位到核心调用 order是分配页面的阶,即2的指数个页面 nid指定了从哪个NUMA 阅读全文
posted @ 2017-06-03 17:58 jack.chen 阅读(5694) 评论(0) 推荐(1)
摘要:一个简单的问题,·linux下获取当前进程。我们都知道在内核中获取当前进程可以利用current宏 通过get_current发现其是利用当前线程获取的当前进程线程结构thread_info结构中有指向其所属的进程指针task 代码比较简单,获取sp寄存器的值,然后和~(THREAD_SIZE-1) 阅读全文
posted @ 2017-05-21 12:57 jack.chen 阅读(2364) 评论(0) 推荐(0)

以马内利