2019-2020-1 20199301《Linux内核原理与分析》第二周作业

第二周Linux学习笔记

文件打包与解压缩


  • tar工具打包
    tar的解压和压缩都是同一个命令,只需参数不同,使用较方便。
    创建一个包时文件名必须紧跟在 -f 之后,解包一个文件(-x参数)到指定路径的已存在目录(-c参数)。

    各内容及代码:

  • 只查看不解包文件(-t参数):
tar -tf shiyanlou.tar
  • 使用tar备份文件,保留文件的属性(-p参数),备份链接指向的源文件而不是链接本身(-h参数):
tar -cphf etc.tar /etc
  • tar可以只需要换一个参数创建不同格式的压缩文件(在创建tar文件的基础上添加一个参数 -z)。
    使用gzip压缩文件:
tar -czf shiyanlou.tar.gz/home/shiyanlou/Desktop
  • 解压(*.tar.gz)
tar -xzf shiyanlou.tar.gz

-###各参数及格式:

总结

  • zip:
    • 打包 :zip something.zip something (目录请加-r参数)
    • 解包:unzip something.zip
    • 指定路径:-d 参数
  • tar:
    • 打包:tar -cf something.tar something
    • 解包:tar -xf something.tar
    • 指定路径:-c参数


      文件系统操作与磁盘管理


  • 使用 df 命令查看磁盘的容量出现如下图所示:

    图中/dev/sda2 是对应着主机硬盘的分区,后面的数字表示分区号,数字前面的字母 a 表示第几块硬盘(也可能是可移动磁盘),1k一块表示以磁盘块大小的方式显示容量,后面为相应的以块大小表示的已用和可用容量
  • 使用 du 命令查看目录的容量:

    代码中-d 参数指定查看目录的深度。注:du(estimate file space usage)命令与df(report file system disk space usage)命令只有一字之差,容易记混。
  • 磁盘管理:用dd命令从标准输入读入用户的输入到标准输出,如截图所示:

    命令中bs用于指定块大小,count用于指定块数量。
  • 使用 mkfs 命令格式化磁盘,简单的使用mkfs命令来虚拟磁盘镜像格式化为ext4文件系统代码如下:
sudo mkfs.ext4 virtual.img

Linux下的帮助命令


  • 什么是内建命令,什么是外部命令呢?
    • 内建命令:实际上是 shell 程序的一部分,其中包含的是一些比较简单的 Linux 系统命令,这些命令是写在bash源码的builtins里面的,由 shell 程序识别并在 shell 程序内部完成运行,通常在 Linux 系统加载运行时 shell 就被加载并驻留在系统内存中。而且解析内部命令 shell 不需要创建子进程,因此其执行速度比外部命令快。
    • 外部命令:是 Linux 系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调入内存。虽然其不包含在 shell 中,但是其命令执行过程是由 shell 程序控制的。外部命令是在 Bash 之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin等等。
  • help命令:用于显示 shell 内建命令的简要帮助信息。
  • man 命令:是显示系统手册页中的内容。
  • info 命令:是来自自由软件基金会的 GNU 项目,是 GNU 的超文本帮助系统,能够更完整的显示出 GNU 信息。


    Linux任务计划crontab


  • crontab 命令从输入设备读取指令,并将其存放于 crontab 文件中,以供之后读取和执行。


计算机工作原理学习笔记


重点介绍:

  • 计算机的工作原理,涉及存储程序计算机工作模型,基本的汇编语言,C语言程序汇编出来的汇编代码如何在存储程序计算机上工作模型上一步步地执行。
    重点分析:
  • 函数调用堆栈相关汇编指令。


    1.1 存储程序计算机的工作模型


  • 冯·诺依曼体系结构:
    • 冯诺依曼指出程序和数据在逻辑上是一样的,程序也可以存储在存储器中。
  • 冯诺依曼体系结构的要点包括:
    • 运算器、存储器、控制器、输入设备和输出设备组成计算机硬件。
    • 计算机内部采用二进制表示指令和数据。
    • 存储程序的基本含义,
      冯诺依曼体系接够的核心是存储程序计算机。


      1.2 x86-32汇编基础


      x86-32CPU的存储器

      8086CPU总共有14个16位的寄存器分别是:

  • 通用寄存器
    • 数据寄存器
      • AX:累加寄存器,也成为累加器
      • BX:基地址寄存器
      • CX:计数器寄存器
      • DX:数据寄存器(可分可和的特性:分为两个独立的8位寄存器)
    • 指针寄存器
      • SP:堆栈指针寄存器
      • BP:基指针寄存器
    • 变址寄存器
      • SI:源变址寄存器
      • DI:目的变址寄存器
  • 控制寄存器
    • IP:指令指针寄存器
    • FLAG:标志寄存器
  • 段寄存器
    • CS:代码段寄存器
    • DS:数据段寄存器
    • SS:堆栈段寄存器
    • ES:附加段寄存器

      32位的寄存器(更具通用性):

  • 4个数据寄存器(EAX、EBX、ECX、EDX)
  • 2个变址和指针寄存器(ESI、EDI)
  • 2个指针寄存器(ESP、EBP)
  • 6个段寄存器(ES、CS、SS、DS、FS、GS)
  • 1个指令指针寄存器(EIP)
  • 1个标志寄存器(EFlags):可以保存当前的一些状态
    所有开头为E的寄存器,一般都是32位的。
  • EBP是堆栈基址指针,比较重要
    -ESP也比较重要,它是堆栈栈顶寄存器

    64位寄存器

  • 前面带个“R”的都是64位寄存器
  • Flags改为了RFLAGS,EIP改为了RIP

    数据格式

  • Intel规范用语中**字*表示16位数据类型。
  • 在TA32中双字表示32位数据类型。
  • 在86-64中64位数称为四字


    寻址方式


  • 汇编指令
    • 操作码
    • 操作数
      • 立即数常数
      • 寄存器数
      • 存储器引用
  • 最常见的汇编指令是mov指令,movl中的l是指32位,movb中的b是指8位,movw中的w是指16位,movq中的q是指64位。
  • 寄存器寻址:不和内存打交道如%eax,其中%开头后面跟一个寄存器名称。
  • 立即寻址:使用$开头后面跟一个数值。
  • 直接寻址:是直接用一个数值,开头没有$符号。
  • 间接寻址:就是寄存器加个小括号。加个小括号表示这个内存地址所存储的数据。
  • 变址寻址:在原地址上加上一个数字4,就是把寄存器存储的数值加4。


    常用汇编指令


  • 全是大写字母的一般都是Intel汇编,全是小写字母的一般都是AT&T汇编
  • 几个重要的指令:pushl、popl和call/ret.
pushl %eax

就是把EAX寄存器的值压倒堆栈栈顶。

popl %eax

就是从堆栈的栈顶去一个存储单元,从堆栈栈顶的位置放到EAX寄存器里,称为出栈。

call 0x12345

call指令是函数调用,调用一个地址。处于安全方面的原因EIP寄存器不能被直接使用和修改。
与call对应的是ret指令,ret指令是函数返回。call指令是C语言里我们调用一个函数,ret指令是调用函数时压栈的EIP寄存器的值还原到EIP寄存器里。带个“(*)”的指令表示这些指令都是不能被程序员直接使用的,是伪指令。


实验中的问题及解决方法:


  • 实验过程中出现在进行编译成汇编代码的过程中指令输入错误的问题如图:
  • 在进行正确的大小写更正以及空格号的规范后得以解决,按照指定操作最终如图


    总结

  • 在输入指令时容易在细节方面犯错如字母的大小写、中间的空格键时常忘记。
  • 在本章的学习过程中遇到的最大困难在于编译成汇编代码后对每一行代码的解读和堆栈空间的熟悉度以及堆栈空间在每行代码的执行下怎么产生变化等问题。
  • 书中解释的执行每行代码后寄存器的数据如何变化、寄存器什么时候开始执行下一行代码等问题需要反复去熟悉,一遍一遍从头开始读代码才能慢慢适应变化的规律。

猜你喜欢

转载自www.cnblogs.com/lsqz/p/11561419.html