做个总结,这节说是讲虚拟内存管理,大部分的时间都在搞SWAP机制和服务于此机制的一些个算法.难度又降了一截.

不过现在我的电脑都16G内存了,能用完一半的情景都极少见了,可能到用到退休都不见得用的上SWAP机制了.在这种情况下SWAP分区也就象征性的分个几百兆了.

vmm.c&.h

vma:描述了一块连续的虚拟内存空间,保证start<=end

struct vma_struct {
struct mm_struct *vm_mm; // the set of vma using the same PDT
uintptr_t vm_start; // start addr of vma
uintptr_t vm_end; // end addr of vma, not include the vm_end itself
uint32_t vm_flags; // flags of vma
list_entry_t list_link; // linear list link which sorted by start addr of vma
};

mm:管理使用同一PDT的vma集合的结构体

struct mm_struct {
list_entry_t mmap_list; // linear list link which sorted by start addr of vma,
//一直指向头部
struct vma_struct *mmap_cache; // current accessed vma, used for speed purpose,
//一直指向最后访问项
pde_t *pgdir; // the PDT of these vma
int map_count; // the count of these vma
void *sm_priv; // the private data for swap manager
};

mm实现类似于物理内存管理里的free_area,是一个管理虚拟内存的链表,mm为指向头元素的指针,每一项都是vma

mm_create: 分配一个mm并初始化

如果此时已初始化SM,则调用SM的init_mm

mm_destroy: 释放mm管理的内存和它自身

vma_create: 创建一个vma并初始化

insert_vma_struct: 把指定vma插入到指定mm里.

以为要保证插入后起始地址从小到达排,所以遍历mm->mmap_list,找到地址刚好比vma地址大的一项,插到它前面.并检查vma的地址范围与前一项和后一项是否重叠

find_vma: 在mm里查找包含指定addr的vma

与插入不同,查找是按着mmap_cache遍历链表来缩短查找的期望时间,并在查找成功后更新mmap_cache为找到的vma

pmm.c

kmalloc: 分配n字节的内容,间接使用了alloc_pages

kfree: 释放从ptr起n字节的内容,间接使用了free_pages

page_insert(pgdir,page,la,perm):

*get_pte(pgdia,la,1)=page2pa(page)|PTE_P|perm

还有对page.ref,快表更新,pte的旧page的清理等细节

pgdir_alloc_page:

把(pgdir,la)对应的pte分配个page,并把page放到pra队列队尾,并更新page->pra->vaddr

memlayout.h:

Page结构里增加了俩成员

list_entry_t pra_page_link 在PRA里作为链表项

uintptr_t pra_vaddr 用于在被换出时记录当前线性地址

swap_fifo.c&.h

实现了基于FIFO的页置换算法

fifo_init_mm: 用le变量pra_list_head作为队头,令mm->sm_priv=队头

fifo_map_swappable: 把指定page添加到队尾

fifo_swap_out_victim: victim在这里有被替换者的意思.把队头page出队列,并返回之

swapfs.c&.h

封装了对SWAP分区的读写操作

swap.c&.h

在物理内存管理中,当PTE的存在位为0时,表示物理页不在内存中.我们把此时的PTE转化为swap_entry_t(SET)来描述一个处于换出状态的物理页在外存中的偏移

/* *
* swap_entry_t
* --------------------------------------------
* | offset | reserved | 0 |
* --------------------------------------------
* 24 bits 7 bits 1 bit
* */

为实现SWAP机制,定义了swap_manager结构体,原理类似于类似于PMM

struct swap_manager
{
const char *name;
/* Global initialization for the swap manager */
int (*init) (void);
/* Initialize the priv data inside mm_struct */
int (*init_mm) (struct mm_struct *mm);
/* Called when tick interrupt occured */
int (*tick_event) (struct mm_struct *mm);
/* Called when map a swappable page into the mm_struct */
int (*map_swappable) (struct mm_struct *mm, uintptr_t addr, struct Page *page, int swap_in);
/* When a page is marked as shared, this routine is called to
* delete the addr entry from the swap manager */
int (*set_unswappable) (struct mm_struct *mm, uintptr_t addr);
/* Try to swap out a page, return then victim */
int (*swap_out_victim) (struct mm_struct *mm, struct Page **ptr_page, int in_tick);
/* check the page relpacement algorithm */
int (*check_swap)(void);
};

swap_init:

计算SWAP分区的最大页数

将默认sm设为swap_manager_fifo,并调用它的初始化函数

检查初始化是否成功

swap_out: 把mm的pra队列的前n个page出队并写入外存

重复n次:

(1)把mm的pra队列的头page出队列

(2)获取page对应的pte

(3)把page写入外存

(4)更新pte,转化为set格式

(5)更新快表

swap_in:

(1)分配一页内存result

(2)获取指定addr对应的pte(当前为set格式)

(3)把pte对应的扇取区域读入result

(4)返回result地址

swap_out的触发时机:

在pmm.c的alloc_pages里

当swap初始化标志为真,并且分配页失败时,会写入外存,腾出空间.

swap_in的触发时机:

pagefault异常处理函数:do_pgfault(mm, error_code, addr)

大部分情况下会输出各种异常信息,只有在满足以下条件时会继续执行

* IF (write an existed addr ) OR
* (write an non_existed addr && addr is writable) OR
* (read an non_existed addr && addr is readable)

此时意味着发生缺页了,

(1)获取addr对应的vma

(2)获取vma对应的权限

(3)获取addr对应的pte

(4)pte为0,pgdir_alloc_page

(5)pte!=0,那就当成set进行swap_in,读进后更新pte,更新pra队列和page->ptr_vaddr

ucore lab3 虚拟内存管理 学习笔记的更多相关文章

  1. ucore操作系统学习(三) ucore lab3虚拟内存管理分析

    1. ucore lab3介绍 虚拟内存介绍 在目前的硬件体系结构中,程序要想在计算机中运行,必须先加载至物理主存中.在支持多道程序运行的系统上,我们想要让包括操作系统内核在内的各种程序能并发的执行, ...

  2. ucore lab2 物理内存管理 学习笔记

    总的来讲把的LAB1代码逻辑理顺后再往后学就轻松了一大截.LAB2过遍课程视频,再多翻翻实验指导书基本上就没遇到啥大坎儿.对这节学得东西做个总结就是一张图: 练习0:填写已有实验 本实验依赖实验1.请 ...

  3. C++内存管理学习笔记(7)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  4. C++内存管理学习笔记(5)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  5. C++内存管理学习笔记(6)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  6. Docker Image管理学习笔记,ZT

    Docker Image管理学习笔记 http://blog.csdn.net/junjun16818/article/details/38423391

  7. Linux内存管理学习笔记 转

    https://yq.aliyun.com/articles/11192?spm=0.0.0.0.hq1MsD 随着要维护的服务器增多,遇到的各种稀奇古怪的问题也会增多,要想彻底解决这些“小”问题往往 ...

  8. Linux文件与目录管理(学习笔记)

    本笔记为<鸟哥linux私房菜>第六章学习笔记 一.目录与路径 相对路径与绝对路径 绝对路径:一定由根目录 / 写起              正确度比较好 相对路径:不是由 / 写起  ...

  9. C++内存管理学习笔记(4)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

随机推荐

  1. 学习zabbix(四)

    一. 监控知识 1.硬件监控: 机房巡检,远程控制卡,IPMI 2.系统监控: cpu负载查看(指标):uptime(低于3),top(30%-70%), vmstat, mpstat 内存监控: f ...

  2. 打败算法 —— 环形链表 II

    本文参考 出自LeetCode上的题库 -- 环形链表II,哈希表和快慢指针两种解法都需要O(n)的时间,但快慢指针仅占用O(1)的空间 https://leetcode-cn.com/problem ...

  3. 排序 | 冒泡排序的优化与qsort快速排序

    冒泡排序 冒泡排序 Bubble_Sort,是极为简单的一种排序算法.虽然效率差一点,但好在具有结构简单,容易理解,易于操作等优点.冒泡排序就是把小的元素往前调或者把大的元素往后调.在相邻的两个元素间 ...

  4. BGD(批量梯度下降)--学习笔记

    函数凸凹性: 用到的范数知识: 详细解释:每一个元素的平方再开方.补充损失函数: Huber Loss知识点 loss函数可以通过loss参数进行设置.SGDRegressor支持以下的loss函数: ...

  5. Linux网络配置:Nat和桥接模式详解

    Linux网络配置:Nat和桥接模式详解 一.我们首先说一下VMware的几个虚拟设备: Centos虚拟网络编辑器中的虚拟交换机: VMnet0:用于虚拟桥接网络下的虚拟交换机: VMnet1:用于 ...

  6. React 可视化开发工具 Shadow Widget 非正经入门(之五:指令式界面设计)

    本系列博文从 Shadow Widget 作者的视角,解释该框架的设计要点.本篇解释 Shadow Widget 中类 Vue 的控制指令,与指令式界面设计相关. 1. 指令式界面设计 Vue 与 A ...

  7. 一个很好用的 vue-picker组件

    vue-picker a picker componemt for vue2.0 走了一圈 github 都没有找到自己想要的移动端的 vue-picker的组件,于是自己就下手,撸了一个出来,感受下 ...

  8. link和@import的区别浅析

    我们都知道,外部引入 CSS 有2种方式,link标签和@import.它们有何本质区别,有何使用建议,在考察外部引入 CSS 这部分内容时,经常被提起. 如今,很多学者本着知其然不欲知其所以然的学习 ...

  9. 手把手教你学vue-4(vuex)

    1.首先明白vuex是做什么用的. 管理统一组件状态state.每个应用将仅仅包含一个 store 实例.单一状态树让我们能够直接地定位任一特定的状态片段,在调试的过程中也能轻易地取得整个当前应用状态 ...

  10. JavaScript 遍历对象、数组总结

    在日常工作过程中,我们对于javaScript遍历对象.数组的操作是十分的频繁的,今天抽空把经常用到的方法小结一下,方便今后参考使用!   javaScript遍历对象总结     1.使用Objec ...