《信息安全系统设计与实现》学习笔记一

学习笔记(系统第一、二章)

  1. 知识点归纳

 

第一章为我们介绍了整本书的大致内容、unix操作系统的历史以及如何将ubuntu操作系统安装到windowsVMwarevirtual虚拟机中,帮助初学者在不购买新的设备的情况下使用ubuntu操作系统编程。此外,还讲解了一部分简单的unix/Linux常用命令、文件类型、文件系统组织等内容,较为系统的讲解了Linux的启动过程、用户权限和安全性等问题。在1.16.3中,开始引入sudo命令的讲解,精读教材以后,我了解到Ubuntu禁用了rootsudo命令只是允许用户以超级用户的身份执行命令,执行完后用户进程将恢复到原来的级别,这样系统的安全性就提升了。

 

第二章用更系统的语言讲解系统编程所需要的背景信息。2.1中就介绍了Linux操作系统中的三款文本编辑器vimgeditemacs。 在2.3中讲解了程序开发的基本流程,可以分文以下步骤:①创建源文件。②用gcc把源文件转换成二进制可执行文件。c语言程序中的变量可分为全局变量、局部变量、静态变量、自动变量和寄存器变量。需要注意的是,全局变量在函数外定义。局部变量在函数内定义。全局变量具有唯一性,并且只有一个副本。

③使用gcc程序,它有三个步骤:第一步:将c源文件转换为汇编代码文件。第二步:把汇编代码转换为目标代码(通常是二进制代码)。第三步:链接。

二进制可执行文件名为a.out,。书中讲到,a.out的内容包括4个部分:

①文件头:包含a.out文件的加载信息和大小

②代码段:也叫正文段,代码段从标准c启动代码crt0.o开始

③数据段

④符号表

Makefile由一系列目标项(创建或更新的文件,也可能是make程序要引用的指令或标签)、依赖项和规则(使用依赖项列表构建目标项所需的命令)组成。

C语言结构体的属性:①定义C语言结构体时,该结构体的每个字段都必须具有一个编译器已知的类型,但自引用的指针除外;②每个C语言结构体数据对象都分配了一个连续内存块;③一个结构体的大小可以由sizeofstruct type)确定;④假设“NODE xy;”为两个相同类型的结构体;⑤C语言联合体与结构体类似。

后面介绍了许多在C语言、python、和数据结构课程中已近学习过的知识,比如数组、指针、树、二叉树(包括搜索、构建、遍历、DFBF)、链表(构建、遍历、搜索、插入、删除、重新排序)。在有一定基础的情况下,阅读起来不是十分吃力。

 

在第一二两章中,最有收获的内容就是动态链接库。(在下一个部分会具体说明细节)

 

2.问题与解决思路

 

遇到的问题:我们都知道,库是已经写好的,可以复用的代码。现实中所有程序都依赖基础的底层库,不可能每个程序中的代码都从最底层开始,所以库的作用非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。但是,书中对于静态链接库和动态链接库的讲解却较为简单。

解决方法:在网上查找资料。收获了以下内容:

书中讲解的链接只是程序编译中的一个过程。在一个程序的编译过程中,分为以下几个步骤:预处理,编译,汇编,链接。

静态库和动态库有如下区别(左图为静态链接库,右图为动态链接库):

 

 

对于静态链接库而言在链接阶段,会将汇编生成的「目标文件.o」与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接:

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

静态链接可以理解为最后生成了一个「单文件免安装绿色版」的程序,优点在于移植的时候只需要移动这一个文件,缺点在于文件体积非常大,为了解决这样的问题,就有了动态链接库。动态链接库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入。

  • 不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,可以实现进程之间的资源共享。(因此动态库也称为共享库)规避了空间浪费问题。
  • 动态库在程序运行时才被载入,也解决了静态库对程序的更新、部署和发布带来的麻烦。用户只需要更新动态库即可将一些程序升级变得简单,增量更新。

动态库连接到系统空间,如果多个程序连接了同一个库,那么只需要一份,优点在于编译程序的时候不会将对应的库文件全部打包在生成的程序中,而是保留了到对应库的链接,缺点就是移植的时候如果只移动了对应的程序没有安装相关的库的话,就会看到报错的结果。

 

Linux 下一个动态库有y三个不同名字的文件组成:

  • soname 文件
    lib + 链接库名字 + .so + .版本号
  • real name 文件
    lib + 链接库名字 + .so + .版本号.次版本号.发行号
  • linker name 文件
    lib + 链接库名字 + .so

当程序在内部列出所需要的链接库时,仅仅使用 soname。当你创建一个链接库时,使用 real name。安装一个新的链接库时,把它复制到一个DLL文件夹里,然后运行程序 ldconfigldconfig 检查存在的 real name 文件,并且创建指向它符号链接 soname 文件比较常见到的有 libsodium 等。

 

 

 

尝试在Ubuntu系统中安装stack.sh工具包(因为版本不兼容问题还不能正常使用)

 

 

安装国产openeuler系统

①登录官网下载镜像:https://repo.openeuler.org/openEuler-20.03-LTS/ISO/

 

 

②创建虚拟机

③配置CPU内核、内存、网络等

④配置欧拉操作系统

 

 

 

 

 

 

 

 

总结:

经过大学两年的学习,对于计算机学习的理解已经不像刚入学的导论课中那样总是对未知的领域束手无策。相反,在遇到问题以后现在的我更能够做的放平心态认真研究,遇到无法解决的问题,科学地上网查找有关资料,在不断翻看别人的思路中拓宽自己对于只是的理解。笔记的内容也比大一时候更加详细。在接下来一年的时间里,我要仔细研究,学好这门课程。

 

 

posted @ 2021-09-14 22:55  20191212  阅读(60)  评论(0编辑  收藏  举报