lab2

2023-10-27

Part1 

Exercise 1:
 boot_alloc: 

    if(!n){
		result=nextfree;
		return result;
    	}
	else{
		  uint32_t remainingPages=npages-((uint32_t)nextfree-(uint32_t)KERNBASE)/PGSIZE;
		  if(n<remainingPages*PGSIZE){
		  	 result=nextfree;
			 nextfree=ROUNDUP(nextfree+n,PGSIZE);
			 return result;
		  	}else{
		  	 panic("The memory has been used up\n");
			 
		  	}
		
		}
	return NULL;
mem_init:
  pages=(struct PageInfo *)boot_alloc(npages*sizeof(struct PageInfo));
	memset(pages,0,npages*sizeof(struct PageInfo));
Page_init:
size_t i;
	uint32_t j=((uint32_t)boot_alloc(0)-KERNBASE)/PGSIZE;
	uint32_t j2=IOPHYSMEM/PGSIZE;
	for (i = npages-1; i>=1; i--) {
		//the physical memory pages that has been used by pages and kernel 
		
		//cprintf("rrrrrrrrrrrrrrrrr");
		if(!((i>=j2&&i<j)||i==0)){
			pages[i].pp_ref = 0;
			pages[i].pp_link = page_free_list;
			page_free_list = &pages[i];
		}
	}

Page_alloc:
if(page_free_list==NULL) return 0;
    struct PageInfo *result=page_free_list;
	page_free_list=page_free_list->pp_link;

	//set '\0'
	if(alloc_flags&ALLOC_ZERO){
	void * resultKVA=page2kva(result);
	memset(resultKVA,0,PGSIZE);
	}
	//cprintf("page_alloc va is %08x\n",page2kva(result));
	return result;

Page_free:
if(pp->pp_ref!=0) return;
	pp->pp_link=page_free_list;
	page_free_list=pp;

Part2 


Exercise 3:
   ctrl+a c进入qemu调试
   qemu下调试: xp/Nx physical address与GDB调试的x/Nxw virtual address,查看内存的内容
   info pg和info mem显示内存映射的情况

Question1: 虚拟地址。2013.7.17
Exercise 4:

pte_t *
pgdir_walk(pde_t *pgdir, const void *va, int create)
{
	// Fill this function in
	pte_t ptet=pgdir[PDX(va)];
	//cprintf("cprintf_walk, the pgdir is %08x\n",ptet);
	if((ptet&PTE_P)==0){
		 if(create==false)return NULL;
		 struct PageInfo *pageinfo=page_alloc(1);
		 if(!pageinfo) return NULL;
		 pageinfo->pp_ref++;
		 pgdir[PDX(va)]=page2pa(pageinfo)| PTE_U | PTE_P|PTE_W;
		// cprintf("pgdir_walk, the physical is %08x va is %08x %08x\n",PTX(va),va,page2kva(pageinfo)+PTX(va));
		 return (pte_t*)page2kva(pageinfo)+PTX(va);
	}
	pte_t * ptet_va=KADDR(PTE_ADDR(ptet));
	//cprintf("pdgidr_walk page table item is %08x\n",ptet_va[PTX(va)]);
    return ptet_va+PTX(va);
}
static void
boot_map_region(pde_t *pgdir, uintptr_t va, size_t size, physaddr_t pa, int perm)
{
	// Fill this function in
	// i think the va and pa must be a multiple of PGSIZE also Author:ryz
	// if size is more than 4M, one pte can't contain so may datas???!!!!!
	// use walk every va address, there is no any problem
	
	if(size&0xFFF) panic("boot_map_region: va is not a multiple of PGSIZE %08x\n",size);
	uintptr_t i;
	for(i=0;i<size;i+=PGSIZE){
		pte_t * ptet=pgdir_walk(pgdir,(void *)va,true);
		*ptet=pa|PTE_P|perm;
		pa+=PGSIZE;
		va+=PGSIZE;			
	}
}
struct PageInfo *
page_lookup(pde_t *pgdir, void *va, pte_t **pte_store)
{
	// Fill this function in
	pte_t * ptet=pgdir_walk(pgdir,va,false);
	if(*pte_store!=NULL)*pte_store=ptet;
	if((ptet==NULL)||((*ptet&PTE_P)==0)) return NULL;
	//cprintf("page_lookup linear address is %08x\n",(uint32_t)va);
	//cprintf("11111111111111\n");
	//cprintf("%08x\n",*ptet);
	return pa2page(PTE_ADDR(*ptet));
	//cprintf("22222222222222222\n");
	
}
void
page_remove(pde_t *pgdir, void *va)
{
	// Fill this function in
	//cprintf("page_remove entry\n");
	pte_t *ptet;
	struct PageInfo *pageinfo=page_lookup(pgdir,va,&ptet);
	//cprintf("333333333333");
	if (pageinfo==NULL) return;
	page_decref(pageinfo);
	*ptet=0;
	tlb_invalidate(pgdir,va);
}
int
page_insert(pde_t *pgdir, struct PageInfo *pp, void *va, int perm)
{
	// Fill this function in
	//cprintf("page_insert entry\n");
	//cprintf("page_insert the va is %08x\n",(uint32_t)va);
	pte_t * ptet=pgdir_walk(pgdir,va,true);
	if(ptet==NULL) return -E_NO_MEM;
	if(*ptet&PTE_P){
		if(PTE_ADDR(*ptet)==page2pa(pp)){
			*ptet=page2pa(pp)|perm|PTE_P;
			tlb_invalidate(pgdir, va);
			//cprintf("page_insert linear address is %08x, the physical is %08x\n",(uint32_t)va,*ptet);
			return 0;		   
		    
		}else{
		    page_remove(pgdir,va);
            *ptet=page2pa(pp)|perm|PTE_P;
		    //cprintf("page_insert linear address is %08x, the physical is %08x\n",(uint32_t)va,*ptet);
		    pp->pp_ref++;
			return 0;
		}		
	}else{
	    *ptet=page2pa(pp)|perm|PTE_P;
		 //cprintf("page_insert linear address is %08x, the physical is %08x\n",(uint32_t)va,*ptet);
		 pp->pp_ref++;
	}

	
	//cprintf("page_insert out\n");
	return 0;
}

pgdir_walk() : 用来查找对应线性地址的页表itemboot_map_region() : 进行地址映射,就是把当前的地址空间的分布,映射到新的页目录页表下的地址空间。注意PTE_Wpage_lookup():查找某个线性地址的页表item是否存在,返回对应的物理地址的pageinfo信息. 当需要pageinfo信息时,才调用这个函数 page_remove():  page_insert(): 将某个物理页映射到某个线性地址。

Part3 

Exercise5: 

boot_map_region(kern_pgdir,UPAGES,ROUNDUP(npages*sizeof(struct PageInfo),PGSIZE),PADDR(pages), PTE_U | PTE_P);
 boot_map_region(kern_pgdir,KSTACKTOP-KSTKSIZE,KSTKSIZE,PADDR(bootstack),PTE_W|PTE_P);
 boot_map_region(kern_pgdir,KERNBASE,1<<28,0,PTE_W|PTE_P);
注意:PTE_W,否则即使 check_kern_pgdir() 通过,页目录切换lrc3时也会出错!!!!
我根据赵炯的书上,这本书上说,当特权用户时,PTE_W不起作用,但是仿佛不是如此!
后来又查了查intel user mannual, 发现赵炯说的是对的,那为什么这里必须要设置PTE_W, 不清楚!!!

Question 2:
Question 3:使用PTE_U这个page drectory/page table选项。
Question 4:因为一开始内存只映射了4M, kernel用去一部分,剩下的全部用于管理内存的话,假设有A byte, 则可以管理的内存为(A/sizeof(struct Pageinfo))*4K
Question 5: 没明白overhead是啥意思!
Question 6: mov $relocated, %eax
                  jmp *%eax 这里的跳转指令跳转到0xfxxxxxxx的线性地址。因为这时的页机制,将线性地址0xf0000000+4M和0x00000000+4M都映射到了物理地址的0-4M之间。
Challenge 1: 4M也模式,映射变化了,需要重新编写我们的映射函数。
Challenge 2: 这个比较简单,调用我们编写的那几个函数就可以实现了。
Challenge 3:这个超级麻烦!如果user process单独使用4G线性地址空间,kernel如何访问user process地址空间呢? 就不能访问了吧? 只能在user proces和kernel process之间                    传递数据了吧??
Callenge 4:linux kernel使用buddy来实现连续物理地址的大内存的申请!!很复杂,看看kernel的书籍吧!!

其他:1. mem_init中映射pages和栈,啥时候用呢? 现在没用吧!!!

学习心得:原来底层编程这么回事,真的比较复杂。学习这个实验,对于我理解计算机体系结构真的帮助很大,对于编程的理解更加的深入了。
                 这些都可以研究明白,而且许多的牛人在研究这个方面,计算机行业,真的很庞大,许多需要学习呀!!!
2013.7.14-2013.7.21

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lab2 的相关文章

随机推荐

  • “对象创建”模式——构建器

    动机 在软件系统中 有时候面临着 一个复杂对象 的创建工作 其通常由各个部分的子对象用一定的算法构成 由于需求的变化 这个复杂对象的各个部分经常面临着剧烈的变化 但是将它们组合在一起的算法却相对稳定 如何应对这种变化 如何提供一种 封装机制
  • SqlServer的for xml path函数

    这两天在处理一个字符串拼接遇到一个问题 老师姓名 学科 张老师 语文 张老师 数学 张老师 英语 李老师 体育 李老师 音乐 需要将上面的记录转换成 老师姓名 学科 张老师 语文 数学 英语 李老师 体育 音乐 想了一些办法来处理 都感觉不
  • zabbix 之脚本实现企业微信报警及报警升级

    文章目录 一 微信报警 一 对被检测主机创建指定监控项和触发器 二 注册企业微信 三 zabbix服务段配置 四 web监控界面媒介告警配置 五 验证 二 报警升级 一 微信报警 目的 被监控主机test01的mysql服务不可用时立即发送
  • kaggle操作入门

    pip install kaggle kaggle gt Account gt API gt Create New API Token 下载得到 kaggle json 文件 Linux 存放到 home xxx kaggle 中 xxx表
  • 【软考】-高项-范围管理-重要知识点思维导图

    范围管理 文章目录 范围管理 产品范围 项目范围 范围蔓延 镀金 范围潜变 范围蔓延 范围管理计划 含义 包含内容 需求管理内容 需求管理计划 含义 包含内容 作用 可指导 收集需求 工具与技术 访谈 麦肯锡方法 含义 分类 结构化 非结构
  • C++中运算重载和定时器函数的实现

    一 概念 1 在operate函数内实现你想实现的具体的运算操作 这样一来不单单只可以对普通的数进行加减操作 可以对类进行加减操作 在operate函数内实现的加减的具体实现过程就可以 2 运算符重载 就是对已有的运算符重新进行定义 赋予其
  • shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例

    shell脚本系列 10 快速上手bash脚本 简单有效的shell脚本示例 文章目录 shell脚本系列 10 快速上手bash脚本 简单有效的shell脚本示例 前言 1 hello world 2 使用echo打印 3 使用注释 4
  • python利用matplotlib进行可视化

    利用matplotlib进行可视化 1 Matplotlib 基本介绍 Matplotlib 是一个在 python 下实现的类 matlab 的纯 python 的第三方库 旨在用 python实现matlab 的功能 是python下最
  • Flutter Json对象和数组解析成实体类

    1 解析json对象 准备一个json 对象数据 String json res true age 12 Name 张三 使用JSON to Dart 工具自动生成实体类 也可以自己手动写 工具地址 JSON to Dart 将代码复制到类
  • TCP标志位 FIN和RST的区别

    大家都知道TCP释放连接需要四次挥手 主动释放端会发送FIN包 并且因为TCP是双工的 关闭一个方向上的数据流 从而TCP连接处于半关闭状态 这也是为什么需要 四次 挥手的原因 以上所述四次挥手是一种 有序释放 即 标志位为FIN的TCP报
  • 数据结构---二叉树路径问题

    二叉树路径问题 二叉树所有路径 分析 JAVA实现 力扣提交 找到一个和为sum的到达叶子节点的路径 分析 JAVA实现 力扣提交 求路径 中间一段 C 实现 打印根节点到任意节点的路径 JAVA实现 二叉树所有路径 257二叉树所有路径
  • STM32G473VET6 FlashDB数据库移植(裸机、片内Flash)

    STM32G473VET6 FlashDB数据库移植 裸机 片内Flash 此文档也适用于STM32G070 源码下载 此处使用FlashDB官方最新源码 FlashDB 一款支持 KV 数据和时序数据的超轻量级数据库 gitee com
  • Java 实现连接sql server 2000(JDBC数据库访问例子)

    刘金龙 04041222 ljlsunny vip sina com 第一种 通过ODBC连接数据库 JAVA语言的跨平台的工作能力 Write Once Run Anywhere 优秀的图像处理能力 我相信现在没有那种语言可以超过JAVA
  • vim+taglist+ctags+cscope+自动补齐

    下载地址 http download csdn net detail shichaog 8676365 vim命令录制于回放 script t 2 gt time log a vim hacking taglist txt scriptre
  • 【数据结构】

    博客新人 希望大家一起加油进步 乾坤未定 你我皆黑马 目录 1 搜索树 Tree 1 1 概念 1 2 操作 查找 1 3 操作 插入 1 4 操作 删除 难点 1 5 性能分析 2 搜索 2 1 概念及场景 2 2 模型 3 Map的使用
  • 物联网LoRa系列-22:LoRa终端--射频芯片SX1261 SX1262的LoRa专用调制解调器与配置

    目录结构 1 SX1261 2功能模块 2 调制技术的基本原理 3 LoRa调制解调的介绍 4 LoRa调制解调的寄存器设置 1 SX1261 2功能模块 MCU与SX1261 2物理上通过两组接口进行通信 1 SPI总线 2 GPIO中断
  • 微信小程序webview清除缓存、微信公众号h5清除缓存、页面白屏、空白、不刷新问题

    一 缓存带来的问题和原因 我们在发布新版本的时候 在打开微信小程序webview嵌套的h5页面或微信公众号h5页面时 常常会发现页面还是上个版本的旧页面或者打开直接空白 白屏了 那么为什么会存在这个问题呢 原因是微信浏览器为了提高性能 自带
  • 让玩家移动到鼠标点击的位置

    bool finish true Vector3 pos public int speed 10 void Start void Update if Input GetMouseButtonDown 0 Ray ray Camera mai
  • 不要做”积极废人”

    确切的说 我算是一个积极废人 最近对我来说有几个思想上大的进步 虽然看起来很简单 但是能够彻底的接受和全新接受 还是需要一些时间的 第一个是对于RESTful的思想 从最近的一些实践和使用情况来看 对系统的设计和模块间轻耦合是有很大的帮助的
  • lab2

    Part1 Exercise 1 boot alloc if n result nextfree return result else uint32 t remainingPages npages uint32 t nextfree uin