没有合适的资源?快使用搜索试试~ 我知道了~
首页PA3-操作系统概念、系统调用和文件系统的实现
PA3-操作系统概念、系统调用和文件系统的实现
需积分: 0 9 下载量 162 浏览量
更新于2023-11-23
1
收藏 2.48MB PDF 举报
本次实验旨在通过PA3实验报告1来实现支持文件系统的操作系统,并能成功运行仙剑奇侠传。在这一过程中,主要包括以下几个内容: 1. 梳理了操作系统的概念,学习了系统调用,并实现了中断机制。 2. 通过了解文件系统的基本内容,实现了简易的文件系统。 3. 最终实现了支持文件系统的操作系统,成功运行了仙剑奇侠传批处理系统。 在实验过程中,一共分为三个阶段。在第一阶段,实现了最简单的操作系统,包括上下文管理的抽象、设置异常入口地址、触发自陷操作和保存/恢复上下文等功能。 在第二阶段,加载了第一个用户程序和实现了系统调用、堆区管理等功能。 在第三阶段,实现了简易的文件系统,并支持了运行仙剑奇侠传批处理系统。 遗留问题包括上次实验中时钟间隔不正确和键盘输入字符无法识别的问题,需要进一步解决。 实验的目的在于梳理操作系统概念,学习系统调用并实现中断机制,了解文件系统的基本内容并实现简易的文件系统,最终实现支持文件系统的操作系统并成功运行仙剑奇侠传。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/86286344/bg5.jpg)
x86中提供 int 指令作为自陷指令,异常入口地址由门描述符来指示。x86提供一个叫IDT的
数组来管理门描述符,而IDT的首地址和长度,由IDTR寄存器来指示。因此操作系统事先把
IDT准备好,然后调用 lidt 指令,在IDTR中设置好相应值,当程序执行到自陷指令或者触发
异常,就会按照设置好的IDT跳转。
当触发异常后硬件的相应过程如下:
1. 依次将eflags, cs(代码段寄存器), eip(也就是PC)寄存器的值压栈
2. 从IDTR中读出IDT的首地址
3. 根据异常号在IDT中进行索引, 找到一个门描述符
4. 将门描述符中的offset域组合成异常入口地址
5. 跳转到异常入口地址
当异常处理结束后恢复到触发异常前的状态。x86通过 iret 指令从异常处理过程中返回,将
栈顶3个元素解释为eip,cs,eflags并恢复。
将上下文管理抽象为CTE
3.4
操作系统在上下文管理上需要知道:
1. 首先当然是引发这次执行流切换的原因, 是程序除0, 非法指令, 还是触发断点, 又或者是
程序自愿陷入操作系统? 根据不同的原因, 操作系统都会进行不同的处理.
2. 然后就是程序的上下文了, 在处理过程中, 操作系统可能会读出上下文中的一些寄存器,
根据它们的信息来进行进一步的处理. 例如操作系统读出PC所指向的非法指令, 看看其
是否能被模拟执行. 事实上, 通过这些上下文, 操作系统还能实现一些神奇的功能, 你将会
在PA4中了解更详细的信息.
上面两点用数据结构 _Event 和 _Context 来表示。
还有两个API:
1. int _cte_init(_Context* (*handler)(_Event ev, _Context *ctx)) 用于进行
CTE相关的初始化操作. 其中它还接受一个来自操作系统的事件处理回调函数的指针, 当
发生事件时, CTE将会把事件和相关的上下文作为参数, 来调用这个回调函数, 交由操作
系统进行后续处理.
2. void _yield() 用于进行自陷操作, 会触发一个编号为_EVENT_YIELD事件.
设置异常入口地址
3.4.1
首先开启 nanos-lite/include/common.h 中的 HAS_CTE 宏
然后跳转到 _cte_init 方法,通过 set_idt 方法李的 lidt 指令来初始化IDTR
IDTR
3.4.1.1
在CPU的寄存器中添加IDTR寄存器
lidt
3.4.1.2
lidt 执行函数如下
struct
{
uint16_t limit;
uint32_t base;
} IDTR;
![](https://csdnimg.cn/release/download_crawler_static/86286344/bg6.jpg)
触发自陷操作
3.4.2
raise_intr
3.4.2.1
根据异常响应机制步骤如下:
寄存器
3.4.2.2
在CPU的寄存器中添加CS寄存器
寄存器初始化
3.4.2.3
在 nemu/src/isa/x86/init.c 中的 restart 方法中添加初始化代码
make_EHelper(lidt)
{
// TODO();
cpu.IDTR.limit = vaddr_read(id_dest->addr, 2);
cpu.IDTR.base = vaddr_read(id_dest->addr + 2, 4);
print_asm_template1(lidt);
}
void raise_intr(uint32_t NO, vaddr_t ret_addr)
{
/* TODO: Trigger an interrupt/exception with ``NO''.
* That is, use ``NO'' to index the IDT.
*/
uint32_t hi, lo;
assert(NO <= cpu.IDTR.limit);
rtl_push((rtlreg_t *)&cpu.eflags);
rtl_push(&cpu.CS);
rtl_push(&ret_addr);
lo = vaddr_read(cpu.IDTR.base + 8 * NO, 4) & 0x0000ffffu;
hi = vaddr_read(cpu.IDTR.base + 8 * NO + 4, 4) & 0xffff0000u;
#ifdef DEBUG
uint32_t target_addr = hi | lo;
Log("Target_Addr=0x%x", target_addr);
#endif
rtl_j(hi | lo);
}
rtlreg_t CS;
剩余25页未读,继续阅读
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/cf3ec96bb5c149feb0abeea9bad8f284_weixin_35789559.jpg!1)
航知道
- 粉丝: 29
- 资源: 301
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- Vue实现iOS原生Picker组件:详细解析与实现思路
- Arduino蓝牙小车:参数调试与功能控制
- 百度Java面试精华:200页精选资源涵盖核心知识点
- Swift使用CoreData填坑指南:CoreData在Swift 3.0的变化
- 微距离无线充电器创新设计及其实验探索
- MTK Android平台开发全攻略:44步详解流程
- RecyclerView全面解析:替代ListView的新选择
- Android开发:自动适配中英文键盘解决方案
- Android调用WebService接口教程
- Android开发:BitmapUtil图片处理全解析与实例
- Android多线程断点续传实现详解
- PCA算法在人脸识别会议签到系统中的应用
- EventBus 3.0:Android事件总线详解与实战应用
- Android FileUtil:全面解析文件操作实用技巧与实例
- RecyclerView添加头部和尾部实战教程
- Android实现微博滑动固定顶部栏实战与优化
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)