we choose to go to|

上山砍大树

园龄:5年3个月粉丝:13关注:3

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也有自己的想法:

  1. 卸载Windows 解放思想, 摆脱Windows对你的阻碍. 与其默认"没办法, 也只能这样了", 你应该去尝试"看看能不能把这件事做好".
    • Linux下也有相应的常用软件, 如Chrome, WPS, 中文输入法, mplayer...
    • 没有Windows你也可以活下去
    • 实在不行可以装个Windows虚拟机备用
  2. 熟悉一些常用的命令行工具, 并强迫自己在日常操作中使用它们
    • 文件管理 - 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
  3. RTFM + STFW
  4. 坚持.
    • 心态上, 相信总有对的工具能帮助我做得更好
    • 行动上, 愿意付出时间去找到它, 学它, 用它

准备开一个新帖子,写写学习命令的心得,熟悉一些常用的命令行工具, 并强迫自己在日常操作中使用它们。

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() and scanf()), 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 中国大陆许可协议进行许可。

posted @   上山砍大树  阅读(166)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起