摘要: 在numa架构下,slab分配object: 首先,调用____cache_alloc来分配,该函数实现如下: 1. 先从array cache里面去找,如果找到,返回,如果没找到,走到2. 2.调用cache_alloc_refill来从node的shared里去找object,或者slab的pa 阅读全文
posted @ 2018-12-20 15:02 penghan 阅读(579) 评论(0) 推荐(0) 编辑
摘要: 如果你看过 Linux 内核中的 RCU 的实现,你应该注意到了这个叫做 ACCESS_ONCE() 宏。 ACCESS_ONCE的定义如下: 仅从语法上讲,这似乎毫无意义,先取其地址,在通过指针取其值。而实际上不然,多了一个关键词 volatile,所以它的含义就是强制编译器每次使用 x 都从内存 阅读全文
posted @ 2018-12-07 17:57 penghan 阅读(1173) 评论(1) 推荐(0) 编辑
摘要: 参考资料:《调度器笔记》Kevin.Liu 《Linux kernel development》 《深入Linux内核架构》 version: 2.6.32.9 下文中对于红黑树或链表组织的就绪队列,统称为用队列组织的就绪队列。 linux中用struct rq将处于ready状态的进程组织在一起。 阅读全文
posted @ 2018-09-18 15:17 penghan 阅读(586) 评论(0) 推荐(0) 编辑
摘要: 在此向郭大侠致敬。 一、前言 数学大师陈省身有一句话是这样说的:了解历史的变化是了解这门学科的一个步骤。今天,我把这句话应用到一个具体的Linux模块:了解逆向映射的最好的方法是了解它的历史。本文介绍了Linux内核中的逆向映射机制如何从无到有,如何从笨重到轻盈的历史过程,通过这些历史的演进过程,希 阅读全文
posted @ 2018-09-18 15:10 penghan 阅读(381) 评论(0) 推荐(0) 编辑
摘要: 1.前言 在Linux中,伙伴系统(buddy system)是以页为单位管理和分配内存。但是现实的需求却以字节为单位,假如我们需要申请20Bytes,总不能分配一页吧!那岂不是严重浪费内存。那么该如何分配呢?slab分配器就应运而生了,专为小内存分配而生。slab分配器分配内存以Byte为单位。但 阅读全文
posted @ 2018-09-18 14:50 penghan 阅读(1033) 评论(0) 推荐(0) 编辑
摘要: 上面是一些页表的结构体,下面是初始化ept页表。每个页大小为2MB. 对创建的EPT页表做测试。 线性区的页相关的那些标志。它们存放在vm_area_struct描述符的vm_flags字段中。一些标志给内核提供有关这个线性区全部页的信息,例如它们包含有什么内容,进程访问每个页的权限是什么。 另外的 阅读全文
posted @ 2017-04-13 17:31 penghan 阅读(878) 评论(0) 推荐(0) 编辑
摘要: 在大多数情况下,会用到链表,但是一直都没有仔细深究过,今天抽点时间做了个实验。 在看内核源码时,会发现使用二级指针插入或删除节点的情况,比如在字符设备里面的__register_chrdev_region及在notifier_chain_register里面。如下: 当找到要插入的地方(*cp),其 阅读全文
posted @ 2017-03-06 16:09 penghan 阅读(867) 评论(0) 推荐(1) 编辑
摘要: 中断 调度 阅读全文
posted @ 2017-03-03 11:47 penghan 阅读(2360) 评论(0) 推荐(2) 编辑
摘要: 对于x86_64来说,逻辑地址由16位选择子和64位偏移量组成(而32位时,逻辑地址由16位段选择符和32位偏移量组成),段寄存器仅仅存放选择子。CPU的分段单元(SU)执行以下操作:[1] 先检查选择子的TI字段,以决定描述子对应的描述子保存在哪一个描述符表中。TI字段指明描述子是在GDT中(在这 阅读全文
posted @ 2017-03-03 09:23 penghan 阅读(1920) 评论(1) 推荐(0) 编辑
摘要: module_init这个函数对做驱动的人来说肯定很熟悉,这篇文章用来跟一下这个函数的实现。 在include/linux/init.h里面有module_init的定义,自然,因为一个module可以在内核启动时自动加载进内核,也可以由我们手动在需要时加载进内核,基于这种场景,内核使用了MODUL 阅读全文
posted @ 2017-02-17 15:58 penghan 阅读(13923) 评论(1) 推荐(2) 编辑