Xv6内核分析(三.1)

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2020年12月20日15:25:40 评论 396

main函数之kinit1

1. kinit1概述

物理内存分配器在xv6-book中由详细的描述:

Xv6内核分析(三.1)

这个函数是用来初始化物理内存分配器的。可以用来分配的物理内存范围是[内核数据区结尾end,4MB]地址空间:

Xv6内核分析(三.1)

其中end这个标号在链接脚本中:

Xv6内核分析(三.1)

1.1 kinit1实现:

Xv6内核分析(三.1)

可以看出,首先初始化了kmem这个变量中的锁,然后调用freerange。

1.2 freerange函数

Xv6内核分析(三.1)

首先将vstart进行页面对齐,然后对在start和end之间的每一物理页的起始地址调用kfree。

1.3 kfree函数

Xv6内核分析(三.1)

首先对传进来的地址进行检查,注意,这里传进来的地址必须要是页对齐的地址。接着将要释放的物理页全部置1。在kinit1和2中所进行的内存分配初始化都是无锁的,所以不会执行acquire语句。

然后将物理页本身用作链表管理的空间,对链表中数据进行初始化,可以看出,释放的物理页通过kmem.freelist形成一个单向链表:

Xv6内核分析(三.1)

1.4 kalloc函数

来看看kalloc,在内核未初始化完成的时候调用kalloc是无锁分配的,因为这时候既没有线程运行也没有其他cpu运行,无需担心抢占问题。

Xv6内核分析(三.1)

从代码中可以看出,内存分配操作很简单,就是从空间链表中取出第一个空闲页面即可。

由上面的分析可以总结出kinit1函数的作用就是将内核end到4MB之间可用物理页面连在一起形成空间链表。

gewenbin
  • 本文由 发表于 2020年12月20日15:25:40
  • 转载请务必保留本文链接:http://www.databusworld.cn/9276.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: