![](https://img-blog.csdnimg.cn/2019091813595558.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
操作系统实现
参考笨叔叔的BenOS
byd yes
这个作者很懒,什么都没留下…
展开
-
最简单的fork实现
在fork内核/用户进程时,会分配4k内存保存struct task、内核栈、struct pt_regs,struct cpu_context等信息。 struct task:进程的控制块 内核栈:在内核空间执行时保存的栈数据 struct pt_regs:在中断或者系统调用执行时,保存被中断时系统的状态。 struct cpu_context:表示在进程切换时,保存上一个进程的执行状态。 下图展示创建用户进程和创建内核进程的内存分布情况 完成上述结构后,新的进程被创建。 ...原创 2021-08-12 11:14:52 · 216 阅读 · 0 评论 -
最简单的slob实现
为什么需要slob? 在内核空间,每次分配页面(伙伴系统)只能分配4K的倍数的大小,如果需要分配字节为单位的内存,则需要slob机制。 在slob机制中,是在伙伴系统的基础上分配内存,然后对内存块进行细分。 slob机制设计思路 1. 并没有按照对象的大小来分配一个特定的slab cache任何size的slab对象都可以 拥挤到一个page里,即一个page里可以同时存在不同大小的对象。 2. 没有pre-cpu的缓存和多核share缓存的思想。 3. 需要分配对象时,就从一个有空闲空间的原创 2021-08-11 15:52:34 · 451 阅读 · 0 评论 -
最简单的伙伴系统(buddy)实现
内存释放: memblock过渡到buddy 从memblock中将标记为MEMBLOCK_FREE的内存添加到buddy。 /* 把memblock管理的空闲页面都添加到伙伴系统中 */ for_each_memblock_region(mrg) { if (mrg->flags != MEMBLOCK_FREE) continue; count += memblock_free_memory(mrg->base,原创 2021-08-10 10:11:14 · 778 阅读 · 0 评论 -
最简单的zone实现
参考笨叔的BenOS代码原创 2021-08-06 15:12:22 · 111 阅读 · 0 评论 -
最简单的memblock机制实现
参考笨叔的BenOS代码 memblock分配器使用memory region的概念来管理内存,它是在伙伴系统初始化之前使用的这种简单的内存管理。 在初始化伙伴系统时,需要为mem_map[]数组分配内存,但是由于不知道内存有多少page,所以mem_map[]不能使用全局数组来分配内存。适合使用memblock来分配内存,这些内存被设置为RESERVE。 1. 内存状态一共分成两个,一是FREE,另外一个RESERVE。RESERVE表示已经分配和内核预留的内存,这些内存不会添加到伙伴系统。 2.原创 2021-08-06 11:04:12 · 406 阅读 · 0 评论 -
最简单的fixmap机制实现
参考笨叔的BenOS代码 fix_map机制: 目的:在内存还没有建立线性映射之前,memblock机制分配的内存是不能正确被CPU访问的,因为此时CPU已经打开了MMU,memblock分配的物理页面还没有建立映射关系,即访问虚拟地址。 在建立页表的过程中,就需要使用memblock机制来分配内存,用作页表本身,例如PUD,PMD,PTE页表本身就是使用一个page来存储页表项。 memblock分配的page可能存在乱数据,这对页表本身是一个坏事情,我们需要把这个page清0。此时,CPU需要得到原创 2021-08-06 08:42:51 · 522 阅读 · 0 评论