Linux第七次实验笔记

期中总结


习题总结与分析

  • 填空:Linux Bash中,Ctrl+a快捷键的作用是(将光标移至输入行头,相当于Home键)。

    • [ctrl]+u 从游标处向前删除指令串
    • [ctrl]+k 从游标处向后删除指令串
    • [ctrl]+a 将光标移至输入行头,相当于Home键
    • [ctrl]+e 将光标移至输入行尾,相当于End键
  • 判断:Linux Bash中, man printf和man 1 printf 功能等价。 √

    • man的用法如下:

      man [-adfhktwW] [section] [-M path] [-P pager] [-S list] [-m system] [-p string] name ...

    • section为可选参数,分别为1~8:

      • 可执行程序或shell命令
      • 系统调用
      • 库调用(库函数)
      • 特殊文件(设备文件)
      • 文件格式和习惯
      • 游戏
      • 文件系统标准描述、网络协议、ASCII和其他字符集
      • 系统管理命令
    • 当未对section做出指定时,会默认查找section=1中的指令。

  • 填空:在 Linux 里面可以使用使用(groups)命令知道自己属于哪些用户组。

    • groups命令:显示用户所在组

    • groups命令在标准输入输出上输出指定用户所在组的组成员,每个用户属于/etc/passwd中指定的一个组和在/etc/group中指定的其他组

    • Usage: groups [OPTION]... [USERNAME]...

  • 填空:在 Linux 里面可以使用使用(chmod)命令修改文件的权限。

    • chmod [who] [+ | - | =] [mode] 文件名
    • 具体用法见第一次实验报告文件权限部分。
  • 填空:Linux中没有C盘,D盘,其文件系统的目录是由(FHS)标准规定好的。

    • FHS(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准),多数 Linux 版本采用这种文件组织形式。
  • 判断:Linux Bash中,cd - 命令可以切换到'home'目录。 ×

    • 进入你的“home”目录:

      cd ~ 或者 cd /home/<你的用户名>

    • 回到上一次所在目录:

      cd -

    • 进入上一级目录:

      cd ..

    • 回到根目录:

      cd

  • 填空:Linux Bash中,强制删除test文件的命令是(rm -f test )

    • 强制删除文件:

      rm -f 文件名

    • 删除目录:

      rm -r 目录名

  • 判断:Linux Bash中,cat -n 和 nl 命令功能等价。√

    • 两种命令均为在行号字段最左端显示
  • 判断:Linux Bash中,source 和 . 命令功能等价。 √

  • 填空:Linux Bash中,查找home目录中前天创建的文件的命令是(find ~ -ctime 2)。

    • -mtime n: n 为数字,表示为在n天之前的”一天之内“修改过的文件
    • -mtime +n: 列出在n天之前(不包含n天本身)被修改过的文件
    • -mtime -n: 列出在n天之前(包含n天本身)被修改过的文件
    • -atime 最后访问时间
    • -ctime 创建时间
  • 判断:Linux Bash中,使用tar命令把home目录打包成home.tar的命令是( tar -cf home.tar ~)

  • 填空:Linux Bash中,zip命令使用(-e)参数可以创建加密压缩包。

  • 判断:Linux Bash中,df和 du 命令功能等价。x

    • df:命令查看磁盘的容量
    • du:命令查看目录的容量
  • 填空:Linux Bash中,ls . | sort 命令的功能是( 显示当前目录内容并排序)

    • ls:列出当前目录的内容
    • .:表示当前目录下
    • sort:进行排序
  • 填空:Linux Bash中,使用grep查找当前目录下*.c中main函数在那个文件中的命令是( grep main *.c )

  • grep 填空:查找宏 STDIN_FILENO 的值的命令是(grep -nr XXX /usr/include)

  • 填空:Linux Bash中,使用wc统计hello.c共有几行代码的的命令是( wc -l hello.c)

    • 行数

      $ wc -l /etc/passwd

    • 单词数

      wc -w /etc/passwd

    • 字节数
      wc -c /etc/passwd

    • 字符数
      wc -m /etc/passwd

    • 最长行字节数
      wc -L /etc/passwd

  • 判断:col 命令的-h参数可以将Tab换成对等数量的空格建。x

    • col -x:

      将Tab转换为空格

    • col -h:

      将空格转换为Tab(默认选项)

  • 填空:Linux Bash中,把ls命令显示当前目录的结果存入ls.txt的命令输出重定向命令是(ls > ls.txt)

  • 填空:Linux Bash中,(tee)命令可以同时重定向到多个文件

  • man -k 填空: 数据结构中有线性查找算法,C标准库中没有这个功能的函数,但Linux中有,这个函数是(lfind或lsearch)

    • man -k line |grep search 即可找到
  • man -k 填空:Linux中显示文件(file )属性(status)的命令是( stat )

    • man -k file |grep status 即可找到
  • cheat 填空:To list the content of /path/to/foo.tgz archive using tar ( tar -jtvf /path/to/foo.tgz )

    • cheat tar即可寻找到答案
  • find 填空:查找当前目录下所有目录的find命令是(find . -type d)

  • CH01填空:计算机系统中的所有信息都是位串表示的,所谓(信息)就是位+上下文。

  • CH01填空:存储器层次结构的主要思想是上层存储器作为下层存储器的(高速缓存)。

  • CH01填空:操作系统中最基本的四个抽象是(虚拟机、进程、虚拟存储器、文件)。

  • CH07填空:链接器的两个主要任务是(符号解析和重定位)。

  • CH07 判断:C语言中,全局变量是强符号。(X)

    • 对C++来说,编译器默认函数和初始化了的全局变量称为强符号,未初始化的全局变量为弱符号。
  • CH07 填空:(加载器)将可执行文件的内容映射到存储器,并运行这个程序。

  • CH07 选择:Linux中,反汇编.text节中的二进制指令使用的工具是objdump

  • 在vi中,查看scanf和printf man pages(帮助文档)的命令分别是K 和 3K

  • gdb 判断: gdb中next和step都可以单步跟踪,根据自顶向下原则应该优先选用step. (X )

    • 优先运行next,si为单步运行。
  • ch01 填空:抽象是CS中一个重要的概念,在出来器里,(指令集结构)提供了对实际处理器的抽象。

  • ch01 选择:并行的三个层次不包含(C)。A 线程级并发 B指令级并行 C进程级并发 D SIMD

    • 并行地三个层次:
      • 线程级并发
      • 指令级并发
      • SIMD
  • ch07 填空:gcc -f PIC xxx.c 中的PIC的意思是(位置无关的代码 or Position-Independent Code)

  • ch07章中其余题目应注意与、或、非、补码、反码、移位等运算,详见第四周的报告

  • regex 判断: 正则表达式r.t可以匹配rt. (x)

    • .匹配的除换行符( \n )以外任意一个字符,不包括空字符
  • regex 判断:正则r表达式zo*可以匹配z. (√)

    • 表达式不出现或出现任意次
  • CH03 填空:从i386开始,x86体系结构扩展到了32位,增加了(平坦)寻址模式

  • CH03 填空:在64位机器上,要用gcc编译出32位机器码,需要使用(-m32) 选项

  • CH03 填空:对于机器级编程来说,两种重要的抽象是(ISA,虚拟地址)

  • CH03 填空:Linux中,对目标代码code.o进行反汇编的命令是(objdump -d code.o)

  • CH03 填空:IA32指令中,操作数的三种类型是(立即数、寄存器、存储器)

  • 3.1 填空: 针对练习3.1中的图,操作数 8(%eax,%ecx,4)的值是(0x11)

    • 8+(%eax)+4(%ecx)
  • CH03 判断: 把内存中地址为0x4050处的字复制到地址为0x405c处的指令是 movw ($0x4050) ,($0x405c) (x)

  • CH03 判断: %esp的值为0x10c, pushl %eax后,%esp的值为0x108. (√)

  • 3.3 判断: movb $0xF, (%eax) 是正确汇编语句. (√)

  • 3.5 填空: decode1函数的功能是( 数据交换 )

  • 3.6 填空: 指令leal 3(%eax,%ecx,4), %edx 存储在%edx中的值为( 3+x+4y )

  • 3.9 填空: arith函数的功能是( ~((x^y)>>3) -z )

  • 3.14 判断: 汇编代码不会记录程序值的类型。(√)

  • CH03 填空:C语言中的条件表达式在汇编中是结合(有条件跳转和无条件跳转)实现的。

  • CH03 填空:C语言中的循环结构可以用(条件测试和跳转组合起来)实现。

  • CH03 选择:栈用来(ABCD) A 传递参数 B 存储返回信息 C保存寄存器 D本地存储。

  • CH03 填空:Linux汇编中,形成空调用栈帧的语句是(push %ebp movl %esp %ebp)

  • CH03 填空:Linux汇编中,函数有返回值存在( %eax )寄存器中。

  • CH04 判断:Y86中,程序员的可见状态包括PC。(√)

  • CH04 判断:Y86中,状态码INS表示遇到非法指令。(√)

  • CH04 填空:创建Y86代码唯一的工具是(汇编器 or YAS)

  • 4.6 判断:Y86中,pushl压入栈的是减去4的%esp的值。(x)

    • 根据题意应该是压入原始值
  • CH04 填空:实现一个数字系统需要三组成部分(组合逻辑、存储器元素、时钟信号)。

  • CH04 填空:HCL代表(Hardware Control Language, 硬件控制语言)

  • CH04 填空:Y86中,使用时钟寄存器保存程序计数器PC、条件代码CC和(程序状态Stat)

  • CH04 填空:Y86中,指令执行分为六个阶段(取指、译码、执行、访存、写回、更新PC)

  • CH04 填空:Y86中对于PC值p=100,指令包括一个寄存器指示符字节和,常数1,增加器产生值(106)

  • CH06 判断: SRAM比DRAM快。(√)

  • CH06 判断:EEPROM可以用紫外线进行擦除。(x)

    • EPROM紫外线光照射过窗口即可被清楚为0.
    • EEPROM电子可擦出ROM,直接在印刷电路卡上编程。
  • CH06 填空:根据携带信号不同,总线可分为(数据总线、地址总线、控制总线)三种。

  • 6.2 填空:计算磁盘容量(327.68G):4个盘片,100000个柱面,每条磁道800个扇区,每个扇区512个字节。

    • 51280041000002=327680000000字节
    • 1G=10^9字节
  • CH06 填空:对磁盘扇区的访问时间包括三个部分(寻道时间、旋转时间、传送时间)。

  • 6.3 填空:最大旋转时间是(4ms)。

    • 求Tmax rotation
  • CH06 填空:逻辑磁盘块的逻辑块号可以翻译成一个(盘面、磁道、扇区)三元组。

  • CH06 填空:CPU使用(存储器映射I/O)技术向I/O设备发出命令。

  • CH06 填空:局部性有两种形式(时间局部性、空间局部性)。

  • CH06 判断:程序访问一个向量,步长越大空间局部性越好。(x)

    • 具有步长为k的引用模式的程序,步长越小,空间局部性好。
  • CH06 判断:程序中的循环语句具有良好的时间局部性和空间局部性。(√)

    • 在小结中给出
  • 6.8 填空:只修改第八行,让程序具有良好的空间局部性。改为:( sum +=a[i][j][k] )

    • 使最右边的索引变化最快。
  • CH06 填空:存储层次结构的中心思想是(上层作为下层的缓存)。

  • CH06 填空:缓存不命时,决定哪个块是牺牲块由(替换策略)来控制。

  • CH06 填空:空缓存的不命中叫(强制性不命中或冷不命中)

  • CH06 填空:容量不命中的原因是(缓存太小)

  • CH06 填空:高速缓存结构可以用元组(S,E,B,m)来描述。

  • 6.10 填空:高速缓存容量为1024,高速缓存结构为(( 32 ),4,8,32)

    • S = 2^s
    • B = 2^b
    • m = log2(M)
    • t = m-(s+b)
    • C=B×E×SS
  • 6.11 填空:3/4的命中率的如何计算的((32-8)/32,或每4次有一次不命中)

  • CH06 判断:存储器山中山脊代表空间局部性。(x)

gcc的考察需要注意并熟练掌握

以练习题为例

  • 编译和运行以上代码的命令(2分)

    gcc *.c -o main

    ./main

  • 使用GDB调试以上代码:编译代码的命令是?main.c中如何给main函数设置断点?如何在第六行设置断点?

    gcc -g *.c -o main

    b main

    b 6

  • 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a?(3分)

    gcc -c add.c sub.c mul.c div.c

    ar rcvs libmymath.a add.o sub.o mul.o div.o

    gcc main.c -o main -L. -lmymath (or gcc main.c ./libmymath.a -o main)

  • 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so?(4分)

    gcc -fPIC -c add.c sub.c mul.c div.c

    gcc -shared -o libmymath.so add.o sub.o mul.o div.o

    gcc -o main main.c -L. -lmymath

    libmymath.so 要拷贝到/lib or /usr/lib

  • 写出编译上面代码的makefile,编译出来的目标文件为
    testmymath, 只用显式规则就可以.(4分)

      testmymath: main.o add.o sub.o mul.o div.o 
      gcc main.o add.o sub.o mul.o div.o -o testmymath
      main.o: main.c head.h
      gcc -c main.c
      add.o: add.c head.h
      gcc -c add.c
      sub.o: sub.c head.h
      gcc -c sub.c
      mul.o: mul.c head.h
      gcc -c mul.c
      div.o: div.c head.h
      gcc -c div.c
    

gdb的补充内容

  • 在编译程序前需要加上-g
  • 利用disassemable可以查看该程序的汇编代码以及此时运行到哪个语句了
  • 利用p指令查看元素值,若在寄存器中可以利用$来进行调用查看
  • list可以查看程序的部分代码,便于利用b来设置断点。

不足之处以及改正方法

  • 看书时对于一些定义与细节直接忽略过去,而并未在意。以致在考试过程中需要重新翻书查找。对于考试中涉及到的内容课后重新阅读与学习。
  • 在学习过程中也发现理解书中的内容,其实有的时候利用课后习题。这样可以让理解更深,更容易记忆。
posted @ 2015-11-01 17:22  20135212池彬宁  阅读(503)  评论(1编辑  收藏  举报