南京大学计算机系统实验报告,南京大学 计算机系统基础 课程实验 2018(PA3)

其他部分:

这一部分应该算是最简单的一部分了,几乎就是按照文档的做就可以了,但是有几个问题值的关注

一个系统调用的生命周期是什么

使用navy-apps/tests/hello作为例子分析

从printf会调用klib中间的printf 函数,至于为什么不是调用Nemu中间实现的或者系统的printf以后会讲到。

printf("Hello World from Navy-apps for the %dth time!\n", i ++);

klib中间经过反复调用各种函数,最终会到达nano.c中间。这里大家就把klib当做一个黑盒子,我看一下其中的代码,说实话,有一种读天书的感觉。

nano.c 中间定义了大量的系统调用其中就包括需要使用_write

int _write(int fd, void *buf, size_t count){

return _syscall_(SYS_write, fd, (intptr_t)buf, count);

}

nano.c 中间封装了syscall的调用原理,也就是使用0x80号中断

intptr_t _syscall_(int type, intptr_t a0, intptr_t a1, intptr_t a2) {

int ret = -1;

asm volatile("int $0x80" : "=a"(ret) : "a"(type), "b"(a0), "c"(a1), "d"(a2));

return ret;

}

system.c 定义在Nemu模块中间,包含有int的处理函数

make_EHelper(int) {

uint8_t int_NO = id_dest->val;

raise_intr(int_NO, *eip);

print_asm("int %s", id_dest->str);

}

intr.c 中间定义raise_intr函数读取CPU的中断向量表的入口地址,并且开始执行函数,目前raise_intr函数只会被int调用,在PA4中间还可以被时钟中断调用的。

void raise_intr(uint8_t NO, vaddr_t ret_addr) {

rtl_push(&cpu.eflags);

cpu.IF = 0; // assume we forbit every all IF in the interrupt

rtl_push(&cpu.cs);

rtl_push(&ret_addr); // eip

uint32_t a = vaddr_read(idtr_addr + sizeof(GateDesc) * NO, 4);

uint32_t b = vaddr_read(idtr_addr + sizeof(GateDesc) * NO + 4, 4);

uint32_t entry_addr = (a & 0xffff) | (b & 0xffff0000);

rtl_j(entry_addr);

}

cte.c中间_cte_init函数实现创建了各种终端号的入口地址,都是使用函数的形式定义的。

trap.S中间定义了函数入口,并且在asm_trap函数中间写下一些列的汇编,其中有一个非常关键的操作。调用函数之前push,根据i386的函数调用规则,push的内容就是参数,也就是esp作为参数传入到一个irq_handle的函数中间了。

pushl %esp

call irq_handle

cte.c 中间定义了irq_handle函数,该函数的参数竟然是Context *, 上一步中间说明了esp是参数,也就是调用irq_handle之前的一系列的push的操作就是构成了Context的的内容了。irq_handle 函数会调用一个函数指针,该函数指针指向的内容随架构变化,在x86-neum的架构下会指向do_event函数

irq.c中间定义了do_event函数,进一步调用do_syscall函数

syscall.c 中间定义syscall.c函数

fs.c 中间定义了fs_write函数来处理所有的读写操作,由于虚拟文件的封装,wiret函数会调用实现注册好的serial_write函数。

13.device.c中间包含了seraial_write函数就很简单了,_put()的输出就可以了

清楚了上面过程,整个PA3大概就可以做完了,中间可能会遇到各种bug, 只是需要一层一层的函数调用检查就可以了。

brk 的含义是什么

Nemu和AM是如何协同合作的

printf到底是谁的

随着试验的进行,大家逐渐会模糊一件事情,当你想要调试的时候,printf到底glibc提供的(也就是物理机上安装的操作系统上的运行时库提供的),还是klib提供的(就是哪一个嵌入式库提供的),还是Nemu中间的printf(就是PA2在Nemu中间实现的一系列的io函数)。当然其中使用Log函数是如何实现的。

目录 I 基础知识9 1 MINIX操作系统简介11 1.1 MINIX与UNIX . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.2 探索MINIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.3 编辑器:vi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.4 编译器:CC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.5 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2 Intel 8086体系结构19 2.1 8086 CPU结构. . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.2 运算器与指令部件. . . . . . . . . . . . . . . . . . . . . . . . 19 2.3 寄存器组. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.4 主存. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.5 堆栈. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.6 系统启动. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.7 二进制文件结构. . . . . . . . . . . . . . . . . . . . . . . . . . 25 3 ACK 8086汇编语言27 3.1 寻址. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.2 数据移动指令. . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.3 常量、标号、数据与全局变量. . . . . . . . . . . . . . . . . . 29 3.4 运算指令. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.5 标志位操纵指令. . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.6 串操作指令. . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.7 跳转、分支与循环. . . . . . . . . . . . . . . . . . . . . . . . 33 3.8 堆栈与子程序. . . . . . . . . . . . . . . . . . . . . . . . . . . 34 5 6 目录 4 实习:Hello World 37 4.1 Hello World程序. . . . . . . . . . . . . . . . . . . . . . . . . 37 4.2 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 II 汇编语言进阶41 5 C与汇编联合开发43 5.1 函数调用. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 5.2 全局与局部变量. . . . . . . . . . . . . . . . . . . . . . . . . . 45 5.3 编译与连接. . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 5.4 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 6 中断与I/O 49 6.1 中断. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 6.2 输入输出设备. . . . . . . . . . . . . . . . . . . . . . . . . . . 51 6.3 编写中断处理程序. . . . . . . . . . . . . . . . . . . . . . . . 51 6.4 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 7 实习:小游戏55 7.1 make工具. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 7.2 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 III 操作系统内核59 8 进程切换61 8.1 进程模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 8.2 进程的实现. . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 8.3 进程切换. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 8.4 中断嵌套. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 8.5 MiniOS中的进程切换. . . . . . . . . . . . . . . . . . . . . . . 68 8.6 操作系统实现原则. . . . . . . . . . . . . . . . . . . . . . . . 69 9 进程通信71 9.1 信号量. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 9.2 消息机制. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 9.3 消息机制的实现. . . . . . . . . . . . . . . . . . . . . . . . . . 76 9.4 调试消息内核. . . . . . . . . . . . . . . . . . . . . . . . . . . 78 目录7 10 实习:操作系统内核83 10.1 引导操作系统. . . . . . . . . . . . . . . . . . . . . . . . . . . 83 10.2 微内核与层次式操作系统结构. . . . . . . . . . . . . . . . . . 83 10.3 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 IV 轻量操作系统实现87 11 设备驱动程序89 11.1 设备驱动程序原理. . . . . . . . . . . . . . . . . . . . . . . . 89 11.2 键盘设备. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 11.3 屏幕设备. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 11.4 死锁的产生与预防. . . . . . . . . . . . . . . . . . . . . . . . 93 12 存储管理95 12.1 存储管理与系统调用服务进程. . . . . . . . . . . . . . . . . . 95 12.2 进程映像的创建与终止. . . . . . . . . . . . . . . . . . . . . . 97 12.3 替换进程映像. . . . . . . . . . . . . . . . . . . . . . . . . . . 98 13 文件系统101 13.1 文件与目录. . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 13.2 文件与目录管理. . . . . . . . . . . . . . . . . . . . . . . . . . 103 13.3 文件描述符. . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 14 实习:迷你操作系统109 14.1 一个简易的Shell . . . . . . . . . . . . . . . . . . . . . . . . . . 109 14.2 实习题. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 附录111 A vi常用命令113 B 虚拟机与外部的文件交换117
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值