南京大学 计算机科学与技术系 计算机系统基础 课程实验 2015
实验前阅读
- 2017/02/25
- ics2016 PA讲义见这里.
- 2015/12/31
- PA3提交情况见这里.
- 对于有抄袭现象的提交, 我们已经直接进行扣分处理, 因此不再公布抄袭名单. 如果你有抄袭行为, 并希望取得改正的机会, 可以联系yzh. 但不接受关于是否被判抄袭的询问.
- 2015/12/29
- PA4截止时间定为2016/01/18 23:59:59, 之后我们会对PA4的成绩进行统计, 把PA总成绩和理论课成绩汇总后上报到教务处, 因此截止时间之后不再接受任何提交. 另外任课老师没有允许我们公开PA部分的成绩, 如果你想知道成绩, 届时请向任课老师咨询.
- 为了及时统计课程感想的加分, 课程感想的截止时间提前到2016/01/18 23:59:59.
- 2015/12/21
- PA3已经截止
, 提交情况正在统计中, 请大家保持关注. - 有偿收集课程感想, 具体请见这里.
- PA3已经截止
- 2015/12/11
- PA4已发布, 最后截止日期待定(约2016/01/18前后), 请保持关注.
- 2015/12/06
- 修复了
init_mm()
中设置ucr3
时掩码错误的bug. 请在工程目录下手动执行git pull origin master
命令更新代码.
- 修复了
- 2015/11/15
- PA2提交情况见这里.
- 2015/11/14
- PA2已截止, PA3已发布.
PA2提交情况正在统计中, 请大家保持关注.- 在ramdisk driver中添加了边界检查, 拦截错误用法. 请在工程目录下手动执行
git pull origin master
命令更新代码. 部分同学没有正确理解ramdisk和内存的关系, 导致使用了不当的参数调用ramdisk_read()
和ramdisk_write()
, 请及时理解并更正. 我们将在后续PA中对这部分同学进行检查, 若发现仍未更正, 则扣除相应阶段的正确性分数.
- 2015/10/14
- 修复了虚拟磁盘文件大小不为512字节的倍数时会在
ide_io_handler()
中触发 assertion fail 的bug. 请在工程目录下手动执行git pull origin master
命令更新代码.
- 修复了虚拟磁盘文件大小不为512字节的倍数时会在
- 2015/10/06
- 修复了用户程序小于4096字节会在
load_elf_tables()
中触发 assertion fail 的bug. 请在工程目录下手动执行git pull origin master
命令更新代码.
- 修复了用户程序小于4096字节会在
- 2015/09/30
- 不使用虚拟机时, 务必通过poweroff关闭虚拟机. 简单地挂起虚拟机, 可能会造成虚拟机中的时间与实际时间不符, 轻则影响git log的记录, 重则会造成clock skew而导致make程序不能正常工作, 严重的还有可能损坏文件. 已经有同学因此而损坏了git记录, 请大家引以为鉴.
- PA1提交情况见这里.
- 我们在PA1中发现了如下的抄袭现象, 请如下同学在2015/10/07 23:59:59前找yzh确认, 否则将直接取消PA1的成绩, 并通知辅导员.
14122015*
抄14122015*
14122015*
抄14122015*
- 2015/09/28
- PA1已截止, PA2已发布.
PA1提交情况正在统计中, 请大家保持关注.
- 2015/09/20
- 修复了
init_regex()
中的Assert()
没有拦截正则表达式的语法错误, 最终导致在regex库中触发段错误的bug. 请在工程目录下手动执行git pull
命令更新代码. 本次更新还修复了其它bug, 请务必使用git pull
更新. 若在执行git pull
时发生代码合并的冲突, 请手动修改冲突处的代码, 修改后执行git add .
和git commit
完成代码的合并.
- 修复了
- 2015/09/18
- 新增答疑时间, 助教会到场进行答疑, 大家可以根据需要决定是否前往:
- 时间: 每周周六和周日晚上7:00~9:00
- 地点: 基础实验楼乙124
- 新增答疑时间, 助教会到场进行答疑, 大家可以根据需要决定是否前往:
- 2015/09/07
- 有部分同学遇到
gcc-doc
安装失败的问题, 请检查sources.list
中的源是否已添加contrib
和non-free
组件, 详细信息请参考PA0讲义. - PA0提交情况见这里. 讲义中已经写清楚提交要求, 但在提交的作业中, 仍然有同学没有遵守提交要求, 使用不符合要求的文件名或文件格式, 导致作业不能被脚本识别, 给我们带来了麻烦. 为此, 我们制定以下惩罚规则: 在PAi中因为违反提交要求而给我们带来了额外的麻烦, 将扣除该次PA中
i * 10%
的成绩. 按照这一规则, 违反提交要求的同学在PA0中暂时不会受到惩罚, 但如果在PA1中仍然违反提交要求, 将会扣除10%的成绩, 如此类推. - 我们已经发现了如下的抄袭现象, 请如下同学在2015/09/10 23:59:59前找yzh确认, 否则将直接取消PA0的成绩. 其它同学也要引以为鉴, 不要随便共享自己的工程.
141220*7*
抄141220*0*
141220*4*
抄141220*4*
- 有部分同学遇到
- 2015/09/06
- 请大家检查学生名单中是否有自己的学号, 如果没有, 请尽快和任课老师和教务员联系, 否则会影响成绩的录入.
- 2015/09/03
由于近期阅兵, 部分网络状态受到影响, 同学反应安装debian时在select and install software一步中出现错误. 可以通过断网解决该问题, 具体请参考这里.- 暑期汇编课上大家已经完成到PA0第1.6小节的内容, 这次大家需要把剩下的内容全部完成. 尤其是第1.7小节中关于开发跟踪的内容, 这部分内容与成绩直接挂钩, 一定要仔细阅读.
- PA0的成绩以本次提交为准, 报告中装系统的部分可以引用暑期汇编课时写的内容, 多写感想.
- 修复了通过
reg_test()
后提示指令未实现的错误, 在2015/09/03 10:50之前下载框架代码的同学需要手动解决该问题:- 执行
git pull
命令, 或 - 手动修改
Makefile
:
- 执行
- 2015/08/31
- 框架代码和PA1已经发布.
- 听闻大家已经在暑期的汇编课上完成了PA0, 但我们建议你在自己的笔记本电脑上重新安装虚拟机, 因为你以后很可能要熬夜完成PA. PA0截止时间为2015/09/06 23:59:59. 对于外专业选修本课程的同学, 可能需要麻烦你们在第一周腾出约15小时的时间来完成PA0了. 另外考虑到基础的不同, 对于外专业的同学, PA的迟交惩罚下降为10%.
- 实验前请先阅读为什么要学习计算机系统基础.
- 如果你在实验过程中遇到了困难, 并打算向我们寻求帮助, 请先阅读提问的智慧这篇文章.
- 如果你发现了实验讲义和材料的错误或者对实验内容有疑问或建议, 请通过邮件的方式联系余子濠(zihaoyu.x#gmail.com)
- The machine is always right. (机器永远是对的)
- Corollary: If the program does not produce the desired output, it is the programmer's fault.
- Every line of untested code is always wrong. (未测试代码永远是错的)
- Corollary: Mistakes are likely to appear in the "must-be-correct" code.
jyy曾经将它们作为fact提出, 事实上无数程序员(包括你的学长学姐)在实践当中一次又一次验证了它们的正确性, 因此它们在这里作为公理出现. 你可以不相信调试公理, 但你可能会在调试的时候遇到麻烦.
PA是充满挑战性的, 在实验过程中, 你会看到自己软弱的一面: 没到deadline就不想动手的拖延症, 打算最后抱大腿的侥幸, 面对英文资料的恐惧, 对不熟悉工具的抵触, 遇到问题就请教大神的懒惰, 多次失败而想放弃的念头, 对过去一年自己得过且过的悔恨, 对完成实验的绝望, 对将来的迷茫... 承认自己的软弱, 是成长的第一步; 对这样的自己的不甘, 是改变自己的动力. 做PA不仅仅是做实验, 更重要的是认识并改变那个软弱的自己. 即使不能完成所有的实验内容, 只要你坚持下来, 你就是非常了不起的! 你会看到成长的轨迹, 看到你正在告别过去的自己.
- 我们都是活生生的人, 从小就被不由自主地教导用最小的付出获得最大的得到, 经常会忘记我们究竟要的是什么. 我承认我完美主义, 但我想每个人心中都有那一份求知的渴望和对真理的向往, "大学"的灵魂也就在于超越世俗, 超越时代的纯真和理想 -- 我们不是要讨好企业的毕业生, 而是要寻找改变世界的力量. -- jyy
- 教育除了知识的记忆之外, 更本质的是能力的训练, 即所谓的training. 而但凡training就必须克服一定的难度, 否则你就是在做重复劳动, 能力也不会有改变. 如果遇到难度就选择退缩, 或者让别人来替你克服本该由你自己克服的难度, 等于是自动放弃了获得training的机会, 而这其实是大学专业教育最宝贵的部分. -- etone
- 这种"只要不影响我现在survive, 就不要紧"的想法其实非常的利己和短视: 你在专业上的技不如人, 迟早有一天会找上来, 会影响到你个人职业生涯的长远的发展; 更严重的是, 这些以得过且过的态度来对待自己专业的学生, 他们的survive其实是以透支南大教育的信誉为代价的 -- 如果我们一定比例的毕业生都是这种情况, 那么过不了多久, 不但那些混到毕业的学生也没那么容易survive了, 而且那些真正自己刻苦努力的学生, 他们的前途也会受到影响. -- etone
实验方案
理解"程序如何在计算机上运行"的根本途径是实现一个完整的计算机系统. 南京大学计算机科学与技术系 计算机系统基础
课程的小型项目(Programming Assignment, PA)将指导学生实现一个功能完备(但经过简化)的x86模拟器NEMU(NJU EMUlator), 通过实现NEMU来探究 程序在计算机上运行
的机理. NEMU受到了QEMU的启发, 结合了GDB调试器的特性, 并去除了大量与课程内容差异较大的部分. PA包括一个准备实验(配置实验环境)以及4部分连贯的实验内容:
- 简易调试器
- 指令系统
- 存储管理
- 中断与I/O
实验环境
- CPU架构: IA-32
- 操作系统: GNU/Linux
- 编译器: GCC
- 编程语言: C语言
如何获得帮助
在学习和实验的过程中, 你会遇到大量的问题. 除了参考课本内容之外, 你需要掌握如何获取其它参考资料.
但在此之前, 你需要适应查阅英文资料. 和以往程序设计课上遇到的问题不同, 你会发现你不太容易搜索到相关的中文资料. 回顾计算机科学层次抽象图, 计算机系统基础处于程序设计的下层, 这意味着, 懂系统基础的人不如懂程序设计的人多, 相应地, 系统基础的中文资料也会比程序设计的中文资料少.
如何适应查阅英文资料? 方法是尝试并坚持查阅英文资料.
搜索引擎, 百科和问答网站
为了查找英文资料, 你应该使用下表中推荐的网站:
搜索引擎 | 百科 | 问答网站 | |
---|---|---|---|
推荐使用 | 这里有google搜索镜像 | http://en.wikipedia.org | http://stackoverflow.com |
不推荐使用 |
一些说明:
- 一般来说, 百度对英文关键词的处理能力比不上Google.
- 通常来说, 英文维基百科比中文维基百科和百度百科包含更丰富的内容. 为了说明为什么要使用英文维基百科, 请你对比词条
前束范式
分别在百度百科, 中文维基百科和英文维基百科中的内容. - stackoverflow是一个程序设计领域的问答网站, 里面除了技术性的问题(What is ":-!!" in C code?)之外, 也有一些学术性(Is there a regular expression to detect a valid regular expression?)和历史相关的问题(Why is the linux kernel not implemented in c++?).
官方手册
官方手册包含了查找对象的所有信息, 关于查找对象的一切问题都可以在官方手册中找到答案. 通常官方手册的内容十分详细, 在短时间内通读一遍基本上不太可能, 因此你需要懂得"如何使用目录来定位你所关心的问题". 如果你希望寻找一些用于快速入门的例子, 你应该使用搜索引擎.
这里列出一些本课程中可能会用到的手册:
- Intel 80386 Programmer's Reference Manual (人手一本的i386手册)
- GCC 4.4.7 Manual
- GDB User Manual
- GNU Make Manual
- System V ABI for i386
- On-line Manual Pager (即man, 这里有一个入门教程)
GNU/Linux入门教程
jyy为我们准备了一个GNU/Linux入门教程, 如果你是第一次使用GNU/Linux, 请阅读这里.
许可协议
本作品采用知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆
许可协议进行许可.
要查看该许可协议, 可访问这里,
或者写信到 Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.