PA2.2&2.3
目录
思考题
1.什么是 API
API(Application Programming Interface)是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问原码,或理解内部工作机制的细节。
2.AM 属于硬件还是软件?
AM属于软件,是对底层的抽象。
AM 和操作系统一样。AM是一个抽象计算机模型,通过一组API实现对计算机底层细节的抽象,为程序运行提供最基本的软件支持,是最贴近硬件的软件。操作系统是位于硬件与软件之间,而AM也是位于NEMU(硬件)与软件之间,他们的功能都是通过API实现对硬件的抽象。
3.堆和栈在哪里?
- 在内存里
4.回忆运行过程
首先默认编译到x86-nemu
中,由ALL=dummy
可知make run
指令调用了nexus-am/am/arch/x86-nemu/img/run
启动nemu
来运行dummy.c
5.神奇的eflags
+-----+-----+------------------------------------+
| SF | OF | 实例 |
+-----+-----+------------------------------------+
| 0 | 0 | 2 - 1 |
+-----+-----+------------------------------------+
| 0 | 1 | 0xf0000000-0x00000001 |
+-----+-----+------------------------------------+
| 1 | 0 | 0x80000001-0x00000001 |
+-----+-----+------------------------------------+
| 1 | 1 | 0x0f000000-0x00000001 |
+-----+-----+------------------------------------+
6.这是巧合吗?
ja
无符号整数op1>op2
CF=0 AND ZF=0
jb
无符号整数op1<op2
CF=1 AND ZF=0
jg
带符号整数op1>op2
SF=OF AND ZF=0
jl
带符号整数op1<op2
SF≠OF
7.nemu的本质
lable1:
x = x - 1
a = a + 1
jne x, lable1
lable2:
y = y - 1
a = a + 1
jne y, lable2
还需要输入和输出功能,还需要通过图形界面进行交互
8.设备是如何工作的?
IO接口是连接CPU与外部设备的逻辑控制部件,其功能是协调CPU和外设之间的工作。CPU通过接口发送指令给设备,设备接受指令并执行后把结果通过接口传回CPU。
9. CPU 需要知道设备是如何工作的吗?
不需要,cpu
的作用主要是传递指令等待机器运行返回实验结果不需要知道进行了什么工作。
10. 什么是驱动?
驱动,是指驱动计算机里软件的程序。驱动程序全称设备驱动程序,是添加到操作系统中的特殊程序,其中包含有关硬件设备的信息。此信息能够使计算机与相应的设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。
驱动是操作系统与硬件之间的桥梁,操作系统有了驱动,才能调度硬件。一般应用程序在操作系统之上,利用操作系统提供的API完成相应的任务。
11. cpu
知道吗?
不需要,只需要把特定地址上的数值设定为指定的值即可。
12.再次理解volatile
O2优化下编译
gcc -O2 -o fun fun.c
查看反汇编
objdump -s -d fun > fun.txt
添加volatile
关键字的反汇编
不添加volatile
关键字的反汇编
若不加volatile
,则从反汇编中可看出少了很多指令,第11a7行会陷入死循环。
13.hello world
运行在哪里?
不一样,此helloworld
程序运行在AM
中,程序设计课上的运行在硬件层面
14.如何检测很多个键同时被按下?
当按下一个键的时候, 键盘将会发送该键的通码; 当释放一个键的时候, 键盘将会发送该键的断码。每当用户敲下/释放按键时, 将会把相应的键盘码放入数据寄存器, 同时把状态寄存器的标志设置为 1
, 表示有按键事件发生. CPU 可以通过端口 I/O 访问这些寄存器, 获得键盘码。每个按键的通码断码都不同,所以可以识别出不同的按键。
15.编译与链接Ⅰ
-
去掉
static
没遇报错
-
去掉
inline
该函数仅用
static
修饰,则为静态函数,只能被该函数所在文件引用,然而该文件并没用其他函数使用该函数,因此导致defined but not used
-
去掉
static
和inline
当多个文件包含同一个头文件时,而头文件中没有加上条件编译,就会独立的解释,然后生成每个文件生成独立的标示符。在编译器连接时,就会将工程中所有的符号整合在一起,由于,文件中有重名变量,于是就出现了重复定义的错误。
16.编译与链接Ⅱ(10分)
-
29个
此时
dummy
是静态局部变量,可以看到有29个文件重新编译,则有29个变量实体。 -
58
由于没初始化,两次定义的符号都是弱符号,编译器允许弱符号多次定义且编译器会把这两次当作两个不同的符号对待。重新编译后,仍然是那29个文件重新编译,则又多了29个该变量实体,则一共58个。
-
初始化
问题:变量重定义
原因:变量赋初值后则成为强符号,编译器不允许强符号多次定义,则报错。
17.I/O 端口与接口(10分)
-
地址范围:
1K=2^10,端口范围
0000H
~0400H
16根地址总线,寻址范围也就是216,因为1K=210,所以寻址范围为216/210=64K,地址范围
0000H
~FFFFH
-
I/O三种控制方式:程序直接控制、终端控制、DMA控制。
课本中由有这样的例子:
首先DMA控制器初始化,然后发送“启动DMA传送”命令以启动外设进行I/O操作,发送完“启动DMA传送”命令后, CPU转去执行其他进程,而请求I/O的用户进程被阻塞。在CPU执行其他进程的过程中,DMA控制器外设和主存进行数据交换。DMA控制器每完成一个数据的传送,就将字计数器减1,并修改主存地址,当字计数器为0时,完成所有I/O操作,此时,DMA控制器将向CPU发送“DMA完成”中断请求,CPU检测到后调出相应的中断服务程序执行。CPU在中断服务程序中,解除用户进程的阻塞状态而使用户进程进入就绪序列,然后中断返回,再回到被打断的进程继续执行。
常见于硬盘。
18. git log截图
实验题
1.实现剩余所有 x86 指令
由于在PA2.1中补全了绝大多数的指令所以导致在PA2.2 中测试时大部分的测试样例全都通过了
下面为补全指令之后全部的测试结果图
add-longlong
实现在nemu/src/cpu/exec/cc.c
中的TODO
内容填写switch语句
add
bit
bubble-sort
dummy
fact
fib
goldbach
if-else
leap-year
load-store
matrix-mul
max
min3
mov-c
movsx
mul-longlong
pascal
prime
quick-sort
recursion
select-sort
shift
shuixianhua
sub-longlong
sum
switch
to-lower-case
unalign
wanshu
string
hello-str
2.通过⼀键回归测试
在nemu
目录下输入bash runall.sh
进行一键测试结果如下
3.IN/OUT 指令
首先打开 nemu/include/common.h
中的宏定义HAS_IOE
填写opcode_table
/* 0xe4 */ IDEXW(in_I2a, in, 1), IDEX(in_I2a, in), IDEXW(out_a2I, out, 1), IDEX(out_a2I, out),
/* 0xec */ IDEXW(in_dx2a, in, 1), IDEX(in_dx2a, in), IDEXW(out_a2dx, out, 1), IDEX(out_a2dx, out),
之后在all-instr
中声明make_EHlper
make_EHelper(in);
make_EHelper(out);
补全函数在system.c
中
make_EHelper(in) {
//TODO();
t1 = pio_read(id_src->val, id_dest->width);//调用pio_read
operand_write(id_dest, &t1);//写入
print_asm_template2(in);
#ifdef DIFF_TEST
diff_test_skip_qemu();
#endif
}
make_EHelper(out) {
//TODO();
pio_write(id_dest->val, id_dest->width, id_src->val);//调用pio_write,直接写入
print_asm_template2(out);
#ifdef DIFF_TEST
diff_test_skip_qemu();
#endif
}
之后在nexus-am/am/arch/x86-nemu/src/trm.c
定义宏HAS_SERIAL
之后运行helloworld
实现运行
同时配置好X11
之后成功弹出了窗口
实现成功。
4.实现时钟设备
实现_uptime
函数ioe.c
之后进行测试实现更新时间
5.运行跑分项目
首先注释掉DEBUG
和DIFF-TEST
之后进入内部跑分
dhrystone
coremark
microbench
6.实现键盘设备
实现_read_key
函数在ioe.c
中
运行之后出现NEMU
界面,之后在界面中输入键盘键入信息即可
7.添加内存映射 I/O
在nemu/src/memory/mrmory.c
中填写paddr_read
和paddr_write
函数测试如下
8.运行打字小游戏
实现打字小游戏
遇到的问题及解决方法
-
遇到的问题:在实现键盘设备
keytest
时虽然实现了_read_key
函数并且无错误到那时还是在运行时显示不出读取的键盘信息解决方案:经过查找问题发现,运行需要触发图形界面需要连接到
Xming
打开之后需要设置PUTTY
中的X11
连接之后在运行就可以成功实现了
心得感悟
本次实验难度不太大,有了PA2.1实验的基础之后添加令变得有思路起来,之后实现的各种冯诺依曼据计算机的基础功能也是依赖于前面学到的一部分的知识,同时指令实现优势对之前的学过的指令的复习过程,最后实现打字小游戏还是有成就感的,这次的实验可以更加了解到计算机的各种功能,较为深入但是i理解起来并不繁琐。
备注
明天会更好,助教真帅
原文地址:https://www.cnblogs.com/shangjin2001/p/15102149.html
- 【解疑答惑】css中经常被忽略的代码陷阱
- 时间序列预测全攻略(附带Python代码)
- “鼠标移入显示悬浮框”特效,也可以“高大上”
- 用交叉验证改善模型的预测表现(适用于Python和R)
- 前端特效制作 | CSS3圆形风格面包屑导航
- CSS3 倒影
- 写一只具有识别能力的图片爬虫
- 【今日问题】变量未初始化引起的崩溃
- 前端特效开发 | 点击查看大图相册效果
- 开发 | 星际争霸2人工智能研究环境 SC2LE 初体验
- 开发 | 我做了12万条的影评分析,告诉你《战狼Ⅱ》都在说些啥
- JavaScript | 函数定义的两种方法;预编译与执行
- jQuery特效 | 导航底部横线跟随鼠标缓动
- JavaScript | 选中并获取多行文本框内容的效果
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- LDheatmap|SNP连锁不平衡图(LD)可视化,倒三角图?
- Oracle 表分区笔记
- Java并发编程
- 让终端支持https,移植OpenSSL和libcurl到嵌入式linux,遇到的问题总结
- ComplexHeatmap|根据excel表绘制突变景观图(oncoplot)
- R-plotly|甘特图(Gantt chart)- 一不小心年中了,立个flag
- XXE漏洞那些事儿(JAVA)
- Hexo 建站过程
- Tidyverse|tidyr数据重塑之gather,spread(长数据宽数据转化)
- fastjson中的jndi注入
- R|生存分析-结果整理
- 实验吧-因缺思汀的绕过
- MySQL 用户与授权管理详解
- 基本知识|R语言简单饼图的绘制
- 分享一个有趣且牛逼的漏洞