<!-- # 南京大学 计算机科学与技术系 计算机系统基础 课程实验 2024 -->

# Кафедра компьютерных наук и технологий Нанкинского университета, лабораторные задания курса «Введение в компьютерные системы», 2024

<!-- ## 实验前阅读 -->

## Материалы для чтения перед лабораторной работой

<!-- > #### info::最新消息(请每天至少关注一次)

> * [学术诚信(什么事情能做, 什么不能)](http://integrity.mit.edu/)

> * [常见问题(对PA的各种困惑)](FAQ.md)

> * 如何正确求助: 提问的智慧открыть в новом окне和别像弱智一样提问открыть в новом окне

> * 外部资源

> * PA习题课 (2023 秋季学期, 王慧妍открыть в новом окне老师): 课程资料открыть в новом окне

> * 中国大学MOOC的ICS理论课 (袁春风老师): 上открыть в новом окне, 中открыть в новом окне, 下открыть в новом окне

> * 南大SICP编程课открыть в новом окне

> * <span style="color:red">如果你觉得自己的编程基础不过关, 墙裂推荐自学这门课</span>

> * 虽然它教的是python, 但语言的语法是次要的, 对编程思维的锻炼才是最重要的

> * OS课открыть в новом окне (2023 春季学期, 蒋炎岩открыть в новом окне老师)

> * PA往期习题课

> * 2022 秋季学期, 王慧妍открыть в новом окне老师: 课程资料открыть в новом окне

> * 2021 秋季学期, 王慧妍открыть в новом окне老师: 课程资料открыть в новом окне

> * 2020 秋季学期, 蒋炎岩открыть в новом окне老师: 课程资料открыть в новом окне, B站录播открыть в новом окне

> ---

> * 2024/01/25

> * 本讲义目前处于测试阶段, 在2024年秋季学期开始前, 将被视为往届讲义材料.

> 如果你是修读2024年秋季ICS课程的学生, 请勿使用本讲义代替2024年秋季ICS课程的PA实验讲义,

> 提交本实验内容将被视为没有提交. -->

> #### info::Последние новости (пожалуйста, проверяйте хотя бы раз в день)

> * [Академическая честность (что разрешено, а что нет)](http://integrity.mit.edu/)

> * [FAQ (различные вопросы о PA)](FAQ.md)

> * Как правильно обращаться за помощью: Как правильно задавать вопросыоткрыть в новом окне和Как не следует задавать вопросыоткрыть в новом окне

> * Внешние ресурсы

> * Практические занятия по PA (осень 2023, преподаватель Wang Huiyanоткрыть в новом окне): Материалы курсаоткрыть в новом окне

> * Теоретический курс ICS на China University MOOC (преподаватель Yuan Chunfeng): Часть 1открыть в новом окне, Часть 2открыть в новом окне, Часть 3открыть в новом окне

> * Курс SICP Нанкинского университетаоткрыть в новом окне

> * <span style="color:red">Если вы чувствуете, что ваша база по программированию недостаточно сильна, настоятельно рекомендуется самостоятельно пройти этот курс</span>

> * Хотя в курсе используется Python, синтаксис языка вторичен; самое важное — развитие программистского мышления

> * OSоткрыть в новом окне (весна 2023, преподаватель: Jiang Yanyanоткрыть в новом окне)

> * Практические занятия по PA прошлых лет

> * Осень 2022, преподаватель Wang Huiyanоткрыть в новом окне: Материалы курсаоткрыть в новом окне

> * Осень 2021, преподаватель Wang Huiyanоткрыть в новом окне: Материалы курсаоткрыть в новом окне

> * Осень 2020, преподаватель Jiang Yanyanоткрыть в новом окне: Материалы курсаоткрыть в новом окне, Записи на Bilibiliоткрыть в новом окне

> ---

> * 2024/01/25

> * В настоящее время это руководство находится на этапе тестирования и до начала осеннего семестра 2024 года будет считаться материалом прошлых лет.

> Если вы обучаетесь на курсе ICS осенью 2024 года, пожалуйста, не используйте это руководство вместо лабораторного руководства PA курса ICS осени 2024 года.

> Отправка содержимого этой лабораторной работы будет считаться отсутствием сдачи.

<!-- > #### info::离线阅读实验讲义

> 实验讲义页面通过github page发布, 但其网络可能不稳定.

> 你可以把这个仓库открыть в новом окне克隆到本地, 然后通过浏览器来离线阅读讲义.

>

> 但随着讲义内容的更新, 你将无法自动地阅读到最新版本的内容.

> 你需要在仓库路径中手动执行`bash update.sh`来将最新版本的内容同步到本地.

> 再次强调, <span style="color:red">如果你选择了离线阅读方式, 将由你来负责获取最新的讲义内容. </span> -->

> #### info::Чтение руководства офлайн

> Страницы руководства этой лабораторной работы публикуются через GitHub Pages, однако сетевое соединение может быть нестабильным.

> Вы можете клонировать этот репозиторийоткрыть в новом окне на свой компьютер и читать руководство офлайн через браузер.

>

> Однако при обновлении содержимого руководства вы не будете автоматически получать доступ к последней версии.

> Чтобы синхронизировать последнюю версию содержимого с локальным компьютером, необходимо вручную выполнить `bash update.sh` в каталоге репозитория.

> Ещё раз: <span style="color:red">если вы выбираете офлайн-режим чтения, ответственность за получение последней версии руководства лежит на вас.</span>

<!-- > #### hint::如何求助

> * 实验前请先仔细阅读[本页面](.)以及[为什么要学习计算机系统基础](why.md).

> * 如果你在实验过程中遇到了困难, 并打算向我们寻求帮助,

> 请先阅读提问的智慧открыть в новом окне和别像弱智一样提问открыть в новом окне这两篇文章.

> * 如果你发现了实验讲义和材料的错误或者对实验内容有疑问或建议,

> 请通过邮件的方式联系余子濠(zihaoyu.x#gmail.com) -->

> #### hint::Как обращаться за помощью

> * Перед лабораторной работой внимательно прочитайте [эту страницу](.) и [Зачем изучать основы компьютерных систем](why.md).

> * Если во время лабораторной работы у вас возникнут трудности и вы захотите обратиться к нам за помощью, сначала прочитайте Как правильно задавать вопросыоткрыть в новом окне и Как не следует задавать вопросыоткрыть в новом окне.

> * Если вы обнаружили ошибки в лабораторных руководствах или материалах либо у вас есть вопросы или предложения по содержанию лабораторной работы, свяжитесь с Zihao Yu по электронной почте (zihaoyu.x#gmail.com).

<!-- -->

<!-- > #### hint::小百合系版"有像我一样不会写代码的cser么?"回复节选

> * 我们都是活生生的人, 从小就被不由自主地教导用最小的付出获得最大的得到, 经常会忘记我们究竟要的是什么.

> 我承认我完美主义, 但我想每个人心中都有那一份求知的渴望和对真理的向往,

> "大学"的灵魂也就在于超越世俗, 超越时代的纯真和理想

> -- 我们不是要讨好企业的毕业生, 而是要寻找改变世界的力量. -- jyy

> * 教育除了知识的记忆之外, 更本质的是能力的训练, 即所谓的training.

> 而但凡training就必须克服一定的难度, 否则你就是在做重复劳动, 能力也不会有改变.

> 如果遇到难度就选择退缩, 或者让别人来替你克服本该由你自己克服的难度,

> 等于是自动放弃了获得training的机会, 而这其实是大学专业教育最宝贵的部分. -- etone

> * 这种"只要不影响我现在survive, 就不要紧"的想法其实非常的利己和短视:

> 你在专业上的技不如人, 迟早有一天会找上来, 会影响到你个人职业生涯的长远的发展;

> 更严重的是, 这些以得过且过的态度来对待自己专业的学生,

> 他们的survive其实是以透支南大教育的信誉为代价的 -- 如果我们一定比例的毕业生都是这种情况,

> 那么过不了多久, 不但那些混到毕业的学生也没那么容易survive了,

> 而且那些真正自己刻苦努力的学生, 他们的前途也会受到影响. -- etone -->

> #### hint::Несколько цитат

> * Мы все живые люди, которых с детства невольно учат получать максимум при минимуме усилий, и из-за этого мы часто забываем, чего на самом деле хотим.

> Я признаю, что я перфекционист, но думаю, что в каждом человеке есть жажда знаний и стремление к истине.

> Душа «университета» заключается в способности выйти за пределы обыденности и сохранить чистоту и идеалы, неподвластные времени.

> -- Мы здесь не для того, чтобы выпускать удобных для компаний специалистов, а чтобы искать силу, способную изменить мир. -- jyy

> * Образование — это не только запоминание знаний; по своей сути это тренировка способностей, то есть training.

> Любая training требует преодоления определённых трудностей; иначе вы просто выполняете повторяющуюся работу, и ваши способности не развиваются.

> Если при столкновении с трудностями вы отступаете или позволяете другим преодолевать трудности, которые должны преодолеть сами,

> то фактически добровольно отказываетесь от возможности пройти training, а именно это является самой ценной частью профессионального университетского образования. -- etone

> * Идея «если это не мешает мне выживать прямо сейчас, значит проблемы нет» на самом деле очень эгоистична и недальновидна:

> Недостаток профессиональных навыков рано или поздно даст о себе знать и повлияет на долгосрочное развитие вашей карьеры.

> Что ещё серьёзнее, студенты, которые относятся к своей специальности по принципу «и так сойдёт»,

> фактически выживают за счёт репутации образования Нанкинского университета — если значительная доля наших выпускников будет такой,

> то вскоре не только тем, кто кое-как дотянул до выпуска, станет трудно выживать,

> но пострадают и перспективы тех студентов, которые действительно усердно работают. -- etone

<!-- ## 实验方案

理解"程序如何在计算机上运行"的根本途径是从"零"开始实现一个完整的计算机系统.

南京大学计算机科学与技术系`计算机系统基础`课程的小型项目

(Programming Assignment, PA)将提出x86/mips32/riscv32(64)架构相应的教学版子集,

指导学生实现一个经过简化但功能完备的x86/mips32/riscv32(64)模拟器NEMU(NJU EMUlator),

最终在NEMU上运行游戏"仙剑奇侠传", 来让学生探究"程序在计算机上运行"的基本原理.

NEMU受到了QEMUоткрыть в новом окне的启发, 并去除了大量与课程内容差异较大的部分.

PA包括一个准备实验(配置实验环境)以及5部分连贯的实验内容:

* 图灵机与简易调试器

* 冯诺依曼计算机系统

* 批处理系统

* 分时多任务

* 程序性能优化 -->

## План лабораторных работ

Основной способ понять, «как программы выполняются на компьютере», — построить полноценную компьютерную систему с нуля.

Лабораторный проект Programming Assignment (PA) курса «Основы компьютерных систем» кафедры компьютерных наук и технологий Нанкинского университета представляет учебные подмножества архитектур x86/mips32/riscv32(64).

Студенты реализуют упрощённый, но функционально полный эмулятор x86/mips32/riscv32(64) — NEMU (NJU EMUlator).

В конечном итоге студенты запустят игру «仙剑奇侠传» на NEMU, чтобы изучить базовые принципы того, «как программы выполняются на компьютере».

NEMU создан под влиянием QEMUоткрыть в новом окне, но из него удалены многие части, существенно отличающиеся от тем курса.

PA включает подготовительную лабораторную работу (настройку лабораторной среды) и пять связанных частей:

* Машина Тьюринга и простой отладчик

* Компьютерная система фон Неймана

* Система пакетной обработки

* Многозадачность с разделением времени

* Оптимизация производительности программ

<!-- ## 实验环境

* CPU架构: x64

* 操作系统: GNU/Linux

* 编译器: GCC

* 编程语言: C语言 -->

## Среда выполнения лабораторных работ

* Архитектура CPU: x64

* Операционная система: GNU/Linux

* Компилятор: GCC

* Язык программирования: C

<!-- ## 如何获得帮助

在学习和实验的过程中, 你会遇到大量的问题.

除了参考课本内容之外, 你需要掌握如何获取其它参考资料.

但在此之前, 你需要适应查阅英文资料.

和以往程序设计课上遇到的问题不同, 你会发现你不太容易搜索到相关的中文资料.

回顾计算机科学层次抽象图, 计算机系统基础处于程序设计的下层.

这意味着, 懂系统基础的人不如懂程序设计的人多, 相应地, 系统基础的中文资料也会比程序设计的中文资料少.

如何适应查阅英文资料? 方法是<span style="color:re">尝试并坚持查阅英文资料</span>. -->

## Как получить помощь

Во время обучения и выполнения лабораторных работ вы столкнётесь со множеством проблем.

Помимо обращения к учебнику, необходимо уметь находить другие справочные материалы.

Но прежде всего необходимо привыкнуть искать материалы на английском языке.

В отличие от задач предыдущих курсов по программированию, по этим темам вам будет сложнее найти подходящие материалы на китайском языке.

Если вспомнить иерархию абстракций computer science, основы компьютерных систем находятся на более низком уровне, чем курсы по программированию.

Это означает, что людей, разбирающихся в системных основах, меньше, чем людей, разбирающихся в программировании; соответственно, материалов на китайском языке по системным основам также меньше.

Как привыкнуть к поиску англоязычных материалов? Нужно <span style="color:re">пробовать и настойчиво продолжать искать материалы на английском языке</span>.

<!-- ### 搜索引擎, 百科和问答网站

为了查找英文资料, 你应该使用下表中推荐的网站:

| | 搜索引擎 | 百科 | 问答网站|

| --- | --- | --- | --- |

| 推荐使用 | 这里открыть в новом окне有google搜索镜像 | http://en.wikipedia.org | http://stackoverflow.com |

| 不推荐使用 | ~~http://www.baidu.com~~ | ~~http://baike.baidu.com~~ | ~~http://zhidao.baidu.com~~ <br> ~~http://bbs.csdn.net~~ | -->

### Поисковые системы, энциклопедии и сайты вопросов и ответов

Для поиска англоязычных материалов рекомендуется использовать сайты из таблицы ниже:

| | Поисковая система | Энциклопедия | Сайт вопросов и ответов |

| --- | --- | --- | --- |

| Рекомендуется | Здесьоткрыть в новом окне находится зеркало поиска Google | http://en.wikipedia.org | http://stackoverflow.com |

| Не рекомендуется | ~~http://www.baidu.com~~ | ~~http://baike.baidu.com~~ | ~~http://zhidao.baidu.com~~ <br> ~~http://bbs.csdn.net~~ |

<!-- 一些说明:

* 一般来说, 百度对英文关键词的处理能力比不上Google.

* 通常来说, 英文维基百科比中文维基百科和百度百科包含更丰富的内容.

为了说明为什么要使用英文维基百科, 请你对比词条`前束范式`分别在百度百科открыть в новом окне,

中文维基百科открыть в новом окне和英文维基百科открыть в новом окне中的内容.

* stackoverflow是一个程序设计领域的问答网站,

里面除了技术性的问题(What is ":-!!" in C code?открыть в новом окне)之外,

也有一些学术性(Is there a regular expression to detect a valid regular expression?открыть в новом окне)

和一些有趣的问题(What is the “” operator in C++?открыть в новом окне). -->

Несколько пояснений:

* В целом Baidu хуже Google обрабатывает поисковые запросы на английском языке.

* Как правило, английская Wikipedia содержит более богатый материал, чем китайская Wikipedia и Baidu Baike.

Чтобы понять, почему стоит пользоваться английской Wikipedia, сравните статью «前束范式» (prenex normal form) в Baidu Baikeоткрыть в новом окне,

китайской Wikipediaоткрыть в новом окне и английской Wikipediaоткрыть в новом окне.

* Stack Overflow — сайт вопросов и ответов в области программирования,

где помимо технических вопросов (Что означает ":-!!" в C-коде?открыть в новом окне)

встречаются также академические (Существует ли регулярное выражение для определения корректного регулярного выражения?открыть в новом окне)

и просто интересные вопросы (Что означает оператор «-->» в C++?открыть в новом окне).

<!-- ### 官方手册

官方手册包含了查找对象的<span style="color:re">所有</span>信息,

关于查找对象的<span style="color:re">一切</span>问题都可以在官方手册中找到答案.

通常官方手册的内容十分详细, 在短时间内通读一遍基本上不太可能, 因此你需要懂得"如何使用目录来定位你所关心的问题".

如果你希望寻找一些用于快速入门的例子, 你应该使用搜索引擎.

这里列出一些本课程中可能会用到的手册:

* x86

* Intel 80386 Programmer's Reference Manual (PDFоткрыть в новом окне)(HTMLоткрыть в новом окне)

* System V ABI for i386открыть в новом окне

* mips32

* MIPS32 Architecture For Programmers (Volume Iоткрыть в новом окне, Volume IIоткрыть в новом окне, Volume IIIоткрыть в новом окне)

* System V ABI for mips32открыть в новом окне

* riscv32(64)

* The RISC-V Instruction Set Manual (Volume Iоткрыть в новом окне, Volume IIоткрыть в новом окне)

* ABI for riscvоткрыть в новом окне

* ISA无关的手册

* [System V generic ABI](https://refspecs.linuxfoundation.org/elf/gabi41.pdf)

* [C99 Standard](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)

* [GCC 10.3.0 Manual](https://gcc.gnu.org/onlinedocs/gcc-10.3.0/gcc.pdf)

* [GDB User Manual](https://sourceware.org/gdb/current/onlinedocs/gdb)

* [GNU Make Manual](http://www.gnu.org/software/make/manual/make.pdf)

* On-line Manual Pager (即man, [这里](man.md)有一个入门教程)

-->

### Официальные руководства

Официальные руководства содержат <span style="color:re">всю</span> информацию об интересующих вас объектах,

и ответы на <span style="color:re">все</span> вопросы об этих объектах можно найти в официальных руководствах.

Обычно официальные руководства очень подробные, и прочитать их целиком за короткое время практически невозможно.

Поэтому необходимо уметь «использовать оглавление, чтобы находить интересующие вас вопросы».

Если вам нужны примеры для быстрого знакомства с темой, лучше воспользоваться поисковой системой.

Ниже перечислены некоторые руководства, которые могут понадобиться в этом курсе:

* x86

* Справочное руководство программиста Intel 80386 (PDFоткрыть в новом окне)(HTMLоткрыть в новом окне)

* System V ABI для i386открыть в новом окне

* mips32

* Архитектура MIPS32 для программистов (Том Iоткрыть в новом окне, Том IIоткрыть в новом окне, Том IIIоткрыть в новом окне)

* System V ABI для mips32открыть в новом окне

* riscv32(64)

* Руководство по набору инструкций RISC-V (Том Iоткрыть в новом окне, Том IIоткрыть в новом окне)

* ABI для RISC-Vоткрыть в новом окне

* руководства, не зависящие от ISA

* [универсальный ABI System V](https://refspecs.linuxfoundation.org/elf/gabi41.pdf)

* [Стандарт C99](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)

* [Руководство GCC 10.3.0](https://gcc.gnu.org/onlinedocs/gcc-10.3.0/gcc.pdf)

* [Руководство пользователя GDB](https://sourceware.org/gdb/current/onlinedocs/gdb)

* [Руководство GNU Make](http://www.gnu.org/software/make/manual/make.pdf)

* Онлайн-система просмотра руководств (man; вводное руководство находится [здесь](man.md))

<!-- ### GNU/Linux入门教程

jyy为我们准备了一些GNU/Linux入门教程, 如果你是第一次使用GNU/Linux, 请阅读以下材料

* [流传自远古时代的OS实验课程网站中的Linux入门教程](linux.md)

* The Missing Semester of Your CS Education(墙裂推荐)открыть в новом окне -->

### Вводное руководство по GNU/Linux

jyy подготовил несколько вводных материалов по GNU/Linux. Если вы впервые используете GNU/Linux, прочитайте следующие материалы:

* [Вводное руководство по Linux с сайта лабораторного курса по OS, дошедшее до нас с древних времён](linux.md)

* The Missing Semester of Your CS Education (настоятельно рекомендуется)открыть в новом окне

<!-- ## 许可协议

本作品采用`知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆`许可协议进行许可.

要查看该许可协议, 可访问这里открыть в новом окне,

或者写信到 Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. -->

## Лицензионное соглашение

Эта работа распространяется по лицензии `Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Mainland China`.

Чтобы ознакомиться с этой лицензией, перейдите сюдаоткрыть в новом окне,

или напишите в Creative Commons по адресу: PO Box 1866, Mountain View, CA 94042, USA.