系列文章目录


文章目录

  • 系列文章目录
  • xv6 中的内存页是如何分配的
  • RISC-V 是多级页表
  • 对page table的理解

xv6 中的内存页是如何分配的

在本课中,内存也相关源码路径为:
kernel/kallo.c

// Physical memory allocator, for user processes,
// kernel stacks, page-table pages,
// and pipe buffers. Allocates whole 4096-byte pages.#include "types.h"
#include "param.h"
#include "memlayout.h"
#include "spinlock.h"
#include "riscv.h"
#include "defs.h"void freerange(void *pa_start, void *pa_end);extern char end[]; // first address after kernel.// defined by kernel.ld.struct run {struct run *next;
};struct {struct spinlock lock;struct run *freelist;
} kmem;void
kinit()
{initlock(&kmem.lock, "kmem");freerange(end, (void*)PHYSTOP);
}void
freerange(void *pa_start, void *pa_end)
{char *p;p = (char*)PGROUNDUP((uint64)pa_start);for(; p + PGSIZE <= (char*)pa_end; p += PGSIZE)kfree(p);
}// Free the page of physical memory pointed at by pa,
// which normally should have been returned by a
// call to kalloc().  (The exception is when
// initializing the allocator; see kinit above.)
void
kfree(void *pa)
{struct run *r;if(((uint64)pa % PGSIZE) != 0 || (char*)pa < end || (uint64)pa >= PHYSTOP)panic("kfree");// Fill with junk to catch dangling refs.memset(pa, 1, PGSIZE);r = (struct run*)pa;acquire(&kmem.lock);r->next = kmem.freelist;kmem.freelist = r;release(&kmem.lock);
}uint64
kfreemem(void)
{struct run *r;uint64 count = 0;acquire(&kmem.lock);r = kmem.freelist;while(r) {r = r->next;count++;}release(&kmem.lock);return count * PGSIZE;
}// Allocate one 4096-byte page of physical memory.
// Returns a pointer that the kernel can use.
// Returns 0 if the memory cannot be allocated.
void *
kalloc(void)
{struct run *r;acquire(&kmem.lock);r = kmem.freelist;if(r)kmem.freelist = r->next;release(&kmem.lock);if(r)memset((char*)r, 5, PGSIZE); // fill with junkreturn (void*)r;
}

如何在一个物理内存上,创建不通的地址空间?
如上所述:
最常见的就是分配页,页表(pagetables) – 需要硬件支持或者通过内存管理单元实现(MMU – Memory Management Unit)


上图展示了如下步骤:

  1. CPU 执行指令,指令中的地址是虚拟地址 0x1000
  2. 通过 MMU 转换为物理地址
    • MMU 中维护一张表,用来进行虚拟地址和物理地址的映射关系
    • 通常来说,内存地址对应关系 这张表单也保存在内存中,所以CPU中需要一些寄存器(SATP)来存放表单在物理内存中的地址,用来告诉 MMU 去哪里找这份表单
    • 每个应用程序都有自己的表单,这个表单定义了它的地址空间,当操作系统将CPU从一个应用程序切换到另一个应用程序时,同时也需要切换SATP寄存器中的内容,从而指向新的进程保存在物理内存中的地址对应表单。
  3. 通过真实物理地址进行数据的存取读

页表存的是物理地址
通过虚拟地址找到对应的表单和偏移。)

RISC-V 是多级页表

(多级页表,某种意义上也代表着会读多次内存)

对page table的理解



在操作系统,对于物理内存来说,每一个地址间隔所代表的的物理存储单位为 1B(一个字节,这里先不要考虑钻进64位本身占多少的错误思维(我自己之前就是));
所以一个64位操作系统,不考虑其他因素,CPU的可寻址大小最大为 2^64 Byte(32位是4G,下面的例子拿32位距离比较好理解)
将物理内存按照块或页分配,概念上理解成每 4KB 一页。即 2^12,即32位地址中,低的那12位可以用来表示对 page table 某页的 Offset, 即偏移。这里存在如下计算:

  1. 一个32位的地址占用 32 / 8 = 4 B 的空间,为了方便所以使用了 4B 作为页表项,这样一个页表就可以有 4KB / 4B = 1K 页表项(单位是页标项)
  2. 其他资料喜欢以1G做例,这里使用最大场景做例子: 一共可以分配出 2^64 / 2^12 = 2^52
  3. 这样对最基础的页表来说,就可以通过将 低位12位作为 offset 来根据虚拟地址求得真实物理地址。
  4. 问题:事实上,页表本身也是需要用物理内存来进行存储的,如果一个应用程序占用内存过大,其所需要生成或使用的页表本身也会占用非常大的内存空间,这样明显过于浪费资源;假如一个应用程序占用4GB内存,那其所需要的的页表就占用 4GB / 4KB * 4B == 4MB , 总内存就是 4G + 4MB;而如果是二级页表:
    4MB的页表还可以继续分配成 4MB / 4KB == 1K 页 --> 1K页 * 4B == 1KB, 占用 4G + 1KB
相关笔记:顶级页表最多只能有一个页面。(这是规定)
一个页面可以存放1K个页表项4KB/4B = 1K。
所以顶级页表虽然只有一个页面但是可以存放1K个页表项,其中每一个页表项对应的是下一级的1K个页表项。所以可以存放的最大空间是1K* 1K *4KB = 4GB内存。

MIT 6.S081 Operating System Lecture4 (随意的笔记)相关推荐

  1. MIT 6.S081 Operating System Lecture5 (随意的笔记)

    系列文章目录 文章目录 系列文章目录 Traps A question syscall Traps 用户空间和内核空间的切换通常被称为 trap example: shwrite()ecall(); ...

  2. MIT 6.S081 Operating System Lecture8 (非常随意的笔记)

    系列文章目录 文章目录 系列文章目录 Page Fault COPY ON WRITE Page Fault eager allocation 通常,因为应用程序无法非常准确地估计自己要增加的内存有多 ...

  3. MIT 6.s081学习笔记

    MIT 6.s081学习笔记 introduction 计算机组织结构: 最底部是一些硬件资源,包括了CPU,内存,磁盘,网卡 最上层会运行各种应用程序,比如vim,shell等,这些就是正在运行的所 ...

  4. SI - 系统 - 操作系统简述 (Operating System)

    Unix 操作系统:System V.BSD Microsoft Windows Apple Mac OS Linux FreeBSD 安装 https://jingyan.baidu.com/art ...

  5. 怎样写一个简单的操作系统?(原文标题:How to write a simple operating system) 分类: 翻译 2011-01-26 01:10 3175人阅读 评论(3) 收藏

    怎样写一个简单的操作系统?(原文标题:How to write a simple operating system) 分类: 翻译2011-01-26 01:10 3175人阅读 评论(3) 收藏 举 ...

  6. CPT104 Operating System Concepts Note

    Word 直接复制过来标号有错误 Lecture 1 Process What is an Operating System? OS An Operating system is the heart ...

  7. MIT 6.S081 Lab4 traps

    #Lab4: traps #Source #My Code #Motivation #Backtrace (moderate) #Motivation #Solution #S0 - RISC-V 栈 ...

  8. 「实验记录」MIT 6.S081 Lab7 multithreading

    #Lab7: multithreading I. Source II. My Code III. Motivation IV. Uthread: switching between threads ( ...

  9. KylinX:A Dynamic Library Operating System for Simplified and Efficient Cloud ~

    正文之前 仿佛好久没写过东西了..刚才一翻,最新文章在1-19,三个月了...果然我已经快放弃简书了,不过这儿好歹承载了那么多的回忆,还是别丢了吧.以后把我翻译的一些论文丢上来算了.. 正文 ~原文我 ...

最新文章

  1. 李航统计学习方法视频教程
  2. Clonezilla制作镜像时报错:extfsclone.c:bitmap free count err解决办法
  3. C# 依据鼠标坐标取网页内成员坐标.ie
  4. 0xC00000FD: Stack overflow (parameters: 0x00000000, 0x003E2000).错误
  5. timthumb.php外链,如何解决WordPress多站点不支持timthumb.php?
  6. 跟随我在oracle学习php(21)
  7. PS教程第七课:如何查看图层
  8. 037_自动添加防火墙规则,开启某些服务或端口(适用于 RHEL7)
  9. 2021年中国药店创新趋势报告
  10. 机器人剥人皮眼看自己是机器人_高中生自己编程机器人,获世界大赛“全能奖”...
  11. 月收入不足三千的人,每月的开销都是怎样的?
  12. 智能烟感与物联网卡可以了解一波
  13. 前端学习笔记之三PS
  14. Arduino+DHT11+OLED显示温湿度信息(附详细文档+源码)
  15. 五、完成Teigha.net对CAD文件中的Entity实体进行编辑修改功能,包括字体,样式,颜色,备注XData等属性
  16. Snipaste常用快捷键(详细总结)
  17. windows10 更新NVIDIA 显卡驱动
  18. 思科ccie和华为hcie中交换机环路的产生原因和解决方法
  19. Android判断网络状态是否断开
  20. 谈谈面试题之BeanFactory和ApplicationContext有什么区别?

热门文章

  1. 强化学习之入门笔记(一)
  2. 贵大计算机网络期末考试题,贵州大学大学计算机基础考试题库-客观题1.doc
  3. TCP Socket套接字编程 附源码
  4. 分享66个ASP.NET学校班级源码,总有一款适合您
  5. Python下如何调用NLPIR(ICTCLAS2013)分词系统
  6. 好大学在线C语言程序,C/C++程序设计-中国大学mooc-题库零氪
  7. 【JAVA练习:输出月份对应的英文】
  8. html canvas 图像边缘提取,在HTML5 canvas里用卷积核进行图像处理
  9. 测开转回开发经历感悟
  10. 2019年计算机类专业保研经历(清华软院、中科院计算所、中科院软件所、南大计算机、清华深圳)