实验及大作业相关内容

type
status
date
slug
summary
tags
category
icon
password

实验一:计算机系统漫游

notion image
  • cpp hello.c > hello.i
  • gcc -E hello.c -o hello.i
  • cc1 hello.i -o hello.s
  • gcc -S  hello.c -o hello.s
  • as hello.s -o hello.o
  • gcc -c  hello.s -o hello.o
  • ld  -dynamic-linker /lib64/ld-linux-x86-64.so.2  /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbegin.o hello.o -lc /usr/lib/gcc/x86_64-linux-gnu/9/crtend.o /usr/lib/x86_64-linux-gnu/crtn.o -z relro -o hello.out
  • gcc hello.o -o hello.out

实验二:DataLab数据表示

一、objdump

  • objdump -d <文件名> 反汇编可执行文件或目标文件中代码段
  • objdump -d <文件名> -j <段名>命令,可以查看特定段的反汇编代码
  • -d/–disassemble:以汇编代码的形式显示目标文件的代码段。
  • -S/–source:显示源代码与反汇编代码的混合模式。   gcc –g 编译
  • -f/–file-headers:显示目标文件的文件头信息。
  • -h/–section-headers:显示目标文件的各个节(section)的信息。
  • -s/–full-contents:显示目标文件的完整内容。
  • -t/–syms:显示目标文件的符号表信息。
  • -x/–all-headers:显示目标文件的所有头信息。
  • -D/–debugging:显示目标文件的调试信息(例如DWARF)。
  • -r/–reloc:显示重定位表,包含代码、数据等链接时需要修正的地址信息。
  • -j/–section:指定要显示的节(section)的名称。

二、readelf

  • -a –all  等同于同时使用:-h -l -S -s -r -d -V -A -I
  • -h --file-header  显示ELF文件头
  • -l --program-headers  显示程序头
  • -S --section-headers  显示节头
  • -t --section-details  显示节详细信息
  • -s –syms  显示符号表(symbol table)
  • -r –relocs  显示重定位信息
  • -d –dynamic  显示动态节(dynamic section)
  • -x --hex-dump=<number|name>             readelf -x.data xxxx.o
  • 以字节形式显示输出<number|name>指定节的内容
  • -p --string-dump=<number|name>
  • 以字符串形式显示输出<number|name>指定节的内容
  • -R --relocated-dump=<number|name>
  • 以重定位后的字节形式显示输出<number|name>指定节内容

实验三:二进制炸弹

objdump -d bomb > asm.txt 重定向

gdb

  • l:  (list)显式当前行的上、下若干行C语句的内容
  • b:  (breakpoint)设置断点
在main函数前设置断点:b main
在第5行程序前设置断点:b 5
  • r:  (run)执行,直到第一个断点处,若没有断点,就一直执行下去直至结束。
  • ni/stepi:(next/step instruction)单步执行机器指令
  • n/step:  (next/step)单步执行C语句
  • x:显示内存内容
  • q:退出gdb,返回linux
  • gdb其他命令的用法详见使用手册,或联机help

实验四:优化

notion image
notion image
  • 原程序
notion image
  • 一般的优化方法
notion image
  • 面向CPU(循环展开)
notion image
  • 面向Cache1(符合空间局部性)
notion image
  • 面向Cache2(按行进行分块)
notion image
  • 面向Cache3(按列进行分块)
notion image
  • 面向Cache4(按正方形进行分块)
notion image

实验五:TinyShell

一、jobs、bg、fg

  • jobs 显示作业的状态,如运行的、停止的作业
  • bg %n 使第n个任务在后台运行(%前有空格)
  • fg %n 使第n个任务在前台运行
  • bg, fg 不带%n 表示对最后一个进程操作
  • ctrl+c: 终止前台作业(进程组的每个进程)
  • ctrl+z: 停止前台作业(进程组的每个进程),随后可用fg 或bg恢复运行。

二、kill

  • kill -l:列出信号
  • kill -SIGKILL  17130: 杀死pid为17130的进程
  • kill -9 17130 :杀死pid为17130的进程,或者:
  • kill -9 -17130:杀死进程组17130中的每个进程
  • killall -9  pname: 杀死名字为pname的进程

三、ps

  • a 显示当前终端 (tty)的所有进程
  • A 或 -e 显示所有进程(包括其他用户)
  • x无终端的进程信息也显示,如 systemd 启动的服务
  • f 显示进程的全部信息
  • j 作业job格式显示(多PGID SID 两列)
  • t 指定终端,例如:ps -t tty3 ,而-t - 则表示无终端的进程
  • u 以用户为主的格式来显示程序状况,后面跟用户名

大作业:Hello’s P2P

一、P2P:从程序到进程(From Program to Process)
(一) 源代码阶段(Program)
  1. 程序员编写hello.c,通过文本编辑器创建C语言源代码文件,实现基础I/O功能。
  1. 预处理:cpp预处理器展开宏定义(#include <stdio.h>等),生成.i文件。
  1. 编译:cc1编译器将预处理后的代码翻译为汇编语言(.s文件),完成语法分析和中间代码优化。
  1. 汇编:as汇编器将汇编代码转换为机器指令,生成可重定位目标文件(.o文件)。
  1. 链接:ld链接器解析外部符号(如printf),合并标准库(libc.so)和启动代码(crt1.o),生成可执行文件hello。
(二) 进程创建(Process)
  1. Shell调用:用户通过Bash输入./hello,触发OS进程管理机制。
  1. fork():Bash调用fork()创建子进程,复制父进程上下文(PCB、文件描述符表等)。
  1. execve():子进程通过execve()系统调用加载hello程序,替换地址空间为可执行文件内容。
  1. mmap():OS将程序代码段(.text)、数据段(.data、.bss)映射到进程虚拟地址空间,并分配运行时堆栈。
二、020:从诞生到消亡(From Zero-0 to Zero-0)
(一) 进程运行阶段
  1. CPU调度:OS分配时间片,CPU通过流水线(取指、译码、执行)运行hello指令。
  1. 存储管理
① VA→PA转换:MMU通过4级页表(PGD→PUD→PMD→PTE)将虚拟地址转换为物理地址。
② 加速机制:TLB缓存常用页表项,三级Cache(L1/L2/L3)缓存内存数据,减少访存延迟。
③ Pagefile支持:当物理内存不足时,OS将部分页面换出到磁盘交换空间。
  1. I/O交互
① printf触发系统调用(write),内核通过设备驱动将字符输出到显卡显存,最终显示到屏幕。
② 信号处理:OS监控SIGINT(Ctrl+C)等信号,决定是否终止进程。
(二) 进程终止与资源回收
  1. 退出阶段:hello执行完毕,调用exit()或从main返回,触发终止流程。
  1. 资源释放
① OS回收进程占用的物理内存、关闭打开的文件描述符。
② 父进程(Bash)调用wait()回收子进程状态(僵尸进程→终止态)。
  1. 回归Zero-0:进程的PCB、内存映像等完全销毁,系统状态恢复到执行前的"零"状态。

期末真题

24春
notion image
D
notion image
objdump -d hello > hello.s
notion image
notion image
22春
notion image
gcc hello.c -o hello
objdump -d hello > 1.txt
notion image
jobs
notion image
notion image
Loading...