BUAA-2025-OS-Lab3
lab3实验报告一、思考题Thinking 3.1请结合MOS中的页目录自映射应用解释代码中e-env_pgdir[PDX(UVPT)] PADDR(e-env_pgdir) | PTE_V 的含义。e-env_pgdir[PDX(UVPT)] PADDR(e-env_pgdir) | PTE_VUVPT意为User Virtual Page Table是用户新建进程页表虚拟地址的起始地址PDX(UVPT)获得的是该虚拟地址的页目录号该页目录项就是指向页目录本身的页目录项通过PADDR(e-env_pgdir)获得其物理地址而其权限通过PTE_V设置为只读页表基地址UVPT页目录基地址UVPTUVPT10映射到该页目录项的页表项的基地址UVPTUVPT10UVPT20该页表项是第几个页目录项UVPT202UVPT22PDX(UVPT)Thinking 3.2elf_load_seg 以函数指针的形式接受外部自定义的回调函数 map_page。 请你找到与之相关的data这一参数在此处的来源并思考它的作用。没有这个参数可不可以为什么?data是传入的进程控制块指针在load_icode中将进程控制块e通过参数data传入elf_load_seg在elf_load_seg中将data传入回调函数map_page中回调函数mape_page即为load_icode_mapper在该函数中将data解析为进程控制块以获得进程页目录和asid作用在增加虚拟地址到物理地址的映射时提供env_pgdir和env_asid没有这个参数不可以因为如果没有data参数那么在load_icode_mapper中就无法获得进程的页目录和asid同时该参数的存在也提高了程序的可拓展性使得其他结构体也可以使用该函数Thinking 3.3结合 elf_load_seg 的参数和实现考虑该函数需要处理哪些页面加载的情况。段首地址不对齐将不对齐的地方从offset开始先映射到内存中intr;size_ti;u_long offsetva-ROUNDDOWN(va,PAGE_SIZE);if(offset!0){if((rmap_page(data,va,offset,perm,bin,MIN(bin_size,PAGE_SIZE-offset)))!0){returnr;}}循环将与完整页大小相等数据完整的部分映射到内存中/* Step 1: load all content of bin into memory. */for(ioffset?MIN(bin_size,PAGE_SIZE-offset):0;ibin_size;iPAGE_SIZE){if((rmap_page(data,vai,0,perm,bini,MIN(bin_size-i,PAGE_SIZE)))!0){returnr;}}bin_sizesgsize循环创建新页但不向其中写入内容/* Step 2: alloc pages to reach sgsize when bin_size sgsize. */while(isgsize){if((rmap_page(data,vai,0,perm,NULL,MIN(sgsize-i,PAGE_SIZE)))!0){returnr;}iPAGE_SIZE;}Thinking 3.4思考上面这一段话并根据自己在Lab2中的理解回答你认为这里的env_tf.cp0_epc存储的是物理地址还是虚拟地址?虚拟地址epc存储的是发生错误时的CPU所指的指令地址对于CPU来说指令和数据都存储在内存中读取指令和内存所需要的都是虚拟地址。因此env_tf.cp0_epc所存储的是虚拟地址Thinking 3.5试找出0、1、2、3号异常处理函数的具体实现位置。8号异常系统调用 涉及的do_syscall()函数将在Lab4中实现。0号异常位于kern/genex.S中NESTED(handle_int, TF_SIZE, zero) mfc0 t0, CP0_CAUSE mfc0 t2, CP0_STATUS and t0, t2 andi t1, t0, STATUS_IM7 bnez t1, timer_irq timer_irq: li a0, 0 j schedule END(handle_int)1、2、3号异常位于kern/genex.S中使用BUILD_HANDLER宏定义实现.macro BUILD_HANDLER exception handler NESTED(handle_\exception, TF_SIZE 8, zero) move a0, sp addiu sp, sp, -8 jal \handler addiu sp, sp, 8 j ret_from_exception END(handle_\exception) .endm BUILD_HANDLER tlb do_tlb_refill #if !defined(LAB) || LAB 4 BUILD_HANDLER mod do_tlb_mod BUILD_HANDLER sys do_syscall #endif BUILD_HANDLER reserved do_reservedThinking 3.6阅读entry.S、genex.S和env_asm.S这几个文件并尝试说出时钟中断在哪些时候开启在哪些时候关闭。开启在异常处理handle_int中通过调用timer_irq跳转到schedule函数该函数调用env_run最终调用env_pop_tf来设置新进程的上下文环境且最后跳转到ret_from_exception此时eret将EXL设置为0且Status中UM、IE均为1表示用户模式且开启了中断FEXPORT(ret_from_exception) RESTORE_ALL eret关闭entry.S中在异常分发时关闭时钟中断mfc0 t0, CP0_STATUS and t0, t0, ~(STATUS_UM | STATUS_EXL | STATUS_IE) mtc0 t0, CP0_STATUS # 清除Status寄存器中的UM、EXL、IE位以保持处理器处于内核态UM0、关闭中断且允许嵌套异常Thinking 3.7阅读相关代码思考操作系统是怎么根据时钟中断切换进程的。每次触发时钟中断操作系统都会跳转到异常处理程序handle_int该函数通过调用timer_irq跳转到schedule函数在该函数中当count减为0时分给该进程的时间片用完或者未调度过任何进程或者当前进程不再就绪或者yield参数指定必须发生切换首先判断当前进程是否仍再就绪如果是就将其从链表头部移除加入就绪链表的尾端取出链表头部的一个进程将优先级设置为时间片数运行该取出的线程二、难点分析进程进程控制块(lab3中所使用的部分)structEnv{structTrapframeenv_tf;// saved context (registers) before switching// 在发生进程调度,或当陷入内核时,会将当时的进程上下文环境保存在 env_tf 变量中.LIST_ENTRY(Env)env_link;// intrusive entry in env_free_list// 类似于pp_link,用来创建空闲链表env_free_listu_int env_id;// unique environment identifier// 进程独一无二的标识符u_int env_asid;// ASID of this envu_int env_parent_id;// env_id of this envs parent// 记录父进程的进程idu_int env_status;// status of this env// 记录进程的状态,空闲状态,阻塞状态,执行状态或者就绪状态Pde*env_pgdir;// page directory// 保存了该进程页目录的内核虚拟地址TAILQ_ENTRY(Env)env_sched_link;// intrusive entry in env_sched_list// 用于构造调度队列env_sched_listu_int env_pri;// schedule priority// 进程的优先级}TAILQ开头的宏定义TAILQ_INIT初始化一个双端队列TAILQ_INSERT_HEAD插入到双端队列的头部TAILQ_INSERT_TAIL插入到双端队列的尾部TAILQ_INSERT_AFTER插入到双端队列某个元素之后TAILQ_INSERT_BEFORE插入到双端队列某个元素之前TAILQ_REMOVE从双端队列中删除某个元素TAILQ_FOREACH遍历双端队列模板页表创建模板页表时首先分配一页物理内存作为模板页表的页目录并将一些物理页面映射到该页表对应的虚拟地址空间中的特定虚拟页面上。在此过程中还会分配物理页面用于二级页表。当创建新进程时我们只需将模板页表的页目录项注 意仅复制相关的目录项添加到新进程的页目录中。这使得 所有用户进程能够共享相同的二级页表。页目录自映射e-env_pgdir[PDX(UVPT)] PADDR(e-env_pgdir) | PTE_V;UVPTUser Virtual Page Table是用户程序读取自己页表的入口意为将进程页目录中虚拟地址 UVPT 对应的页目录项置为存放该进程的页目录的物理页面的物理页号并将权限置为只读创建进程分配一个新的Env结构体设置进程控制块加载二进制镜像将程序载入到目标进程的地址空间宏拼接#defineENV_CREATE(x)\({\externu_char binary_##x##_start[];\externu_int binary_##x##_size;\env_create(binary_##x##_start,(u_int)binary_##x##_size,1);\})如果ENV_CREATE(program)进行宏拼接惠普将产生数组名binary_program_start进程运行与切换进程切换的条件count减为0时当前进程的时间片用完当前进程为null操作系统内核刚完成初始化暂无进程正在执行参数yield为1时当前进程需要让出当前进程被阻塞时不能继续执行让给其他进程切换的步骤如果当前进程需要切换进入if分支如果当前进程不为null且认为就绪态将其从就绪队列的头部删除加入到就绪队列的尾部取出当前就绪队列的头部元素判断该元素是否为null将时间片设置为该元素的优先级时间片自减运行该取出的进程中断与异常异常重入若UM位已经为0则代表待处理异常是在内核态被触发的对于异常重入的情况此时sp寄存器储存的栈指针已经指向内核异常栈使其继续增长这样就可以再异常中处理新的异常而不破坏原本的异常处理过程在使sp寄存器继续增长后执行正常的异常处理流程即可完成对异常重入的处理新增异常处理注册handle函数在genex.S中添加xx、do_xx添加如下代码BUILD_HANDLER xx do_xx在traps.c中更新异常向量组例如该异常为y号异常[y]handle_xx在kern/traps.c中编写异常处理函数voidhandle_xx(void)三、实验体会课下实验较lab2来说整个过程较为完整逻辑结构较为清晰在有了lab使用链表宏的经验上使得lab3对于链表宏的使用也较为熟练同时计组P7的知识也为lab3打下了良好的基础总得来说lab3的课下较lab2来说较为简单课上实验来说exam较为繁琐但跟着题目的提示也能很快、很有逻辑地找到解决的方法同时在受迫环境以及vim中下对于单词的拼写等最基本的步骤也需要谨慎extra其实较为清晰但对于立即数的符号拓展一直未能找到合理的方法实现~~不过这应该是对c语言的不熟练~~因此对c语言的熟练程度也需要不断提高

相关新闻

【Python-基础-基础语法】语法、数据类型、注释、运算符及编码等

【Python-基础-基础语法】语法、数据类型、注释、运算符及编码等

目录一、基础语法1.1 缩进规则1.2 变量与赋值1.3 编码声明二、数据类型2.1 数字类型(int、float、complex)2.2 文本类型(str)2.3 序列类型(list、tuple、range)2.4 映射类型(dict)2.…

2026/10/13 7:48:27 阅读更多 →
VS Windows下UDP组播发送接收程序:从原理到避坑实战

VS Windows下UDP组播发送接收程序:从原理到避坑实战

简介:这是一份面向Windows平台网络编程学习者的UDP组播(多播)发送与接收示例程序,适合具备一定C与Socket基础、希望掌握多播通信实现细节的开发者。资源围绕Winsock库展开,涵盖组播地址与多播组概念、套接字创建与绑定…

2026/10/13 7:48:30 阅读更多 →
Eclipse离线安装SVN插件site-1.8.22全攻略:从原理到避坑

Eclipse离线安装SVN插件site-1.8.22全攻略:从原理到避坑

简介:这份资源是面向 MyEclipse 10 开发者的 SVN 版本控制插件安装包,版本为 site-1.8.22,适合需要在 IDE 内直接管理项目源码、进行团队协作的 Java 开发人员。压缩包共 30 个文件,以 27 个 jar 类库为主,另含 1 个 d…

2026/10/13 7:48:33 阅读更多 →

最新新闻

基于Arduino与墨水屏的开源智能手表:低功耗长续航DIY方案

基于Arduino与墨水屏的开源智能手表:低功耗长续航DIY方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 9:04:00 阅读更多 →
代码卫生六步清扫:用AI技能系统治理代码库

代码卫生六步清扫:用AI技能系统治理代码库

代码卫生这件事,说起来不大,做起来真磨人。我自己的项目里,经常是"功能能跑就先跑",等回头要加需求或者排查线上问题的时候,面对一堆历史代码,那种"想清又不敢清"的憋屈感,…

2026/10/13 9:04:00 阅读更多 →
英文技术面试表达:问题-行动-结果铁三角实战法

英文技术面试表达:问题-行动-结果铁三角实战法

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 9:04:00 阅读更多 →
卷积神经网络热度图可视化:Grad-CAM原理与实战指南

卷积神经网络热度图可视化:Grad-CAM原理与实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 9:04:00 阅读更多 →
ESP32 ModbusTCP分片缓存与帧重组:从半包粘包到稳定通信

ESP32 ModbusTCP分片缓存与帧重组:从半包粘包到稳定通信

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 9:04:00 阅读更多 →
DCMTK Windows 64位解压即用:环境配置、命令行工具与C++集成实战

DCMTK Windows 64位解压即用:环境配置、命令行工具与C++集成实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 9:02:58 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →