PA0 - 世界诞生的前夜: 开发环境配置
PA0 - 世界诞生的前夜: 开发环境配置
项目地址:南京大学 计算机科学与技术系 计算机系统基础 课程实验 2024
在开始我们的旅行之前,让我们看下这场旅程的目标和装备是什么吧😉
实验方案
理解"程序如何在计算机上运行"的根本途径是从"零"开始实现一个完整的计算机系统. 南京大学计算机科学与技术系
计算机系统基础
课程的小型项目 (Programming Assignment, PA)将提出x86/mips32/riscv32(64)架构相应的教学版子集, 指导学生实现一个经过简化但功能完备的x86/mips32/riscv32(64)模拟器NEMU(NJU EMUlator), 最终在NEMU上运行游戏"仙剑奇侠传", 来让学生探究"程序在计算机上运行"的基本原理. NEMU受到了QEMU的启发, 并去除了大量与课程内容差异较大的部分. PA包括一个准备实验(配置实验环境)以及5部分连贯的实验内容:
- 图灵机与简易调试器
- 冯诺依曼计算机系统
- 批处理系统
- 分时多任务
- 程序性能优化
实验环境
- CPU架构: x64
- 操作系统: GNU/Linux
- 编译器: GCC
- 编程语言: C语言
Remember, the machine is always right!
⭕对于即将在PA0遇到的问题,这是对应的解决方法:
你需要独立完成PA0, 请你认真阅读讲义中的每一个字符, 并按照讲义中的内容进行操作: 当讲义提到要在互联网上搜索某个内容时, 你就去互联网上搜索这个内容. 如果遇到了错误, 请认真反复阅读讲义内容, 机器永远是对的.
Installing GNU/Linux
安装一个ubuntu22.04的系统,我是安装在了虚拟机中,查看版本号:
crx@ubuntu:study$ uname -a Linux crx-virtual-machine 6.5.0-41-generic #41~22.04.2-Ubuntu SMP PREEMPT_DYNAMIC Mon Jun 3 11:32:55 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
First Exploration with GNU/Linux
介绍了一些关于linux的基础问题,包括终端和图形化界面和权限的相关问题,比较简单。
Installing Tools
这节涉及到了两个方面的问题:
- linux的包分发商(package distributor)🐤
- 什么是源以及换源的必要性
下面我们分别简单介绍下
package distributor
🐤 为什么会有包分发商呢?因为linux的软件众多,而用户搜索并使用每个软件的时间成本就很大。而如果现在有一个统一的“软件商店”,让这些五花八门的软件集合在一起,方便用户地下载安装使用,从而简化了软件的安装和管理。
而且linux的许多软件依赖于其他库和工具才能正常运行。包分发商会管理和解决这些依赖关系,确保在安装一个软件包时,所有必要的依赖项都能自动安装和正确配置。
还有等等很多优势,总之就是降低用户和开发者使用linux程序的操作成本。
像是在Ubuntu系统中,Canonical作为包分发商,提供并维护了一套完整的包管理体系。用户通过APT工具从官方源或镜像源中获取软件包。这些源由Canonical和社区维护,确保软件的稳定性和安全性。
例如,用户可以使用以下命令安装一个软件包:
sudo apt update sudo apt install vim
这个过程中,APT会从源中下载vim
软件包及其依赖项,并自动完成安装。
Source
源是指一个存储软件包和更新的网络位置。在Ubuntu系统中,源是一个包含软件包的服务器或镜像站点,它们提供了一个集中管理和获取软件的渠道。
为啥要换源呢?
🚋 软件分发商将软件发布到源后,因为源的位置问题,为了提高下载速度和稳定性,所以通常要更换到距离你物理位置更近的镜像源。
将原本距离遥远的源🏝️ 切换到一些附近的镜像源,主要是提高了用户软件包下载的速度、稳定性,从而提升了用户的体验。
换源步骤
1️⃣ 首先编辑源列表:
sudo vim /etc/apt/sources.list
2️⃣ 然后将源地址替换为清华的源地址:
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
3️⃣ 再更新源列表:保存并关闭文件后,更新软件包列表
sudo apt update
可选的升级系统(升级系统以应用更新的软件包)
sudo apt upgrade
📢 三者关系总结
- 软件分发商负责创建和维护软件包,并将其发布到源中。
- 源是存储和分发这些软件包的服务器或镜像站点。
apt
工具用于访问这些源,从中下载、安装、更新和管理软件包。
Configuring vim
配置vim。
并且介绍了很多vim的牛逼之处。每天学一两个技巧即可,不需要一开始all in one。
More Exploration
这里介绍了linux基础学习思路。主要是为了让我们开发的时候使用工具🍊时更加得心应手。
按照几个例子学习下linux的bash命令,以下是一些学习资料:
⚠️注意
按照之前的经验,最好是一天学一个就可以,大体了解下这个命令常用的参数和应用场景。因为当时想这么多命令,并且每个命令都附带很长的手册,真的让人焦头烂额。😢
当我对浩如烟海的linux命令行心生退却的时候,我问了下chatgpt对于命令行的恐惧,他给出的解决方案中,让我比较赞同的是:
通过实际操作来加深理解,动手是学习命令行最有效的方法。以下是一些建议:
- 练习:每天花一点时间练习一个或几个命令,通过重复加深记忆。
- 小项目:为自己设定一些小项目,如管理文件、编写脚本等,实际应用这些命令。
- 解决实际问题:遇到问题时,尝试使用命令行解决,逐步积累经验。
就是需要带着问题去学习,这样的学习效率才会更高。
而PA里面对于如何用好Linux也有自己的想法:
- 卸载Windows 解放思想, 摆脱Windows对你的阻碍. 与其默认"没办法, 也只能这样了", 你应该去尝试"看看能不能把这件事做好".
- Linux下也有相应的常用软件, 如Chrome, WPS, 中文输入法, mplayer...
- 没有Windows你也可以活下去
- 实在不行可以装个Windows虚拟机备用
- 熟悉一些常用的命令行工具, 并强迫自己在日常操作中使用它们
- 文件管理 -
cd
,pwd
,mkdir
,rmdir
,ls
,cp
,rm
,mv
,tar
- 文件检索 -
cat
,more
,less
,head
,tail
,file
,find
- 输入输出控制 - 重定向, 管道,
tee
,xargs
- 文本处理 -
vim
,grep
,awk
,sed
,sort
,wc
,uniq
,cut
,tr
- 正则表达式
- 系统监控 -
jobs
,ps
,top
,kill
,free
,dmesg
,lsof
- 上述工具覆盖了程序员绝大部分的需求
- 可以先从简单的尝试开始, 用得多就记住了, 记不住就
man
- RTFM + STFW
- 坚持.
- 心态上, 相信总有对的工具能帮助我做得更好
- 行动上, 愿意付出时间去找到它, 学它, 用它
准备开一个新帖子,写写学习命令的心得,熟悉一些常用的命令行工具, 并强迫自己在日常操作中使用它们。
Getting Source Code for PAs
什么?ics2024还没发布?😑
那就把2023年秋季的项目拖过来开搞:
git clone -b 2023 git@github.com:NJU-ProjectN/ics-pa.git ics2023
那就索性做2023的项目!
跟着教程走,然后新建分支pa0
:
git checkout -b pa0
⭕具体的git学习:A Visual Git Reference,学习时候尽量贴合实际情况。
在编译运行nemu
的时候,这时候用git log
会发现自己的编译和运行nemu
的记录也被git记录了。可进行如下修改关闭开发跟踪:
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
可以看出是将Makefile的第九行开始的内容用符号#
给注释了。按照这个注释掉就可以实现关闭pa的开发跟踪了。
附录一个Linux C编程一站式学习对于这个材料,PA是这么给的推荐:
By the way, you will use C language for programming in all PAs. Here is an excellent tutorial about C language. It contains not only C language (such as how to use
printf()
andscanf()
), but also other elements in a computer system (data structure, computer architecture, assembly language, linking, operating system, network...). It covers most parts of this course. You are strongly recommended to read this tutorial.
PA0结束,总计用时6小时45分钟⏲️
总结:
- 熟悉常见命令
- 不会的stfw
- 慢慢积累
PA1开始!☘️
本文作者:上山砍大树
本文链接:https://www.cnblogs.com/shangshankandashu/articles/18311691
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步