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

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


第一章

  • 关于本书
    • 介绍Unix/Linux的功能,着重探讨了编程实践,让学生通过实践来练习系统编程,涵盖Unix/Linux的所有基本组件,包括进程管理、并发编程、定时器和时钟服务、文件系统、网络编程和MySQL数据库系统。
  • 系统编程的作用
    • 系统编程是计算机科学和计算机工程教育不可或缺的一部分,对学习操作系统、嵌入式系统、数据库系统、数据挖掘、人工智能等方面有着重要的作用。
  • 本书的目标
    • 强化学生的编程背景知识
    • 动态数据结构的应用
    • 进程概念和进程管理
    • 并发编程
    • 定时器和定时共嗯
    • 信号、信号处理和进程间通信
    • 文件系统
    • TCP/IP和网络编程
  • 关于Unix
    • AT&T Unix
    • Berkeley Unix
    • HP Unix
    • IBM Unix
    • Sun Unix
  • 关于Linux
    • Debian Linux
    • Ubuntu Linux
    • Linux Mint
    • 基于RPM的Linux
    • Slackware Linux
  • 虚拟机上的Linux
    • 一些命令

    • VirtualBox

    • VMware(我使用的)

    • Parallels Desktop

  • Ubuntu Linux系统管理
    • 用户账户
      在终端上输入 vi /etc/passwd
    • 添加新用户
      在终端上输入 sudo adduser username。


第二章

  • Linux中的文本编辑器

    1. vim
    • 命令模式:输入命令
    • 插入模式:输入和编辑文本
    • 末行模式:保存文件并退出
    • i:插入模式,插入文本
    • a:插入模式,追加文本
    • :w:写入(保存)文件
    • :q:退出vim
    • :wq:保存并退出
    • :q!:不保存更改,强制退出
    1. gedit
    2. emacs
    • 实践过程:

  • 使用文本编辑器

  • 程序开发

  1. 程序开发步骤

    • 创建源文件
    • gcc把源文件转成二进制可执行文件
    • gcc三个步骤
      • 将源文件转换为汇编代码
      • 将汇编代码转换成目标代码
      • 将目标代码转换成二进制可执行文件
    • 苏格拉底挑战:








  2. 静态和动态链接

    • 动态链接
      • 可以减小每个a.out文件大小
      • 许多执行程序可以在内存中共享相同库函数
      • 修改库函数不需要重新编译源文件
  3. 可执行文件

    • 二进制可执行平面文件:仅包含可执行代码和初始化数据
    • a.out可执行文件
      • 传统的a.out文件包含文件头(tsize、dsize、bsize、total_size)、代码段、数据段、bss段、符号表。
    • ELF可执行文件
  4. 程序执行过程
    在类Unix操作系统中,在sh命令行a.out one two three执行a.out文件,以标记字符串作为命令行参数。为执行命令,sh创建一个子进程并等待改子进程终止。子进程运行时,sh使用a.out文件执行新的执行映像

    • 读取a.out文件头
      • Total_Size = _brk + stackSize
    • sh从总大小中分配一个内存区给执行映像。
    • 然后,sh放弃旧映像,开始执行新映像sh放弃旧映像,开始执行新映像。
    • 执行从crt0.o开始,调用main(),将argc和argv作为参数传递给main(),可以写成
      • int main(int argc, char *argv[]){ … }
  5. 程序终止

    • 正常终止
      • 程序执行成功,main()最终会返回到crt0.out,调用库函数exit(0)(系统调用)来终止进程
    • 异常终止
      • 遇到错误,如无效地址,非法指令,越权等,按下ctrl+C可以产生硬件中断,用命令kill -s signal_number pid #signal_number=1 to 31向通过pid识别的目标进程发送信号。
  • C语言中的函数调用
    • long jump:通过long jump直接返回到调用序列中较早的某个函数。
  • C语言程序与汇编代码的链接
    • gcc生成的汇编代码
      • 入口代码:又叫prolog,它建立栈帧,在堆栈上分配局部变量和工作空间。
      • 函数体代码:在AX寄存器中执行带有返回值的函数任务。
      • 退出代码:又叫做epilog,它释放堆栈空间并返回到调用者。
  • 链接库
    • 动态链接库
      •  ar rcs libmylib.a mysum.o
         gcc -static t.c -L. -lmylib
         a.out```
        
    • 静态链接库
      • -L.指定链接库路径 -l指定链接库
      •    gcc -shared -o libmylib.so mysum.o
           gcc t.c -L. -lmylib
           a.out```
        
  • makefile
    • make工具是一个程序,它按照顺序读取makefile,以自动有选择的执行编译链接。
      一个make文件由一系列目标项、依赖项和规则组成
    • 当make程序读取makefile时,通过比较依赖项列表中源文件的时间戳来确定要构建哪些目标项
  • GDB调试工具
    • GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。与Window下的IDE不同,GDB是纯命令行执行的,并没有图形界面方法。
    • GDB的启动方式
      • gdb
      • gdb test.out
      • gdb test.out core

遇到的问题

  • 一开始不理解为什么要将源文件转换成二进制可执行文件
  • 解决方式:询问chatgpt,上网搜索后得知

这个过程将确保程序能够在计算机上运行,并且可以直接执行。二进制可执行文件中包含了程序的指令和数据,它可以被操作系统加载和运行。

posted @ 2023-09-10 15:09  20211428谷丰宇  阅读(17)  评论(0编辑  收藏  举报