实验及大作业相关内容
type
status
date
slug
summary
tags
category
icon
password
实验一:计算机系统漫游

- 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
实验四:优化


- 原程序

- 一般的优化方法

- 面向CPU(循环展开)

- 面向Cache1(符合空间局部性)

- 面向Cache2(按行进行分块)

- 面向Cache3(按列进行分块)

- 面向Cache4(按正方形进行分块)

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

D

objdump -d hello > hello.s


22春

gcc hello.c -o hello
objdump -d hello > 1.txt

jobs


Loading...