main函数之kinit1
1. kinit1概述
物理内存分配器在xv6-book中由详细的描述:
这个函数是用来初始化物理内存分配器的。可以用来分配的物理内存范围是[内核数据区结尾end,4MB]地址空间:
首先将vstart进行页面对齐,然后对在start和end之间的每一物理页的起始地址调用kfree。
1.3 kfree函数
首先对传进来的地址进行检查,注意,这里传进来的地址必须要是页对齐的地址。接着将要释放的物理页全部置1。在kinit1和2中所进行的内存分配初始化都是无锁的,所以不会执行acquire语句。
然后将物理页本身用作链表管理的空间,对链表中数据进行初始化,可以看出,释放的物理页通过kmem.freelist形成一个单向链表:
1.4 kalloc函数
来看看kalloc,在内核未初始化完成的时候调用kalloc是无锁分配的,因为这时候既没有线程运行也没有其他cpu运行,无需担心抢占问题。
从代码中可以看出,内存分配操作很简单,就是从空间链表中取出第一个空闲页面即可。
由上面的分析可以总结出kinit1函数的作用就是将内核end到4MB之间可用物理页面连在一起形成空间链表。
评论