Получение исходного кода для PA
Получение исходного кода
Вернитесь в домашний каталог командой
cd ~
Обычно все работы, не связанные с системой, следует выполнять в домашнем каталоге. Другие каталоги под корнем файловой системы (/) связаны с системой. Поэтому НЕ выполняйте PA и лабораторные в этих каталогах через sudo.
Не используйте учётную запись root для экспериментов!!!!
Использование учётной записи root для экспериментов изменит атрибуты прав файлов, связанных с экспериментом, что может привести к сбою системы отслеживания разработки В худших случаях ваше неправильное использование может непреднамеренно повредить системные файлы, из-за чего система не загрузится! Ряд студентов в прошлом пострадало от этого, и их оценки пострадали тоже из-за повреждения лабораторных файлов. Извлеките из этого урок и не поддавайтесь искушению пользоваться системой ради удобства, иначе последствия будут на вас!
Если вы всё ещё не понимаете, почему так нужно делать, можете прочитать эту страницу: Why is it bad to login as root?. Правильно делать так: всегда используйте обычную учётную запись для повседневной работы (например, написания кода). Когда нужно сделать что-то, требующее привилегий root, используйте sudo.
Добавление ssh key на github
Перед получением кода каркаса добавьте ssh key на github, пожалуйста, STFW.
Теперь получите исходный код для PA следующей командой:
Если вы участвуете в "One Student One Chip", смотрите ссылку на код в хендауте "One Student One Chip".
Если вы участвуете в "One Student One Chip", не используйте ссылку на код ниже. Кроме того, хендаут PA требует сдавать задания, что все студенты "One Student One Chip" могут игнорировать, Однако нужно обратить внимание на требования к сдаче в хендауте "One Student One Chip".
git clone -b 2023 git@github.com:NJU-ProjectN/ics-pa.git ics2023
Будет создан каталог с именем ics2023. Это каталог проекта для PA. Подробности будут объяснены в PA1.
Затем выполните следующие команды для настройки git:
git config --global user.name "221220000-Zhang San" # ваш студенческий ID и имя
git config --global user.email "zhangsan@foo.com" # ваш email
git config --global core.editor vim # ваш любимый редактор
git config --global color.ui true
Вы должны настроить git со своим студенческим ID, именем и email. Перед продолжением прочитайте это руководство по git, чтобы выучить некоторые основы git. Ещё один материал, рекомендованный jyy, — Visualizing Git Concepts with D3. Вы можете выучить некоторые команды git с помощью визуализации.
Войдите в каталог проекта ics2023, затем выполните
git branch -m master
bash init.sh nemu
bash init.sh abstract-machine
чтобы инициализировать некоторые подпроекты. Скрипт подтянет некоторые подпроекты с github. Мы объясним их позже.
Кроме того, скрипт также добавит некоторые переменные окружения в конфигурационный файл bash ~/.bashrc. Эти переменные заданы абсолютным путём, чтобы поддерживать компиляцию подпроектов. Поэтому НЕ перемещайте проект в другой каталог после завершения инициализации, иначе эти переменные станут недействительными. В частности, если вы используете оболочку, отличную от bash, задайте эти переменные в соответствующем конфигурационном файле вручную.
Чтобы переменные окружения вступили в силу, выполните
source ~/.bashrc
Затем попробуйте
echo $NEMU_HOME
echo $AM_HOME
cd $NEMU_HOME
cd $AM_HOME
чтобы проверить, получили ли эти переменные окружения правильные пути. Если обе команды echo сообщают правильные пути и обе команды cd переходят в целевые пути без ошибок — готово. Если нет, ещё раз проверьте шаги выше и оболочку, которой вы пользуетесь.
Использование Git
Мы будем использовать возможность branch в git, чтобы управлять процессом разработки. Ветка — это упорядоченный список коммитов, где коммит относится к некоторым изменениям в проекте.
Вы можете перечислить все ветки командой
git branch
Вы увидите, что сейчас есть только одна ветка с именем "master".
* master
Чтобы создать новую ветку, используйте команду git checkout:
git checkout -b pa0
Эта команда создаст ветку с именем pa0 и переключится на неё. Теперь снова перечислите все ветки, и вы увидите, что сейчас мы на ветке pa0:
master
* pa0
С этого момента все изменения файлов в проекте будут записываться в ветку pa0.
Теперь попробуйте! Измените переменные STUID и STUNAME в ics2023/Makefile:
STUID = 221220000 # ваш студенческий ID
STUNAME = 张三 # ваше китайское имя
Выполните
git status
чтобы увидеть файлы, изменённые с последнего коммита:
On branch pa0
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: Makefile
no changes added to commit (use "git add" and/or "git commit -a")
Выполните
git diff
чтобы перечислить изменения с последнего коммита:
diff --git a/Makefile b/Makefile
index c9b1708..b7b2e02 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-STUID = 221220000
-STUNAME = 张三
+STUID = 221221234
+STUNAME = 李四
# DO NOT modify the following code!!!
Вы должны увидеть, что STUID и STUNAME изменены. Теперь добавьте изменения в коммит через git add и выполните git commit:
git add .
git commit
Команда git commit вызовет текстовый редактор. Наберите modified my info в первой строке и оставьте остальное содержимое без изменений. Сохраните и выйдите из редактора — это завершит коммит. Теперь вы должны увидеть журнал, помеченный вашим студенческим ID и именем, командой
git log
Теперь переключитесь обратно на ветку master командой
git checkout master
Откройте ics2023/Makefile, и вы обнаружите, что STUID и STUNAME по-прежнему не изменены! Выполнив git log, вы обнаружите, что журнал коммита, который вы только что создали, исчез!
Не волнуйтесь! Это возможность веток в git. Изменения в разных ветках изолированы, то есть изменение файлов в одной ветке не затронет другие ветки. Переключитесь обратно на ветку pa0 командой
git checkout pa0
Вы обнаружите, что всё вернулось! В начале PA1 вы вольёте все изменения из ветки pa0 в master.
Рабочий процесс выше показывает, как вы будете использовать ветки в PA:
- перед началом нового PA создайте ветку
pa?и переключитесь на неё - пишите код в ветке
pa?(это внесёт много изменений) - после завершения PA вольйте ветку
pa?вmasterи переключитесь обратно наmaster
Компиляция и запуск NEMU
Теперь войдите в каталог nemu/. Перед первой компиляцией NEMU нужно сгенерировать конфигурационный файл командой
make menuconfig
Ошибка компиляции!
Вы можете получить это сообщение об ошибке — что ж, это упущение в хендауте. Так что это просто упражнение: вам нужно установить недостающий инструмент.
Как это сделать — конечно, STFW.
Появится меню. НЕ изменяйте ничего. Просто выберите Exit и Yes, чтобы сохранить новую конфигурацию. После этого скомпилируйте проект через make:
make
Если ничего не пойдёт не так, NEMU скомпилируется успешно.
Проверьте версию llvm
Если во время компиляции возникнет следующая ошибка:
src/utils/disasm.cc:37:2: error: #error Please use LLVM with major version >= 11
Введите llvm-config --version, чтобы проверить версию llvm, убедитесь, что она 11 или выше. В частности, если вы используете Ubuntu 20.04, можете установить llvm-11 вручную через apt-get install llvm-11 llvm-11-dev. Затем сделайте следующее изменение, чтобы указать используемую версию llvm-11.
diff --git a/nemu/src/utils/filelist.mk b/nemu/src/utils/filelist.mk
index c9b1708..b7b2e02 100644
--- a/nemu/src/utils/filelist.mk
+++ b/nemu/src/utils/filelist.mk
@@ -16,5 +16,5 @@
ifdef CONFIG_ITRACE
CXXSRC = src/utils/disasm.cc
-CXXFLAGS += $(shell llvm-config --cxxflags) -fPIE
-LIBS += $(shell llvm-config --libs)
+CXXFLAGS += $(shell llvm-config-11 --cxxflags) -fPIE
+LIBS += $(shell llvm-config-11 --libs)
endif
Если вы используете другой дистрибутив, ищите решение самостоятельно.
Что произошло?
Вы должны знать, как порождается программа, из курса «Основы программирования». Но есть ли у вас представление о том, что произошло, когда во время выполнения make на экран выводится куча информации?
Чтобы выполнить компиляцию с нуля, введите
make clean
чтобы удалить старый результат компиляции, затем снова make.
Чтобы запустить NEMU, введите
make run
Однако вы увидите сообщение об ошибке:
[src/monitor/monitor.c:35 welcome] Exercise: Please remove me in the source code and compile NEMU again.
riscv32-nemu-interpreter: src/monitor/monitor.c:36: welcome: Assertion `0' failed.
Это сообщение говорит, что программа вызвала сбой assertion на строке 36 файла nemu/src/monitor/monitor.c. Если вы не знаете, что такое assertion, вините курс «Основы программирования». Но сейчас просто проигнорируйте это, и вы исправите это в PA1.
Чтобы отлаживать NEMU с gdb, введите
make gdb
Отслеживание разработки
Как только компиляция завершится успешно, изменение исходного кода будет отслеживаться git. Введите
git log
Если вы увидите что-то вроде
commit 4072d39e5b6c6b6837077f2d673cb0b5014e6ef9
Author: tracer-ics2023 <tracer@njuics.org>
Date: Sun Jul 26 14:30:31 2023 +0800
> run NEMU
221220000 张三
Linux 9900k 5.10.0-10-amd64 #1 SMP Debian 5.10.84-1 (2021-12-08) x86_64 GNU/Linux
15:57:01 up 22 days, 6:01, 16 users, load average: 0.00, 0.00, 0.00
это значит, что изменение успешно отслеживается.
Журнал трассировки кода для "One Student One Chip" находится в другой ветке.
Если вы участвуете в "One Student One Chip", смотрите журнал трассировки кода через git log tracer-ysyx.
Если при выполнении make вы увидите следующее сообщение, это значит, что отслеживание не удалось.
fatal: Unable to create '/home/user/ics2023/.git/index.lock': File exists.
If no other git process is currently running, this probably means a
git process crashed in this repository earlier. Make sure no other git
process is running and remove the file manually to continue.
Попробуйте очистить результат компиляции и скомпилировать снова:
make clean
make
Если сообщение об ошибке выше появляется постоянно, свяжитесь с нами как можно скорее.
отслеживание разработки
Мы используем git, чтобы отслеживать ваши эксперименты, и плохое отслеживание повлияет на оценку. Предыдущий студент «выполнил» раздел лабораторной, но мы не смогли найти для него git log, и раздел был сочтён невыполненным. git log — самое сильное доказательство самостоятельного выполнения эксперимента, а выполнение эксперимента без нормального git log не только лишит вас многих баллов, но и даст самое сильное доказательство плагиата. Поэтому обратите внимание на следующее.
- Время от времени проверяйте свой git log, соответствует ли он вашему процессу разработки.
- Коммит кода предыдущего потока будет считаться несданным.
- Не выкладывайте код в публичный доступ (сейчас можно создавать приватные репозитории с личного аккаунта github).
- Всегда разрабатывайте в каталоге проекта, не разрабатывайте в другом месте и потом не копируйте код в каталог проекта разом, потому что
gitне сможет правильно записать вашу разработку. - Не меняйте в
Makefileничего, что относится к отслеживанию разработки. - Не удаляйте ветки, которые мы просим создать, это повлияет на работу наших скриптов и тем самым на ваши результаты!
- Не очищайте git log. Случайные сбои отслеживания не повлияют на вашу оценку. Если сообщение об ошибке выше появляется постоянно, свяжитесь с нами как можно скорее.
Я не студент этого потока, могу ли я выключить отслеживание разработки?
Чтобы выключить отслеживание разработки, можно сделать следующие изменения:
diff --git a/Makefile b/Makefile
index c9b1708..b7b2e02 100644
--- a/Makefile
+++ b/Makefile
@@ -9,6 +9,6 @@
define git_commit
- -@git add .. -A --ignore-errors
- -@while (test -e .git/index.lock); do sleep 0.1; done
- -@(echo "> $(1)" && echo $(STUID) $(STUNAME) && uname -a && uptime) | git commit -F - $(GITFLAGS)
- -@sync
+# -@git add .. -A --ignore-errors
+# -@while (test -e .git/index.lock); do sleep 0.1; done
+# -@(echo "> $(1)" && echo $(STUID) $(STUNAME) && uname -a && uptime) | git commit -F - $(GITFLAGS)
+# -@sync
endef
Локальный коммит
Хотя система отслеживания разработки будет отслеживать изменение вашего кода после каждой успешной компиляции, запись трассировки не подходит для вашей разработки. Потому что код большую часть времени всё ещё с ошибками. Также вам нелегко выделить те трассировки, в которых нет ошибок. Поэтому вы должны отслеживать свой код без ошибок вручную.
Когда хотите закоммитить изменение, введите
git add .
git commit --allow-empty
Опция --allow-empty необходима, потому что обычно изменение уже закоммичено системой отслеживания разработки. Без этой опции git отвергнет коммиты без изменений. Если коммит успешен, вы можете увидеть журнал, помеченный вашим студенческим ID и именем, командой
git log
Чтобы отфильтровать журналы коммитов, соответствующие вашему ручному коммиту, используйте опцию --author с git log. Подробности об использовании этой опции — RTFM.
Написание отчёта
Содержание лабораторного отчёта
В лабораторном отчёте вы должны описать следующее.
- Ход лабораторной. Достаточно простых описаний, например «я выполнил всё», «я выполнил только xxx».
Отсутствие описания хода лабораторной или описание, не совпадающее с фактической ситуацией, будет считаться невыполнением лабораторной. - Обязательные вопросы.
Остальное содержание отчёта вы вольны выбирать. Не обязательно подробно описывать процедуру, но мы поощряем описать в отчёте следующее.
- Проблемы, с которыми вы столкнулись, и размышления о них
- Размышления о вопросах для размышления в синем блоке в хендауте.
- Или любые другие мысли, например опыт лабораторной, благодарность студентам, которые помогли, и т.д.
Баллы будут начислены за серьёзные отчёты, описывающие экспериментальный опыт и идеи Синие блоки необязательны и за выполнение не вознаграждаются Но они хорошо подготовлены и могут углубить ваше понимание чего-либо. Поэтому когда вы понимаете, что на написание лабораторного отчёта почти не осталось времени, вам стоит выбрать описание того, чему вы научились и что думаете. Если у вас нет никаких идей, можете сдать отчёт без идей, мы не будем заставлять. Но пожалуйста, не
- копируйте материал хендаутов
- копируйте код и скриншоты без соответствующих подробных объяснений (чтобы нам было очевидно, что это ради объёма).
чтобы отчёт выглядел богатым: писать и читать такое бессмысленно Вы не получите за это больше баллов, и вас могут за это наказать.
Сдача
Если вы участвуете в "One Student One Chip", проигнорируйте требования к сдаче здесь.
Смотрите требования в хендауте "One Student One Chip".
Наконец, вы должны сдать проект на сайт сдачи (具体提交方式请咨询ICS实验课程老师). Чтобы сдать PA0, положите файл отчёта (принимается ТОЛЬКО файл .pdf) в каталог проекта.
ics2023
├── 221220000.pdf # положите файл отчёта сюда
├── abstract-machine
├── fceux-am
├── init.sh
├── Makefile
├── nemu
└── README.md
Ещё раз проверьте, всё ли в порядке. В частности, проверьте, открывается ли ваш файл .pdf в программе для чтения PDF.
Как открыть PDF-файлы?
STFW.
Опять ошибка
Знаю, но как вы думаете, что нам делать?
RTFSC и наслаждайтесь
Если вы новичок в GNU/Linux и закончили это руководство самостоятельно — поздравляем! Вы многому научились! Самое важное: вы выучили STFW и RTFM для использования новых инструментов и устранения неполадок. (Подумайте. Вы правда это сделали?) С этими навыками вы сможете самостоятельно решать множество проблем во время PA, а также в будущем.
В PA1 первое, что вы сделаете, — RTFSC. Если во время чтения исходного кода возникнут трудности, идите в RTFM:
- Если не можете найти определение функции, это, вероятно, библиотечная функция. Читайте
manдля дополнительной информации об этой функции. - Если не можете понять код, связанный с деталями железа, обратитесь к руководству.
Кстати, во всех PA вы будете программировать на языке C. Здесь отличное руководство по языку C. В нём не только язык C (например, как пользоваться printf() и scanf()), но и другие элементы компьютерной системы (структуры данных, архитектура компьютера, язык ассемблера, компоновка, операционная система, сеть...). Оно покрывает большую часть этого курса. Настоятельно рекомендуем прочитать это руководство.
Наконец, наслаждайтесь путешествием PA, и вы обнаружите, что железо не таинственно, как и компьютерная система! Но помните:
- STFW
- RTFM
- RTFSC
обязательный вопрос
Самостоятельное решение проблем — очень важный навык выживания для кодеров. Некоторые студенты прошлых лет задавали в группе следующие вопросы:
- В чём причина сбоя аутентификации su?
- Что значит сообщение grep no such file or directory?
- Как удалить Ubuntu?
- Что значит синтаксис xxx в C?
- ignoring return value of 'scanf'?
- Что делать, если появляется curl: not found?
- Почему strtok возвращает NULL?
- Почему возникает ошибка Segmentation fault?
- Что такое busybox?
Внимательно прочитайте how to ask и stop ask. (эта статья очень короткая, её можно прочитать за 1 минуту). Напишите эссе на 800 слов о своём опыте задавания вопросов и того, как вам задавали вопросы, а также выполнения PA0 на первом курсе. Расскажите, что вы думаете о «хорошем вопросе» и «самостоятельном решении проблем через STFW и RTFM».
Подсказка: мы задали этот вопрос не для того, чтобы нарочно потратить ваше время, и не для того, чтобы запретить задавать любые вопросы. Речь о том, чтобы знать, что правильно. Когда вы готовы работать ради того, что правильно. Когда вы пытаетесь задавать вопросы профессионально, вы сделали первый шаг к тому, чтобы стать «профессионалом».
Напоминание
На этом PA0 заканчивается. Сдайте проект и отчёт.
