20155337 2017-2018-1 《信息安全系统设计基础》第一周学习总结

教材学习内容总结

1.1信息就是位+上下文

  • hello.c程序是以字节序列的方式储存在文件中的。每个字节都有一个整数值,对应于某些字符。例如,第一个字节的整数值是35,它对应的字符就是字符“#”。第二个字节的整数值为105,它对应的字符是“i”,以此类推。注意,每个文本行都是以一个看不见的换行符'\n'来结束的,它所对应的整数值为十。像hello.c这样的只由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件。
  • 源程序实际上就是由0,1组成的位序列。信息(磁盘文件、存储器中程序、用户数据)根据上下文有不同解释方式。

1.2程序被其他程序翻译成不同的格式

  • 程序被其他程序翻译成不同形式,开始为ASCⅡ文本,然后被编译器和链接器翻译成二进制可执行文件。GCC编译的四个步骤:预处理(gcc -E)、编译(gcc -S)、汇编(gcc -c)、链接, gcc - 选项可以简记为“ESc”,相应的产出文件的后缀可以简记为“iso”
  • 系统硬件由总线、I/O设备、主存、处理器,其中CPU可执行加载、存储、操作、跳转
  • 系统中的存储设备层次结构划分——CPU寄存器在顶部、多层高速缓存存储器、DRAM主存和磁盘存储器。层次结构中较高层次存储设备可作为较低层次设备的高速缓存。
  • 文件是对I/O的抽象、虚拟存储器是对程序存储器的抽象、进程是对正在运行的程序的抽象、虚拟机是计算机的抽象。

7 静态库与动态链接共享库

函数库分为静态库和动态库两种。下文摘自《Linux静态库和动态库区别》 作者:zjjyliuweijie

静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

本文主要通过举例来说明在Linux中如何创建静态库和动态库,以及使用它们。

在创建函数库前,我们先来准备举例用的源程序,并将函数库的源程序编译成.o文件。

  第1步:编辑得到举例的程序--hello.h、hello.c和main.c;

  hello.h(见程序1)为该函数库的头文件。

  hello.c(见程序2)是函数库的源程序,其中包含公用函数hello,该函数将在屏幕上输出"Hello XXX!"。

  main.c(见程序3)为测试库文件的主程序,在主程序中调用了公用函数hello。

  程序1: hello.h

  #ifndef HELLO_H

  #define HELLO_H

  void hello(const char *name);

  #endif //HELLO_H

  程序2: hello.c

  #include

  void hello(const char *name)

  {

  printf("Hello %s!/n", name);

  }

  程序3: main.c

  #include "hello.h"

  int main()

  {

  hello("everyone");

  return 0;

  }

  第2步:将hello.c编译成.o文件;

  无论静态库,还是动态库,都是由.o文件创建的。因此,我们必须将源程序hello.c通过gcc先编译成.o文件。

  在系统提示符下键入以下命令得到hello.o文件。

  # gcc -c hello.c

  #

  (注1:本文不介绍各命令使用和其参数功能,若希望详细了解它们,请参考其他文档。)

  (注2:首字符"#"是系统提示符,不需要键入,下文相同。)

  我们运行ls命令看看是否生存了hello.o文件。

  # ls

  hello.c hello.h hello.o main.c

  #

  (注3:首字符不是"#"为系统运行结果,下文相同。)

  在ls命令结果中,我们看到了hello.o文件,本步操作完成。

  下面我们先来看看如何创建静态库,以及使用它。

  第3步:由.o文件创建静态库;

  静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库名为myhello,则静态库文件名就是libmyhello.a。在创建和使用静态库时,需要注意这点。创建静态库用ar命令。

  在系统提示符下键入以下命令将创建静态库文件libmyhello.a。

  # ar cr libmyhello.a hello.o

  #

  我们同样运行ls命令查看结果:

  # ls

  hello.c hello.h hello.o libmyhello.a main.c

  #

  ls命令结果中有libmyhello.a。

  第4步:在程序中使用静态库;

  静态库制作完了,如何使用它内部的函数呢?只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态库名,gcc将会从静态库中将公用函数连接到目标文件中。注意,gcc会在静态库名前加上前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文件。

  在程序3:main.c中,我们包含了静态库的头文件hello.h,然后在主程序main中直接调用公用函数hello。下面先生成目标程序hello,然后运行hello程序看看结果如何。

  # gcc -o hello main.c -L. -lmyhello

  # ./hello

  Hello everyone!

  #

  我们删除静态库文件试试公用函数hello是否真的连接到目标文件 hello中了。

  # rm libmyhello.a

  rm: remove regular file `libmyhello.a'? y

  # ./hello

  Hello everyone!

  #

  程序照常运行,静态库中的公用函数已经连接到目标文件中了。

  我们继续看看如何在Linux中创建动态库。我们还是从.o文件开始。

  第5步:由.o文件创建动态库文件;

  动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其文件扩展名为.so。例如:我们将创建的动态库名为myhello,则动态库文件名就是libmyhello.so。用gcc来创建动态库。

  在系统提示符下键入以下命令得到动态库文件libmyhello.so。

  # gcc -shared -fPCI -o libmyhello.so hello.o

  #

  我们照样使用ls命令看看动态库文件是否生成。

  # ls

  hello.c hello.h hello.o libmyhello.so main.c

  #

  第6步:在程序中使用动态库;

  在程序中使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明动态库名进行编译。我们先运行gcc命令生成目标文件,再运行它看看结果。

  # gcc -o hello main.c -L. -lmyhello

  # ./hello

  ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory

  #

  哦!出错了。快看看错误提示,原来是找不到动态库文件libmyhello.so。程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。我们将文件 libmyhello.so复制到目录/usr/lib中,再试试。

  # mv libmyhello.so /usr/lib

  # ./hello

  Hello everyone!

  #

  成功了。这也进一步说明了动态库在程序运行时是需要的。

  我们回过头看看,发现使用静态库和使用动态库编译成目标程序使用的gcc命令完全一样,那当静态库和动态库同名时,gcc命令会使用哪个库文件呢?抱着对问题必究到底的心情,来试试看。

  先删除 除.c和.h外的 所有文件,恢复成我们刚刚编辑完举例程序状态。

  # rm -f hello hello.o /usr/lib/libmyhello.so

  # ls

  hello.c hello.h main.c

  #

  在来创建静态库文件libmyhello.a和动态库文件libmyhello.so。

  # gcc -c hello.c

  # ar cr libmyhello.a hello.o

  # gcc -shared -fPCI -o libmyhello.so hello.o

  # ls

  hello.c hello.h hello.o libmyhello.a libmyhello.so main.c

  #

  通过上述最后一条ls命令,可以发现静态库文件libmyhello.a和动态库文件libmyhello.so都已经生成,并都在当前目录中。然后,我们运行gcc命令来使用函数库myhello生成目标文件hello,并运行程序 hello。

  # gcc -o hello main.c -L. -lmyhello

  # ./hello

  ./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory

  #

  从程序hello运行的结果中很容易知道,当静态库和动态库同名时, gcc命令将优先使用动态库。

教材学习中的问题和解决过程

在看教材的时候,突然想到了娄老师上课提到的c语言的高内聚,低耦合这样的专业术语,虽然自己听了反复好几遍,但自己对于这编程精髓6字还是没有很好的理解,希望这学期通过娄老师的深入理解程序设计这门课程让自己对这六个字有深刻的理解亲。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
第一周 56/200 1/2 4/10

参考资料

《深入理解计算机系统》(第三版)

转载于:https://www.cnblogs.com/Twe1vE/p/7587294.html

# 20155337 2017-2018-1 《信息安全系统设计基础》第一周学习总结相关推荐

  1. 信息安全系统设计基础第一周学习总结

    学习计时:共15小时 读书:1 代码:10 作业:13 博客:1 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3. 熟练使用Linux中用户管理命令 ...

  2. 20135323符运锦---信息安全系统设计基础第一周学习总结

    学习计时:共15小时 读书:1小时 代码:8小时 作业:4小时 博客:2小时 一.学习目标 1. 能够独立安装Linux操作系统   2. 能够熟练使用Linux系统的基本命令   3. 熟练使用Li ...

  3. 20135304刘世鹏——信息安全系统设计基础第一周学习总结

    第一节 Linux系统简介 一.Linux是一个操作系统 1. Linux 本身只是操作系统的内核.内核是使其他程序能够运行的基础. 它实现了多任务和硬件管理,用户或者系统管理员交互运行的所有程序 实 ...

  4. LINUX信息安全系统设计基础第一周学习总结

     Linux系统简介 一.实验内容 了解 Linux 的历史,Linux 与 Windows 的区别等入门知识. 二.实验要求 阅读linux简介与历史 三.实验步骤 二.Linux 与 Window ...

  5. 20135306-信息安全系统设计基础第一周学习总结

    第二周(9.14-9.20): 学习计时:共14小时 读书:2h 代码:4h 作业:4h 博客:4h 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3 ...

  6. 20135219洪韶武——信息安全系统设计基础第九周学习总结

    信息安全系统设计基础第九周学习总结 学习时间:7小时 学习内容:课本第十章 一.第十章知识点(1~6) 第一部分:文件的概念及相关操作 1.每个unix文件都是一个m字节的序列:所有I/O设备如网络. ...

  7. 信息安全系统设计基础第二周学习总结

    信息安全系统设计基础第二周学习总结 学习目标 1. 熟悉Linux系统下的开发环境    2. 熟悉vi的基本操作    3. 熟悉gcc编译器的基本原理    4. 熟练使用gcc编译器的常用选项 ...

  8. 信息安全系统设计基础第九周学习总结

    第十章 系统级I/O的实践 学习目标: 代码阅读理解: 1.编译运行代码 2.使用man学习理解相关系统调用, 理解参数.返回值的含义 3.会用grep -nr xxx /usr/include 查宏 ...

  9. 20135219洪韶武——信息安全系统设计基础第四周学习总结

    信息安全系统设计基础第四周学习总结 学习任务:教材第三章 学习时间:10小时 学习内容 一.教材知识梳理 1.程序编码与机器级代码 程序编码: gcc编译器,将源代码转化成可执行代码,C预处理器-汇编 ...

  10. 20135203齐岳 信息安全系统设计基础第四周学习总结

    20135203齐岳 信息安全系统设计基础第四周学习总结 学习计时:共17小时 读书:10 代码:1 作业:3 博客:3 一.学习目标 理解逆向的概念以及 掌握X86汇编基础,能够阅读(反)汇编代码 ...

最新文章

  1. 招聘|阿丘科技招系统软件与图像算法工程师(内推)
  2. 破除SCI至上!评价 AI 科研成果,需要新思路【附报告下载】
  3. android java显示_Android Studio没有显示java类源代码
  4. cocos2dx游戏--欢欢英雄传说--添加攻击按钮
  5. centos7 修改为任意网卡名_centos7首次启动需要配置的内容
  6. Windows Azure 安全最佳实践 - 第 4 部分:需要采取的其他措施
  7. android os 偷跑,不测不知道,原来我们的流量每天都在被“偷”走!
  8. 设置php中字符编码_php如何设置字符编码
  9. matlab虚拟现实之V-Realm Builder2特别组节点使用
  10. Linux 文件权限、用户权限和用户组管理vim的一些基本使用技巧
  11. Scan chain/SE,SI,SO 带scan的寄存器
  12. Android 自定义带拼音Textview 带音调
  13. MATLAB代码:基于分布式优化的多产消者非合作博弈能量共享
  14. IP地址和mac地址的区别
  15. 赶不上春天,无法同其它植物竞相开放
  16. 外设键盘win和alt功能互换解决方法
  17. 个人博客建设——Hexo主题icarus的_config.icarus.yml配置参数注释
  18. 造一个智能语音音箱!!!太简单了【语音智能管家】
  19. python爬虫-喜马拉雅_晚安妈妈睡前故事
  20. android 图片字体涂鸦,Android 编辑图片 Canvas画图,涂鸦,马赛克等(一)

热门文章

  1. asp批量生成html静态页面方法
  2. Endpoint 理解
  3. wing IDE常用快捷键
  4. 什么是ActiveX插件
  5. 用上 RocketMQ,系统性能提升了 10 倍!
  6. 为什么 char 数组比 String 更适合存储密码?
  7. 单例模式反射、序列化漏洞及解决方案!
  8. 看到了商机,为什么赚不到钱?
  9. 写给对 ”游戏开发” 感兴趣的朋友们
  10. Go语言学习之encoding/json包