20201220蔡笃俊《信息安全系统设计与实现》第一、二章学习笔记

一、任务详情

自学教材第1,2章,提交学习笔记(10分)

1-知识点归纳以及自己最有收获的内容 (3分)
2-问题与解决思路(2分)
3-实践内容与截图,代码链接(3分)
4-...(知识的结构化,知识的完整性等,提交markdown文档,使用openeuler系统等)(2分)

二、知识点归纳以及自己最有收获的内容

1. 知识点归纳:

第一章实际上是对Linux的一个系统的介绍。Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版,如基于社区开发的debian、archlinux,和基于商业开发的Red Hat Enterprise Linux、SUSE、Oracle Linux等。第一章为我们介绍了整本书的大致内容、unix操作系统的历史以及如何将ubuntu操作系统安装到虚拟机中,帮助初学者在不购买新的设备的情况下使用ubuntu操作系统编程。此外,还讲解了一部分简单的unix/Linux常用命令、文件类型、文件系统组织等内容,较为系统的讲解了Linux的启动过程、用户权限和安全性等问题。

第一章嘛,大部分都是泛泛而谈,但是我从中也收获了不少。比如Linux文件系统的树形组织结构:

和Linux的一些基本命令:

第一章最有收获的内容应该是学会使用命令行来代替GUI,安装完虚拟机后,我就用命令行尝试了安装各种库——比如14页的64位Linux下生成32位代码,我们就得安装适用于gcc的附加支持库:multilib
sudo apt install gcc-multilib
sudo就是管理员权限,apt install就是ubuntu的安装软件的命令~

然后到了第二章,这章主要介绍了emacs、vim、gidit这几类文本编辑器,GCC是编译器,静态和动态链接,GDB调试工具,文件系统操作,以及一些数据结构。这章的内容比较多,首先是程序的开发步骤:
第一步是将c源文件转换为汇编代码文件;第二步是把汇编代码转换为目标代码(通常是二进制代码);第三步是链接。二进制可执行文件名为a.out。a.out的内容包括4个部分:文件头、代码段、数据段、符号表。尝试了这种过程:

然后是链接库。链接可分为动态链接和静态链接。动态链接使用动态链接库进行链接,生成的程序在执行的时候需要加载所需的动态库才能运行。动态链接生成的程序小巧,但是必须依赖动态库,否则无法执行。Linux 下的动态链接库实际是共享目标文件(shared object),一般是.so文件,作用类似于 Windows 下的.dll 文件。静态链接使用静态库进行链接,生成的程序包含程序运行所需要的全部库,可以直接运行,不过体积较大。Linux 下静态库是汇编产生的.o 文件的集合,一般以.a 文件形式出现。gcc 默认是动态链接,加上-static参数则采用静态链接。

一个完整的项目将包含:头文件、源文件、静态库、可执行文件、说明文档。分别代表/include、/src、/lib、bin、/doc。

使用默认源码编译:gcc -Iinclude -c src/hello.c -o libs/hello.o

使用默认静态库编译:gcc src/testhello.c libs/hello.o -Iinclude -o bin/hw1

使用指定静态库编译:gcc src/testhello.c -Iinclude -Llibs -lhello -o bin/hw2

产生静态库:ar rcs libhello.a xx.o yy.o

产生动态库:gcc src/hello.c -Iinclude -fPIC -o libs/hello.o

对于静态链接库,在链接阶段,会将汇编生成的「目标文件.o」与引用到的库一起链接打包到可执行文件中。静态链接库对函数库的链接是放在编译时期完成的。程序在运行时与函数库就没有了任何的联系。它比较浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。静态库对程序的更新和发布也会带来麻烦。如果静态库更新了,所有使用它的应用程序都需要重新编译、部署、发布给用户。

静态链接可以理解为最后生成了一个「单文件免安装绿色版」的程序,优点在于移植的时候只需要移动这一个文件,缺点在于文件体积非常大,为了解决这样的问题,就有了动态链接库。

动态链接库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,可以实现进程之间的资源共享。(因此动态库也称为共享库)规避了空间浪费问题。

动态库在程序运行时才被载入,也解决了静态库对程序的更新、部署和发布带来的麻烦。用户只需要更新动态库即可将一些程序升级变得简单,增量更新。动态库连接到系统空间,如果多个程序连接了同一个库,那么只需要一份,优点在于编译程序的时候不会将对应的库文件全部打包在生成的程序中,而是保留了到对应库的链接,缺点就是移植的时候如果只移动了对应的程序没有安装相关的库的话,就会看到报错的结果。

接着是makefile。想要掌握makefile,首先需要了解两个概念,⼀个是⽬标(target),另⼀个就是依赖(dependency)。⽬标就是指要⼲什么,或说运⾏ make 后⽣成什么,⽽依赖是告诉 make 如何去做以实现⽬标。在 Makefile 中,目标和依赖是通过规则(rule)来表达的:

只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。⼀个 Makefile 中可以定义多个目标。调用 make 命令时,我们得告诉它我们的目标是什么,即要它干什么。当没有指明具体的目标是什么 时,那么 make 以 Makefile ⽂件中定义的第⼀个目标作为这次运⾏的目标。这“第⼀个”目标也称之 为默认目标(和是不是all没有关系)。当 make 得到目标后,先找到定义目标的规则,然后运行规则中的命令来达到构建目标的目的。

接下来是GDB调试工具。GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。它主要能帮助我们让程序在所指定的调置的断点处停住、当程序被停住时可以检查此时你的程序中所发生的事、动态的改变你程序的执行环境、自定义的调试参数,观察程序的运行。

  • 其中常见的命令如下:
    • list(l) 显示当前行之后的10行代码(list后面可接行号和函数名,回车继续向下显示)
    • 回车 直接回车,重复上一次执行的命令
    • start(s) 开始执行程序,并停在main函数的第一条语句处
    • next(n) 执行下一条语句
    • step(s) 进入正要执行的函数内部
    • print(p) 打印变量的值
    • break(b) 查看断点
    • info breakpoints(i b) 删除编号为n的断点
    • delete breakpoints(d) n 使编号为n的断点失效
    • disable breakpoints n 使编号为n的断点生效
    • enable breakpoints n 设置断点 (行号 || 函数名)
    • run(r) 连续执行程序,直到遇到断点
    • continue(c) 继续执行程序,直到遇到下一个断点
    • finish 跳出当前函数,执行其调用函数
    • jump(j) n 强制跳转到第n行,若后面没有断点则执行到程序结束
    • print(p) var 打印变量var的值,打印地址
    • print *a@n (a是数组名,n是要显示的元素个数), 显示数组a的n个元素
    • set var a=5 (set var)命令用于修改变量(a)的值
    • display var 程序每执行一步都会打印var变量的值
    • undisplay n 取消编号为n的打印
    • info locals 列出当前函数的局部变量信息
    • whatis var 显示变量var的类型
    • ptype var 显示变量var更详细的类型
    • quit(q) 退出gdb调试

最后是一些数据结构,在大二我们学过了数据结构,这部分内容相对比较容易,和数据结构类似。

第二章最有收获的内容应该是makefile这一部分了,这部分结合了第一章和第二章的一些知识,用emacs编辑c语言源文件,又使用了make来编译:

三、问题与解决思路

我原本想采用OpenEuler版本的Linux来尝试一些命令,一开始尝试了openEuler-22.03-LTS版本,但是这个版本我连安装都安装不了,一直报这个错:
Problems inrequest:missing packages :grub2,lvm2,chrony,authselect

解决方式我尝试了很多,但是最后只能采用更为稳定的20.03版本,终于成功解决。

本以为安装好了就没啥问题了,但是openEuler最让我觉得蛋疼的地方出现了,居然没有图形界面,而且连不上网无法下载插件......

后来无法联网的解决方式解决了,先把适配器打开,启动VMnet8:

然后点击VMware 菜单“编辑”里面的“虚拟网络编辑器”,勾选DHCP服务,并自行指定一个网段。这里我把网段202.112.113.0,然后用202.112.113.2做网关,再将202.112.113.1分配给物理主机上的VMnet8网卡:

接着回到openEuler命令行,输入命令nmtui,然后进入图形配置界面,选择“编辑连接”:

点进去后选择编辑,把自动连接打开,确定退出后激活网卡:

退出后重启,我们就能联网了。

下载net-tools工具:

然后就是图形化界面的问题,其实有解决方法。使用ukui最简单,就四条指令,输完等一下重启会有一个桌面,用起来顺手了很多。但是最大的问题是openeuler版本的vmware tools无法安装,我安装Ubuntu版本的时候已经解决过这个问题了,不知道为什么换成这个就不可以,尝试了很多次都不行,最终我决定还是换回Ubuntu,毕竟VMware tools还是挺方便的。

ps:好多截图我忘了截了,一整个周末都在尝试解决openeuler的各种问题......但是最终还是放弃了,Ubuntu真香!忍痛把试了好久的ukui删了呜呜呜

尝试这个版本特有的kiran:

感觉这个比ukui还好用,缺点就是太卡了......

不过openEuler还是可以用,只不过比Ubuntu麻烦了很多......

posted @ 2022-09-04 03:12  acacacac  阅读(174)  评论(0编辑  收藏  举报