MIT 6.S081 Operating System Lecture4 (随意的笔记)
系列文章目录
文章目录
- 系列文章目录
- 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)
上图展示了如下步骤:
- CPU 执行指令,指令中的地址是虚拟地址 0x1000
- 通过 MMU 转换为物理地址
- MMU 中维护一张表,用来进行虚拟地址和物理地址的映射关系
- 通常来说,
内存地址对应关系
这张表单也保存在内存中,所以CPU中需要一些寄存器(SATP)来存放表单在物理内存中的地址,用来告诉 MMU 去哪里找这份表单 - 每个应用程序都有自己的表单,这个表单定义了它的地址空间,当操作系统将CPU从一个应用程序切换到另一个应用程序时,同时也需要切换SATP寄存器中的内容,从而指向新的进程保存在物理内存中的地址对应表单。
- 通过真实物理地址进行数据的存取读
页表存的是物理地址
通过虚拟地址找到对应的表单和偏移。)
RISC-V 是多级页表
(多级页表,某种意义上也代表着会读多次内存)
对page table的理解
在操作系统,对于物理内存来说,每一个地址间隔所代表的的物理存储单位为 1B(一个字节,这里先不要考虑钻进64位本身占多少的错误思维(我自己之前就是));
所以一个64位操作系统,不考虑其他因素,CPU的可寻址大小最大为 2^64 Byte(32位是4G,下面的例子拿32位距离比较好理解)
将物理内存按照块或页分配,概念上理解成每 4KB 一页。即 2^12,即32位地址中,低的那12位可以用来表示对 page table 某页的 Offset, 即偏移。这里存在如下计算:
- 一个32位的地址占用
32 / 8 = 4 B
的空间,为了方便所以使用了 4B 作为页表项,这样一个页表就可以有 4KB / 4B = 1K 页表项(单位是页标项) - 其他资料喜欢以1G做例,这里使用最大场景做例子: 一共可以分配出
2^64 / 2^12 = 2^52
页 - 这样对最基础的页表来说,就可以通过将 低位12位作为 offset 来根据虚拟地址求得真实物理地址。
- 问题:事实上,页表本身也是需要用物理内存来进行存储的,如果一个应用程序占用内存过大,其所需要生成或使用的页表本身也会占用非常大的内存空间,这样明显过于浪费资源;假如一个应用程序占用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 (随意的笔记)相关推荐
- MIT 6.S081 Operating System Lecture5 (随意的笔记)
系列文章目录 文章目录 系列文章目录 Traps A question syscall Traps 用户空间和内核空间的切换通常被称为 trap example: shwrite()ecall(); ...
- MIT 6.S081 Operating System Lecture8 (非常随意的笔记)
系列文章目录 文章目录 系列文章目录 Page Fault COPY ON WRITE Page Fault eager allocation 通常,因为应用程序无法非常准确地估计自己要增加的内存有多 ...
- MIT 6.s081学习笔记
MIT 6.s081学习笔记 introduction 计算机组织结构: 最底部是一些硬件资源,包括了CPU,内存,磁盘,网卡 最上层会运行各种应用程序,比如vim,shell等,这些就是正在运行的所 ...
- SI - 系统 - 操作系统简述 (Operating System)
Unix 操作系统:System V.BSD Microsoft Windows Apple Mac OS Linux FreeBSD 安装 https://jingyan.baidu.com/art ...
- 怎样写一个简单的操作系统?(原文标题: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) 收藏 举 ...
- CPT104 Operating System Concepts Note
Word 直接复制过来标号有错误 Lecture 1 Process What is an Operating System? OS An Operating system is the heart ...
- MIT 6.S081 Lab4 traps
#Lab4: traps #Source #My Code #Motivation #Backtrace (moderate) #Motivation #Solution #S0 - RISC-V 栈 ...
- 「实验记录」MIT 6.S081 Lab7 multithreading
#Lab7: multithreading I. Source II. My Code III. Motivation IV. Uthread: switching between threads ( ...
- KylinX:A Dynamic Library Operating System for Simplified and Efficient Cloud ~
正文之前 仿佛好久没写过东西了..刚才一翻,最新文章在1-19,三个月了...果然我已经快放弃简书了,不过这儿好歹承载了那么多的回忆,还是别丢了吧.以后把我翻译的一些论文丢上来算了.. 正文 ~原文我 ...
最新文章
- 李航统计学习方法视频教程
- Clonezilla制作镜像时报错:extfsclone.c:bitmap free count err解决办法
- C# 依据鼠标坐标取网页内成员坐标.ie
- 0xC00000FD: Stack overflow (parameters: 0x00000000, 0x003E2000).错误
- timthumb.php外链,如何解决WordPress多站点不支持timthumb.php?
- 跟随我在oracle学习php(21)
- PS教程第七课:如何查看图层
- 037_自动添加防火墙规则,开启某些服务或端口(适用于 RHEL7)
- 2021年中国药店创新趋势报告
- 机器人剥人皮眼看自己是机器人_高中生自己编程机器人,获世界大赛“全能奖”...
- 月收入不足三千的人,每月的开销都是怎样的?
- 智能烟感与物联网卡可以了解一波
- 前端学习笔记之三PS
- Arduino+DHT11+OLED显示温湿度信息(附详细文档+源码)
- 五、完成Teigha.net对CAD文件中的Entity实体进行编辑修改功能,包括字体,样式,颜色,备注XData等属性
- Snipaste常用快捷键(详细总结)
- windows10 更新NVIDIA 显卡驱动
- 思科ccie和华为hcie中交换机环路的产生原因和解决方法
- Android判断网络状态是否断开
- 谈谈面试题之BeanFactory和ApplicationContext有什么区别?
热门文章
- 强化学习之入门笔记(一)
- 贵大计算机网络期末考试题,贵州大学大学计算机基础考试题库-客观题1.doc
- TCP Socket套接字编程 附源码
- 分享66个ASP.NET学校班级源码,总有一款适合您
- Python下如何调用NLPIR(ICTCLAS2013)分词系统
- 好大学在线C语言程序,C/C++程序设计-中国大学mooc-题库零氪
- 【JAVA练习:输出月份对应的英文】
- html canvas 图像边缘提取,在HTML5 canvas里用卷积核进行图像处理
- 测开转回开发经历感悟
- 2019年计算机类专业保研经历(清华软院、中科院计算所、中科院软件所、南大计算机、清华深圳)