南京大学 计算机系统基础 课程实验 2018(PA0-1)

申明,本人并非是南京大学的学生,此实验一共完成其中四部分,试验环境为Manjaro(并非PA0中间的docker) + SpaceVim, 此文为记录试验的部分心得。

PA0

正如在本课程试验中间反复提到的基础设施的重要性,比如PA1 中间gdb的构建,PA2 中间的diff test 创建,同样的搭建一个良好的试验环境也可以让自己注意力集中关键的部分。

方案一:vs code

方案二: vim

不推荐不熟悉vim的用户使用此方案。

无论采用哪一个方案,务必保证可以实现符号跳转,全局符号搜索和文件搜索的功能。

PA1

PA1 主要作用是熟悉工程的架构,有一个平缓的学习曲线,和后面试验关系不大(我完成了PA4,才把这一部分补充完整的, 个人感觉debug 主要依赖于diff test), 试验的难点主要有两个方面:

  1. 表达式的求值
  2. watchpoint 的链表操作

表达式的求值

其中表达式的求值更加麻烦,我采用的方案并不是实验指导书中间的策略,而是使用的逆波兰表达式求值。

使用逆波兰表达式写了一半的时候突然发现似乎没有办法处理单目表达式的, 也就是说对于如下的表达式都是没有办法处理

12 +-12 // 没有办法正确的处理 -12
*0x4000000  + 12 // 无法处理取地址符

其实处理的办法很简单,在使用逆波兰表达式求值之前遍历一遍表达式,如果一个运算符的左侧不是数值那么改operator必定是单目的。

参看此链接实现普通表达式到逆波兰表达式的装换,
https://en.wikipedia.org/wiki/Shunting-yard_algorithm
但是这一个算法在本实验中间有两点需要做出两个说明:

  1. 不用实现函数
  2. 为了方便实现,需要把所有需要符号设置为右结合的,也就是

(the operator at the top of the operator stack has equal precedence and is left associative) 这一个条件不使用

关于结合性, 使用如下例子

12 + 13 - 14
// + - 都是左结合,对应的Reverse Polish 表达式为 12 13 14 + -
// 所有表达式设置为右结合,结果为 12 13 14 - +

表达式求值中间有一个非常坑的地方,那就是expr.c 中间定义了一个宏表示可以处理的最长的符号个数,对于如下测试样例:

(1 + (3 * 2) + (($eax - $eax) + (*$eip - 1 **$eip) + (0x5 -- 5 + *0x1000005 - *0x1000005)) * 4)

恰好超过了限制,这一个bug 非常难以发现。所以我建议大家做实验的时候首先将改宏设置为初始值的10倍

watchpoint 的链表操作

文档中间对于这一个实现描述已经非常的清楚了,每次CPU 执行的时候都检查数值watchpoint的求值是否发生变化,实现难度关键是链表的操作,如果不小心很容易造成死循环和segment fault, 我的建议是多写assert

其他的收获

Makefile的书写

先分析Makefile.git

define git_commit
    -@git add .. -A --ignore-errors
    -@while (test -e .git/index.lock); do sleep 0.1; done
    -@(echo "> $(1)" && echo $(STUID) && id -un && uname -a && uptime && (head -c 20 /dev/urandom | hexdump -v -e '"%02x"') && echo) | git commit -F - $(GITFLAGS)
    -@sync
endef

在此处定义git_commit函数,GNU Make 中间默认定义少量用于用于字符串处理函数
https://www.gnu.org/software/make/manual/html_node/Functions.html
下面是一个Makefile 自定义函数的教程:
https://coderwall.com/p/cezf6g/define-your-own-function-in-a-makefile

其中下面这一个最麻烦

-@(echo "> $(1)" && echo $(STUID) && id -un && uname -a && uptime && (head -c 20 /dev/urandom | hexdump -v -e '"%02x"') && echo) | git commit -F - $(GITFLAGS)

其运行结果如下:

> run
U201514545
shen
Linux shen-pc 4.20.0-1-MANJARO
#1 SMP PREEMPT Mon Dec 24 08:20:48 UTC 2018 x86_64 GNU/Linux
00:56:37 up 1:21, 1 user, load average: 0.79, 0.65, 0.47
d85114835383b139f02b1c1923a8ae33eaa5dc49

&& 分割开来都是命令,|分割则是重定向使用,整个表达式的作用就是将电脑的信息作为commit的内容,不是很懂为什么需要包含随机数到commit 中间,可能是为了发防止作弊吧。

再分析Makefile:
首先这是一个很不错的小模板,我不是很熟悉Makefile的语法,所以我认为以下几个知识点还是值的学习的。

  1. 几种不同的赋值
    https://stackoverflow.com/questions/448910/what-is-the-difference-between-the-gnu-makefile-variable-assignments-a
  2. include
  3. 自动创建依赖(目前没有搞清楚是怎么创建出来的那些依赖文件的)
  4. override(没有查看)
  5. .DEFAULT_GOAL(没有查看)
Nemu工程的源码分析

Nemu是i386模拟器,相当于计算机硬件基础,主要实现的功能是
decode(PA2), exec(PA2), 模式设备(借助SDL2库), gdb(本轮试验完成的) 和diff test(基础设施PA2)

├── include
├── Makefile
├── Makefile.git
├── README.md
├── runall.sh
├── src
│   ├── cpu
│   │   ├── decode
│   │   │   ├── decode.c
│   │   │   └── modrm.c
│   │   ├── exec
│   │   │   ├── all-instr.h
│   │   │   ├── arith.c
│   │   │   ├── cc.c
│   │   │   ├── control.c
│   │   │   ├── data-mov.c
│   │   │   ├── exec.c
│   │   │   ├── logic.c
│   │   │   ├── prefix.c
│   │   │   ├── relop.c
│   │   │   ├── special.c
│   │   │   └── system.c
│   │   ├── intr.c
│   │   └── reg.c
│   ├── device
│   │   ├── device.c
│   │   ├── io
│   │   │   ├── mmio.c
│   │   │   └── port-io.c
│   │   ├── keyboard.c
│   │   ├── serial.c
│   │   ├── timer.c
│   │   └── vga.c
│   ├── main.c
│   ├── memory
│   │   └── memory.c
│   ├── misc
│   │   └── logo.c
│   └── monitor
│       ├── cpu-exec.c
│       ├── debug
│       │   ├── expr.c
│       │   ├── ui.c
│       │   └── watchpoint.c
│       ├── diff-test
│       │   ├── diff-test.c
│       │   ├── diff-test.h
│       │   └── ref.c
│       └── monitor.c
└── tools
    ├── gen-expr
    │   ├── gen-expr.c
    │   └── Makefile
    └── qemu-diff
        ├── include
        │   ├── common.h
        │   └── protocol.h
        ├── Makefile
        └── src
            ├── diff-test.c
            ├── gdb-host.c
            └── protocol.c

在接下来试验PA2中间我会首先分析试验的难点,坑点,然后分析部分源代码和实现的技术。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容

  • 第一部分Common Lisp介绍第1章 介绍一下Lisp你在学的时候觉得已经明白了,写的时候更加确信了解了,教别...
    geoeee阅读 2,934评论 5 8
  • 来自陈浩的一片老文,但绝对营养。 示例工程:3 个头文件*.h,和 8 个 C 文件*.c。 初 编译过程,源文件...
    周筱鲁阅读 4,694评论 0 17
  • //作者:JRZAlan //备注:第一次做简书,希望能对大家起到帮助。 这是对一些计算机编程语言的一些英语单词,...
    JRZAlan阅读 16,813评论 0 77
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,380评论 0 5
  • 感恩早晨一觉醒来阳光灿烂,感恩学习ASKA,让我学习与情绪和平共处,学会感恩,感恩!感恩!感恩! 感恩当抱团小组的...
    幸福的小兔猪阅读 149评论 0 0