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

第一章 引言

  • 关于本书

    • 本书是一部研究Unix/Linux系统编程的专注
  • 系统编程的作用

    • 系统编程是计算机科学和计算机工程教育不可或缺的一部分
  • 本书目标

    • 强化学生变成背景知识

    • 动态数据结构的应用

    • 进程概念和进程管理

    • 并发编程

    • 定时器和定时功能

    • 信号、信号处理和进程间通信

    • 文件系统

    • TCP/IP和网络编程

  • Unix

    • Unix是一种通用操作系统

    • AT&T Unix

    • Berkeley Unix

    • HP Unix

    • IBN Unix

    • Sun Unix

  • Linux

    • Linux是一个类Unix系统

    • Debian Linux

    • Ubuntu Linux

    • Linux Mint

    • 基于RPM的Linux

    • Slackware Linux

  • 虚拟机上的Linux

    • VirtualBox

    • VMware

    • 双启动Slackware和Ubuntu Linux

  • Unix/Linux命令

  • Ubuntu Linux系统管理

    • 添加新用户

    • 用户账户

    • sudo命令

第二章 编程背景

  • Linux中的文本编辑器

    • vim
      命令模式:用于输入命令
      插入模式:用于输入和编辑文本
      末行模式:用于保存文件并退出
      相关命令:

    • gedit

    • emacs

      • 一款强大的文本编辑器,可在多个不同的平台上运行
  • 使用emacs

    • 创建main.c文件
  • 程序开发步骤

    • 创建源文件

    • gcc把源文件转成二进制可执行文件

      • 运行main文件,输出hello
    • gcc三个步骤

      • 将源文件转换为汇编代码
      • 将汇编代码转换成目标代码
      • 将目标代码转换成二进制可执行文件
    • 苏格拉底挑战:
      以下是关于程序开发步骤的苏格拉底挑战

      以下是关于gcc三个步骤的苏格拉底挑战

  • 静态和动态链接

    • 动态链接
      • 可以减小每个a.out文件大小

      • 许多执行程序可以在内存中共享相同库函数

      • 修改库函数不需要重新编译源文件

  • 可执行文件格式

    • 二进制可执行平面文件

      • 仅包含可执行代码和初始化数据
    • a.out可执行文件

      • 传统的a.out文件包含文件头、代码段、数据段、bss段、符号表
    • ELF可执行文件

      • 可执行的链接格式文件,包含一个或多个程序段,每个程序段均可可加载至特定的内存地址。在Linux中,默认的二进制可执行文件为ELF文件
  • 程序执行过程

    • 读取a.out文件头(如TotalSize = _brk + stackSize

    • sh从大小中分配一个内存区给执行对象

    • 放弃旧映像,开始执行新映像

    • 执行从crt0.o开始,调用main(),将argc和argv作为参数传递给main(),可以写成int main( int argc,char *argv[] ){ .... }

  • 程序终止

    • 正常终止

      • 如果程序执行成功,main()最终会返回到crt0.out,调用库函数exit(0)来终止进程
    • 异常终止

      • 遇到错误,如无效地址,非法指令,越权等

      • 按下ctrl+C可以产生硬件中断

      • 使用命令kill -s signal_number pid 或者 #signal_number=1 to 31向通过pid识别的目标进程发送信号

  • C语言中的函数调用

    • 32位GCC中的运行时堆栈使用情况

    • long jump

    • 64位GCC中的运行时堆栈使用情况

      • 在64位模式下,CPU寄存器扩展到rax,rbx,rcx,rdx,rbq,rsp,rsi,rdi,r8到r15,位宽都是64位
  • 链接库

    • 静态链接库

      • gcc -c -fPIC mysum.c
      • gcc -shared -o libmylib.so mysum.o
      • gcc t.c -L. -lmylib
      • a.out
    • 动态链接库

      • gcc -c mysum.c
      • ar rcs libmylib.a mysum.o
      • gcc -static t.c -L. -lmylib
      • a.out
    • 上述两种情况如果链接库不在当前目录中,只需要更改-L.选项,设置LD_LABRARY_PATH,以包含链接库的目录

  • markfile

    • make是一个程序,按顺序读取makefile或Makefile。
  • CDB调试工具

    • GDB是由GNU开源组织发布的一款强大的UNIX程序调试工具。

    • GDB的启动方式

      • gdb
      • gdb test.out
      • gdb test.out core

遇到的问题

  • 查看用户界面没有显示用户名。
  • 解决办法:上网找另一个代码尝试,换了代码后,显示用户名。
posted on 2023-09-10 16:37  20211417黄琪凯  阅读(6)  评论(0编辑  收藏  举报