0 - NoraLigithub/NEMU GitHub Wiki

PA0实验报告

(一)实验流程及错误分析 (二)问题思考与探讨 (三)问题思考与探讨

##(一)实验流程及错误分析

Install virtualbox:

第一次安装为了整齐,安装到了中文目录下!

Installing a GNU/Linux VM :

  1. debian下载成功,本以为是exe,后发现是镜像文件,我理解为类似于装windows的系统光盘。有虚拟机的概念了。

  2. virtualbox安装成功,装debian时第三步出现未知错误

  3. 我去查看版本号发现正确,我准备关闭重新启动,但又出现如下错误 我并未理解原因为何。可能是安装出现了问题,想到自己在安装位置的选择上与默认设置不同,便卸载重新安装,此次正确。

  4. 我发现我的默认存储空间是512MB,并非PA0所写。

  5. PA0的这句话让我产生困惑,我担心partitions 指主机硬盘,不敢选择entire disk。经过询问助教,我意识到这是指virtual disk!

Configuring Package Manager :

  1. interfaces文件打开后,突然要求去学习vim基本操作。当时我就按教程指示在interfaces上编辑,修改,但因为操作不当,一度把interfaces中的内容全部删除!幸好当时没有保存。后来我才意识到为什么要先学会文件的开,关,保存!而我当时忽略这些操作,直接学习文本编辑并在系统文件中操作!
  2. Diff操作开始没有清楚,直接照着文本框输入每一行。出现错误后发现,我根本没有认真阅读下面对+++ ---的说明。遂搜索diff明白了基本的含义,后来对文件的修改都没有出现理解上的错误。认真的阅读说明很重要。

Installing More Tools

  1. 设置vim 时需要录入很多操作,考虑过复制粘贴的可能性,但发现很难将主机中的内容粘贴到vim上,也没立刻发现有效方法,便暂且搁置。后来学到terminal才发现主机与虚拟机之间可以共享文件,那只需要做到在虚拟机中将一个文件中的内容复制到另一个文件中,就做到了主机与虚拟机之间的复制粘贴。继续思考操作中。
  2. 输入命令时将复杂的一行输错,但当时并没有发现,后来在编译程序时发现了这个错误,看来写程序时可能出错的地方非常多,最危险的是一些基本的设置出错,而我在初学的过程中犯了很多次这样的错误,浪费了很多时间,细心果然是非常重要的。
  3. Tools for Experiments 部分我开始安装时没有用su 或者sudo,安装的结果是失败的,但我当时未习惯阅读返回的内容,误以为出现遗传内容是安装成功了。后面使用gcc 功能时出现command not found,使我困惑很久,后来在同学的提示下我重新安装这些指令,发现与之前弹出的信息不尽相同Logging in via SSH ,我才意识到问题所在,我犯了非常愚蠢的错误。

Logging in via SSH

  1. 我没有按照PA0的说明改为192.168.56.245,而是采用了默认设置192.168.56.254,结果显示正确。

  2. 我在putty中输入地址后,链接显示超时或者404错误。我反复操作,仍无法消除错误,后重新安装ssh才成功完成。可能因为我犯了上页错误3。但亦为我增加了寻找错误的经验。

##(二)问题思考与探讨

Why Windows is quite "fat"?

Installing a Windows operating system usually requires much more disk space as well as memory. Can you figure out why the Debian operating system you installed can be so "slim"?

问题1见本页顶端

windows是GUI,安装过程中会内置许多软件和操作,以方便用户的直接使用,但内置的功能多意味着很多功能是我们暂时不需要的,为了尽可能完善功能,它很fat; Debian使用命令行,操作相对于GUI更加直接迅速,并且它默认的功能都比较基本,用户可以按自己的需求编写 安装 修改 ,得到其他功能(正如PA0接下来的部分所做的)。 总之,debian自主性,灵活性更高,并且离机器语言更“近”,所以更小。

Why executing the poweroff command requires superuser privilege?

Can you provide a scene where bad thing will happen if the poweroff command does not require superuser privilege?

  1. 关机需要确保所有修改的内容已经录入保存。而且突然的关闭可能会破环系统后台正在进行的一些功能。它需要的权限较高是出于对用户文件的保护以及系统的正常运行
  2. 系统可能有多名使用者使用(如PA0后的terminal远程操作),使用者均依赖于系统的稳定。如果每一个user都可以关闭主机,那其余user将不能正常使用,在进行的操作会丢失,可能进而影响系统内部的一些操作命令的完成。

Where is GUI?

  1. GUI更适用于抽象程度更高的功能,如图形处理,人机交互更为友好,面向非专业用户优势比较大。
  2. CLI命令行控制,操作更为直接,并且可以利用的指令级别较高,可以完成GUI用户无法完成的功能。执行速度相比也较快。占用内存空间较小。更为稳定,因为指令不会像GUI一样发生巨大改变。远程控制比GUI方便。自行添加功能,自由度较高。
  3. 我们完成课程内容,要接触计算机本质,通过CLI显然接触会更加深入,方便实验。因为可以安装自己需要的功能,大大减少了无用功能占据内存的现象。常常运行程序,高效率的编译执行显然是有益的。

Why use sudo instead of su?

 su的风险远大于sudo.su是完全取得了超级权限,接下来用户的不当操作很有可能造成系统文件的损害,同时一些恶意软件有可能“窃取”超级权限危害系统。而sudo是针对某一个操作判断是否可以取得超级权限,大大减少了超级权限被滥用的风险。

What happened?

You should know how a program is generated in the 程序设计基础 course. But do you know what happened when a bunch of information is output to the screen during make is executed?

  1. Make必须用makefile告诉它要做什么以及怎么做才行,对于程序开发而言,就是告诉make命令应用程序的组织情况。   一般情况下,makefile会跟项目的源文件放在同一个目录中。另外,系统中可以有多个makefile,一般说来一个项目使用一个makefile就可以了;如果项目很大的话,我们就可以考虑将它分成较小的部分,然后用不同的makefile来管理项目的不同部分。   因为Makefile用于描述系统中模块之间的相互依赖关系,以及产生目标文件所要执行的命令,所以,一个makefile由依赖关系和规则两部分内容组成。下面分别加以解释。 依赖关系由一个目标和一组该目标所依赖的源文件组成。这里所说的目标就是将要创建或更新的文件,最常见的是可执行文件。规则用来说明怎样使用所依赖得文件来建立目标文件。

  2. 当make命令运行时,会读取makefile来确定要建立的目标文件或其他文件,然后对源文件的日期和时间进行比较,从而决定使用那些规则来创建目标文件。一般情况下,在建立起最终的目标文件之前,肯定免不了要建立一些中间性质的目标文件。这时,Make命令也是使用makefile来确定这些目标文件的创建顺序,以及用于它们的规则序列。(此处在互联网查询获得)

Things behind scrolling

why the original terminal can not be scrolled? How does tmux make the terminals scrollable? And last, do you know how to implement a scroll bar?

1. 在Vbox中,可以用shift+PgUp/PgDn来实现。 2. 滚动条的思路可能是保留之前输出的缓存,并通过某些操作出现这些缓存。原始的终端没有定义相关操作。 3. terminal记录了缓存。

Try to experience Unix Philosophy

For each of the following questions, try to answer it using one line of command

  1. 目录下文件个数(包括子目录):

     ls -lR|grep "^-"|wc –l  ——100
    

(-lR:包括子目录;“^-”:只留下一般文件) 2. 目录下源文件个数: ——58

	 ls -lR|grep '\.c$\|\.h$' | wc –l
 ($:匹配尾部; \:转义符)
  1. 目录下源代码的行数: ——2313

     find . | grep '\.c$\|\.h$' | xargs wc –l
    

    (xargs: 作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。)

  2. 目录下(除testcase目录下)源代码的行数:

      find . -path './ testcase' -prune -o -name '*.[c|h]' -print  | xargs wc –l    ——1351
    

(-prune:不包括此目录)

  1. 目录下(除testcase目录下)源代码(除空行)的行数:

     find . -path './ testcase' -prune -o -name '*.[c|h]' -print  | xargs grep '^.' | wc –l  ——1071
    

(‘^’:匹配头部;‘.’:除‘\n’以外的字符) 6. 目录下(除testcase目录下)源代码(除空行和whitespace)的行数:

	find . -path './ testcase' -prune -o -name '*.[c|h]' -print  | xargs grep –ve '^$' –ve ‘^\s$’ | wc –l  ——1069

(-e:可实现连接多个匹配,若开头是-ve,则后面连接的即使是-e,也会反转匹配)

	find . -path './ testcase' -prune -o -name '*.[c|h]' -print  | xargs grep –v '^$' -h | grep –v ‘^\s$’ | wc –l  ——1069

(-h:不输出文件名(在代码之前),否则用管道连接到下一个grep时,得到的代码每行前面都有文件名)

  1. 目录下(除testcase目录下)源代码(除空行,whitespace和每行至多一个字符的行)的行数:

     find . -path './ testcase' -prune -o -name '*.[c|h]' -print  | xargs grep –ve '^$' –ve ‘^\s$’ –ve ‘^.$’ | wc –l  ——1020
    
     find . -path './ testcase' -prune -o -name '*.[c|h]' -print  | xargs grep –v '^$' -h | grep –v ‘^\s$’ | grep –v ‘^.$’ | wc –l  ——1020
    

(部分指令资料来自张帆进同学)

##(三)实验反思与总结 1. 我在操作过程中数次出现一些弱智的错误,甚至包括单词拼写错误,这为我造成很大的麻烦,虽然最后都修正了,但浪费时间过多。 2. PA0中有很多自学的拓展内容,我对很多内容的理解掌握还不够熟悉,这可能也是我完成作业较慢的原因。准备提交作业后再次对相关知识进行一些学习和实验,以期熟练掌握。 3. 请教同学请教老师往往能启迪你的思路,还可以重振一下你继续修改的决心!感谢张帆进同学的鼓励,监督和帮助