![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux
文章平均质量分 69
mszjaas00
这个作者很懒,什么都没留下…
展开
-
/proc/kcore 的结构
proc/kcore 的结构满足 elf 格式,共有一个程序头 + n 个 section header + 一个 note 段 + n-1 个内存段。它实际是所有内核态内存块的集合,以链表连接在一起。每个 section header 中的 offset 可以当作是读 /proc/kcore 文件的起始偏移。原创 2024-07-13 23:50:29 · 166 阅读 · 0 评论 -
快速读出linux 内核中全局变量
查问题时发现全局变量能读出来会提高效率,于是考虑从怎么读出内核态的全局变量,脚本如下。原创 2024-07-13 22:01:44 · 432 阅读 · 0 评论 -
xfs 的 sectorsize
下层设备写时还按物理的 sectorsize 为单位来写,但上层设备看到的写单位还是逻辑 sectorsize,下层设备会将同一物理 sectorsize 的几个逻辑写合并输出。设备上报的 sectorsize (也叫 topology sectorsize)有两种:逻辑 sectorsize + 物理 sectorsize,举个例子:早先设备用物理的 512 byte,后来物理的变为 4096 byte,为了兼容老的,逻辑的 sectorsize 还按 512 byte。原创 2024-06-17 12:21:51 · 173 阅读 · 0 评论 -
linux ext3/ext4文件系统(part2 jbd2)
JBD2支持三种日志模式:journal、ordered和writeback。在journal模式下,数据块和元数据块的修改都被记录在日志中;ordered模式在数据块刷盘后记录元数据;writeback模式则只记录元数据,不等待数据块刷盘。日志块包含revoke块(记录删除的块)、normal块(包含数据/元数据)和commit块(包含checksum等信息)。JBD2会生成日志块,包括revoke块、normal块和commit块。如果系统发生错误,JBD2会进入abort阶段,将未checkpoint原创 2024-02-20 15:39:02 · 1274 阅读 · 2 评论 -
linux x86 setup_arch代码注释
个人理解加查的资料,不保证正确,有不对可以评论。原创 2023-12-28 18:12:12 · 979 阅读 · 0 评论 -
linux ext3/ext4文件系统(part1格式化)
ext3的代码已经在v4.3被删除掉了(原创 2023-12-28 18:06:53 · 1345 阅读 · 0 评论 -
linux 中 ext2文件系统实现
(图中关于buffer的部分,上下两部分是重复的,是从不同维度下看的buffer结构)linux内核本身不提供ext2文件系统的格式化功能,可以参考busybox中对mkfs.ext2的实现(在busybox中块大小与总大小有关,总磁盘大小至少是64k,64k-512m是4096B,512m-4T是8192B(4T以上不考虑了)。原创 2023-12-26 22:32:37 · 1173 阅读 · 0 评论 -
linux buffer的回写的触发链路
wb_workfn中调用wb_do_writeback->writeback_inodes_wb将wb->b_dirty上记录的inode转移至wb->b_io队列(queue_io),并最终对inode的脏页做回写(__writeback_inodes_wb->writeback_sb_inodes->__writeback_single_inode->do_writepages)。原创 2023-12-22 11:13:06 · 430 阅读 · 0 评论 -
linux 内核的 lru_list 的结构
在支持memory group的场景(memcg_aware = true),每个每个memory group都分配了一个lru_list数组,数组中每个元素是这个对象对应的memory group在一个numa node上的lru_list的头。在linux的slab分配的入口slab_alloc有一个传入参数lru,它的作用是使每个slab对象在unused,但可能后面继续使用的时候,不需要free,可以先放在lru_list上。原创 2023-12-20 18:48:39 · 503 阅读 · 0 评论 -
linux中deadline调度原理与代码注释
deadline调度是比rt调度更高优先级的调度,它没有依赖于优先级的概念,而是给了每个实时任务一定的调度时间,这样的好处是:使多个实时任务场景的时间分配更合理,不让一些实时任务因为优先级低而饿死。deadline调度不是说必须在这个deadline时间点前跑完任务,而是在一个调度周期内,期望在deadline之前调度一次这个任务。理论上这个任务跑的时间是有可能超过deadline时间点,甚至period时间点。原创 2023-12-19 18:52:31 · 1478 阅读 · 0 评论 -
linux中core调度器
开始把core调度器当成了linux的主调度器,导致查找网上资料时总觉得对不上,最后从linux的rust文档中明白了,core调度器是为了解决超线程场景下缓存漏洞(如mds、L1HF)而存在的。简单来说就是一个cpu上同时运行两个线程时,线程1预加载到缓存的数据可以被线程2看到。),没找到mds和L1HF的POC代码,不太理解超线程的漏洞具体怎么实现,只能找到非超线程的漏洞原理。原创 2023-12-15 18:32:36 · 973 阅读 · 0 评论 -
linux vfs 路径解析代码注释
linux版本为 v6.7以chroot修改根目录为例,走一遍流程,重点在path_lookupat的实现。代码按逻辑组织,非真实代码顺序。由于涉及太多细节,每部分的开始会先做一个小结。原创 2023-12-14 11:26:44 · 1157 阅读 · 0 评论 -
理解linux中反向映射与应用
反向映射的作用是根据物理页,找到全部相关进程的vma。主要有两个结构,anon_vma_chain链表,和 anon_vma->rb_root红黑树。原创 2023-12-12 21:25:06 · 914 阅读 · 0 评论 -
linux ksm实现与代码简述
KSM 全称是 Kernel Samepage Merging,表示相同的物理页只映射一份拷贝。原创 2023-12-12 11:48:14 · 1060 阅读 · 0 评论 -
linux中slab与slub的实现区别
CFLGS_OBJFREELIST_SLAB:所有index的长度不到一个对象的长度,随机选一个对象的位置作为freeindex数组的位置。CFLGS_OFF_SLAB:额外分配内存作为free index数组,条件是剩余的大小不能装下整个free index数组。free: slab使用期间即使自己的node有了内存,也不会将slab还回去,要等到slab上对象全释放后才可能还回去。CFLGS_ON_SLAB:取 slab 的前面部分作为free index数组的位置。原创 2023-12-06 16:07:17 · 508 阅读 · 0 评论 -
linux 内存回收lru算法代码注释1
node_reclaim->__node_reclaim->shrink_node,这里调用shrink_node_memcgs回收后,要判断下是否分配内存速度比回收速度快太多,这种情况可能会尝试停一段时间等回收完成(reclaim_throttle),然后再看是否需要继续回收(should_continue_reclaim)。shrink_inactive_list会将部分页回收、送入swap区,或迁移到其它numa node上。原创 2023-11-22 17:55:21 · 875 阅读 · 0 评论 -
linux effective_protection函数实现
effective_protection实现如下,其多退少补的原则大概描述为:实际额度已用完,就按已分配的页数占总分配页的比瓜分额度;实际额度未用完,则在本节点已分配内存的基础上,按本节点使用超出额度的部分占所有使用超出额度部分的比瓜分剩余额度。函数的目的是根据 cgroup 的配额来计算它实际能从上层group中瓜分的额度。原创 2023-11-17 17:02:01 · 154 阅读 · 0 评论 -
linux 实时调度实现
linux 实时调度实现原创 2023-10-27 18:34:55 · 352 阅读 · 0 评论 -
linux PELT算法中的load计算
runqueue 的 load weight计算,用avg更合适,因为它比实时的weight更稳定,但由于avg的启动比较慢,在极端的场景要保证与用weight来表示的权重一致。一个entity 的share值指它在计算runqueue上的load时(load_avg)赋予的权重,这个权重用它所在的group的对应cpu上分得的share值来表示(group 在每个cpu上都有一个runqueue,cpu上分得的share用runqueue的share来表示): 是 runnable 的时间加权和。原创 2023-10-26 16:10:30 · 239 阅读 · 0 评论 -
静态链接与动态链接过程
静态链接静态链接三个步骤:布局(将相同节合并,如 text 节,data 节,原本以0地址为参考的地址现在要变到相对全局的位置)符号解析(查其它文件以填写未定义的符号的地址)重定位(将代码中函数调用/变量地址确定下来,由相对地址变绝对地址)对于静态库中的模块,只链接抽取用到的符号动态链接gcc -Og -fPIC a.c -o a.so // PIC 位置无关代码动态链接步骤:生成可执行文件在 .bss 节分配动态库中的全局变量(包括.data和.bss中的变量),并将 .go原创 2021-01-02 21:39:20 · 499 阅读 · 0 评论 -
linux 内存控制组管理结构
原创 2020-12-23 16:03:32 · 130 阅读 · 0 评论 -
linux 交换区管理结构
原创 2020-12-23 11:10:49 · 76 阅读 · 0 评论 -
linux 中虚拟内存组织
每个物理页的结构体 page 的 mapping 指向一个内存区域 vma (其最低的两位用来标识内存区域是匿名区 anon_vma 还是文件区 address_space )匿名区每个进程有一个匿名区 anon_vma,page 的 index 标识这个页在区内的页号不同进程的 anon_vma 之间组织成树,anon_vma->parent 指向父节点,anon_vma->root 指向根节点。一个进程的虚拟内存区按页号范围组织成一颗红黑树,树中节点为 vm_area_s原创 2020-12-22 10:12:29 · 350 阅读 · 0 评论 -
linux 碎片指数的理解
当每块的空闲页数都小于申请页数时会计算碎片指数(如果有一个块满足,碎片指数就直接是 -1)空闲指数反映了空闲块中空闲页相对申请页大小的比例空闲指数 -> 0 :碎片太多,也太小空闲指数 -> 1 :碎片挺大的,但太少,不够形成一个完整页块由于空闲页占的块数越多说明可用的碎片越多,空闲指数越近0说明碎片越小且多,将二者融合,得到碎片指数。空闲指数 -> 0,空闲块数 -> max 是可以尝试碎片整理的前提碎片指数 -> 0 :有碎片的块越少,不足以合并成完整空闲块原创 2020-12-21 11:55:02 · 168 阅读 · 0 评论