![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
内核修炼
文章平均质量分 89
学习记录内核模块
Ethan-Code
好记性不如烂笔头,加油!
展开
-
【Linux内核】启动流程——Kernel 启动流程梳理
uboot将控制权交给 kernel,kernel入口为 stext,主要完成验证是否支持此 CPU、验证 uboot 传入的设备树(dtb)合法性、使能 MMU 等工作,最终会调用 C 函数 start_kernel()相当于内核的 main 函数,内核的生命周期就是从执行这个函数的第一条语句开始的,直到最后一个函数 reset_init(),内核将不再从这个函数中返回。本文详解了kernel启动流程中涉及到的重要函数,并添加printk打印log验证。转载 2023-02-11 21:22:28 · 1786 阅读 · 1 评论 -
【Linux内核】内存管理——缓存一致性问题
CPU访问外设的数据寄存器和状态寄存器时,也是需要将寄存器的值映射到内存上进行读写,外设寄存器的值由硬件修改,也可以由CPU读写,因此外设和CPU对寄存器映射的内存访问也是异步的。在没有写回之前,核心B的cache中的同个数据还没改,当B去访问它时则会与A不一致。因为DMA是直接内存访问,对内存的访问不需要经过CPU,因此如果DMA修改了内存上的CPU访问过的数据,而CPU的cache中并不知道内存已经修改了,CPU读写内存的时候还是cache上的旧数据,造成缓存不一致问题。原创 2022-10-06 16:40:46 · 1433 阅读 · 0 评论 -
【Linux内核】内存管理——Buddy、Slab分配器
但是当需要申请连续物理内存页框的时候,随着进程的对内存的申请和释放,系统的内存会不断的区域碎片化,分页机制就不一定能保证有足够的连续物理内存页了。当回收一个内存块,会将该内存块插入到对应的链表中,然后查询其buddy内存块是否也在链表上,如果是则合并两个内存块,然后插入到大一级的内存块链表中。如果大一级的内存块链表中没有空闲内存块,则会向更大的内存块链表中查找,然后一层层二分下来,分到合适大小后分配给用户,其他的都插入对应的内存块链表中。一部分插入对应的小一级的内存块链表,另一部分分配给用户使用。原创 2022-10-06 16:39:53 · 1483 阅读 · 0 评论 -
【Linux内核】内存管理——申请超过物理内存容量的内存
在 32 位操作系统,因为进程最大只能申请 3 GB 大小的虚拟内存,所以直接申请 8G 内存,会申请失败。在 64 位操作系统,因为进程最大可以申请 128 TB 大小的虚拟内存,即使物理内存只有 4GB,申请 8G 内存也是没问题,因为申请的内存是虚拟内存。如果这块虚拟内存被访问了,要看系统有没有 Swap 分区: * 如果没有 Swap 分区,因为物理空间不够,进程会被OOM机制杀掉原创 2022-10-06 16:38:35 · 1480 阅读 · 2 评论 -
【Linux内核】内存管理——内存回收机制
malloc申请的是虚拟内存,只有在程序去访问时,才会触发缺页异常进入内核态,在缺页中断函数中建立物理内存映射。如果物理内存充足,则直接建立页框与页的映射。当物理内存不足时,内核会进行物理内存回收,内存回收的方式主要有:1. 后台内存回收(kswapd)2. 直接内存回收(direct reclaim)3. OOM机制(Out of Memory)三种内存回收方式按内存的紧缺程度递进。原创 2022-10-06 16:37:12 · 5902 阅读 · 0 评论 -
【Linux内核】内存管理——内核的内存分区
32位机中的虚拟内存大小为4GB,其中0\~3GB用于用户空间,3\~4GB用于内核空间。内核的内存空间只有1G,这一部分内存在进程中共享,与用户空间隔离,用户空间不能访问。内核空间在虚拟内存上分为三个区间:从低到高分别是:原创 2022-10-06 16:35:46 · 1702 阅读 · 0 评论 -
【Linux内核】内存管理——malloc的内存分配
使用malloc时,会从两个区分配内存,分别是 文件映射区 和 堆区。当申请的内存小于 128K 时,会通过 brk() 系统调用,从堆区分配内存。当申请的内存大于 128K 时,会通过 mmap() 系统调用,从文件映射区分配内存。下面讲两种分配方式的区别。原创 2022-10-06 16:34:13 · 2138 阅读 · 1 评论 -
【Linux内核】内存管理——分段和分页的区别
分段和分页的工作方式相似,都是非连续存储。分段的逻辑地址=段号+段内偏移。段表存放段描述符。段描述符=段基址+段界限。物理地址=段基址+段内偏移。分页的虚拟地址=页号+页内偏移。页表存放页面映射。页面映射=虚拟页号+物理页号。物理地址=物理页号+页内偏移。原创 2022-10-06 16:32:11 · 1662 阅读 · 1 评论 -
【Linux内核】内存管理——虚拟内存、分段、分页机制
为什么要有虚拟内存?1. 让每个进程都有独立的内存空间,每个进程都有自己的私有页表,提供一个可以执行多进程的环境。2. 利用程序运行局部性原理,允许进程的内存空间超过物理内存大小。3. 页表中维护着页的权限属性,使内存访问更安全。原创 2022-10-06 16:30:28 · 1411 阅读 · 0 评论