开天辟地的篇章
PA0 [[系统基础环境配置.mdx]] 👉 PA1↗ 记录时间:🍅
一些随便记录的东西
状态机
计算机可以分为两部分, 时序逻辑部件, 组合逻辑部件。 在每个时钟周期到来的时候, 计算机根据当前时序逻辑部件的状态, 在组合逻辑部件的作用下, 计算出并转移到下一时钟周期的新状态. 0和1两种状态 如果有50个byte,那就有N=2的50次方种状态
被逗笑的地方
![[Pasted image 20250719143612.png]]
![[Pasted image 20250719163659.png]] 一开始:不就小小PA吗… 后来…:为什么要用这么变态的PA来折磨自己
NEMU
是什么?Nanking University EMUlator 南大的emulator 模拟器
ISA
是什么? Instruction Set Architecture 指令集架构
Kconfig
保证不同ISA,运行结果正常。 .config 生成(CONFIG_X86=y) conf生成: autoconf.h 控制哪些源代码被编译 auto.conf 控制哪些文件参与编译(控制Makefile的源文件和变量)
Monitor
(监视器) 读入客户程序 调试器
nemu
├── configs # 预先提供的一些配置文件
├── include # 存放全局使用的头文件
│ ├── common.h # 公用的头文件
│ ├── config # 配置系统生成的头文件, 用于维护配置选项更新的时间戳
│ ├── cpu
│ │ ├── cpu.h
│ │ ├── decode.h # 译码相关
│ │ ├── difftest.h
│ │ └── ifetch.h # 取指相关
│ ├── debug.h # 一些方便调试用的宏
│ ├── device # 设备相关
│ ├── difftest-def.h
│ ├── generated
│ │ └── autoconf.h # 配置系统生成的头文件, 用于根据配置信息定义相关的宏
│ ├── isa.h # ISA相关
│ ├── macro.h # 一些方便的宏定义
│ ├── memory # 访问内存相关
│ └── utils.h
├── Kconfig # 配置信息管理的规则
├── Makefile # Makefile构建脚本
├── README.md
├── resource # 一些辅助资源
├── scripts # Makefile构建脚本
│ ├── build.mk
│ ├── config.mk
│ ├── git.mk # git版本控制相关
│ └── native.mk
├── src # 源文件
│ ├── cpu
│ │ └── cpu-exec.c # 指令执行的主循环
│ ├── device # 设备相关
│ ├── engine
│ │ └── interpreter # 解释器的实现
│ ├── filelist.mk
│ ├── isa # ISA相关的实现
│ │ ├── mips32
│ │ ├── riscv32
│ │ ├── riscv64
│ │ └── x86
│ ├── memory # 内存访问的实现
│ ├── monitor
│ │ ├── monitor.c
│ │ └── sdb # 简易调试器
│ │ ├── expr.c # 表达式求值的实现
│ │ ├── sdb.c # 简易调试器的命令处理
│ │ └── watchpoint.c # 监视点的实现
│ ├── nemu-main.c # 你知道的...
│ └── utils # 一些公共的功能
│ ├── log.c # 日志文件相关
│ ├── rand.c
│ ├── state.c
│ └── timer.c
└── tools # 一些工具
├── fixdep # 依赖修复, 配合配置系统进行使用
├── gen-expr
├── kconfig # 配置系统
├── kvm-diff
├── qemu-diff
└── spike-diffNEMU ISA相关的API说明文档
https://nju-projectn.github.io/ics-pa-gitbook/ics2024/nemu-isa-api.html↗
Mac 使用Docker跑PA
退出进入 退出容器 :exit ctrl+D。关机 退出终端但运行容器 cl+P+cl+Q 进入:docker start -ai pa-dev
重新用Mac做PA
复习一下
vim
v visual mode yy copy the line yw copy the word p paste ctrol+g show the position G go to the front text number+G
:set ic(ignore case) :set hls is :set noic :nohlsearch
gdb
- 编译程序:
gcc -ggdb test.c -o test - 启动 GDB:
gdb ./test - 设置断点:
b 9(在第 9 行设置断点) - 运行程序:
r(程序会在第 9 行暂停) - 单步进入函数:
s(进入add函数内部) - 打印变量值:
p a(输出$1 = 10)、p b(输出$2 = 20) - 单步执行:
n(执行到return a + b行) - 继续执行:
c(程序执行到结束,输出sum = 30) - 退出 GDB:
q
Tmux 常用命令与操作
一、安装 tmux
bash
# Ubuntu/Debian
sudo apt-get install tmux
# CentOS/RHEL
sudo yum install tmux
# macOS(需先安装 Homebrew)
brew install tmux二、核心概念
- 会话(Session):独立工作空间,包含多个窗口
- 窗口(Window):会话中的标签页
- 面板(Pane):窗口中的分屏区域
三、会话管理命令
| 命令 | 功能描述 |
|---|---|
tmux | 新建默认会话 |
tmux new -s <会话名> | 新建指定名称的会话(例:tmux new -s mywork) |
tmux ls 或 tmux list-sessions | 列出所有会话 |
tmux a -t <会话名/编号> | 进入指定会话(例:tmux a -t mywork) |
tmux kill-session -t <会话名> | 关闭指定会话 |
tmux kill-server | 关闭所有会话 |
四、窗口操作(在 tmux 会话内,需先按前缀键 Ctrl+b)
| 快捷键 | 功能描述 |
|---|---|
c | 新建窗口 |
w | 列出所有窗口(可上下键选择) |
数字键 | 切换到第 N 个窗口(例:0 切换到第 1 个窗口) |
, | 重命名当前窗口 |
& | 关闭当前窗口(需确认) |
五、面板操作(在 tmux 会话内,需先按前缀键 Ctrl+b)
| 快捷键 | 功能描述 |
|---|---|
% | 垂直分割面板(左右分屏) |
" | 水平分割面板(上下分屏) |
方向键 | 切换到相邻面板 |
z | 当前面板全屏 / 取消全屏 |
x | 关闭当前面板(需确认) |
Alt+方向键 | 调整面板大小 |
六、其他常用操作(前缀键 Ctrl+b 后)
| 快捷键 | 功能描述 |
|---|---|
d | 退出会话但不关闭(后台运行) |
? | 查看所有快捷键帮助 |
: | 进入命令模式(可输入 tmux 命令) |
七、使用流程示例
- 新建会话:
tmux new -s myproject - 新建窗口:
Ctrl+b→c - 垂直分屏:
Ctrl+b→% - 切换面板:
Ctrl+b→ 方向键 - 退出会话(后台运行):
Ctrl+b→d - 重新进入:
tmux a -t myproject - 关闭会话:进入会话后输入
exit或Ctrl+d
八、自定义配置(~/.tmux.conf)
bash
# 示例:将前缀键改为 Ctrl+a(默认是 Ctrl+b)
set -g prefix C-a
unbind C-b
bind C-a send-prefix
# 使面板切换更流畅(可选)
set -g mouse on # 允许鼠标操作配置生效:tmux source ~/.tmux.conf
nemu
├── configs # 预先提供的一些配置文件
├── include # 存放全局使用的头文件
│ ├── common.h # 公用的头文件
│ ├── config # 配置系统生成的头文件, 用于维护配置选项更新的时间戳
│ ├── cpu
│ │ ├── cpu.h
│ │ ├── decode.h # 译码相关
│ │ ├── difftest.h
│ │ └── ifetch.h # 取指相关
│ ├── debug.h # 一些方便调试用的宏
│ ├── device # 设备相关
│ ├── difftest-def.h
│ ├── generated
│ │ └── autoconf.h # 配置系统生成的头文件, 用于根据配置信息定义相关的宏
│ ├── isa.h # ISA相关
│ ├── macro.h # 一些方便的宏定义
│ ├── memory # 访问内存相关
│ └── utils.h
├── Kconfig # 配置信息管理的规则
├── Makefile # Makefile构建脚本
├── README.md
├── resource # 一些辅助资源
├── scripts # Makefile构建脚本
│ ├── build.mk
│ ├── config.mk
│ ├── git.mk # git版本控制相关
│ └── native.mk
├── src # 源文件
│ ├── cpu
│ │ └── cpu-exec.c # 指令执行的主循环
│ ├── device # 设备相关
│ ├── engine
│ │ └── interpreter # 解释器的实现
│ ├── filelist.mk
│ ├── isa # ISA相关的实现
│ │ ├── mips32
│ │ ├── riscv32
│ │ ├── riscv64
│ │ └── x86
│ ├── memory # 内存访问的实现
│ ├── monitor
│ │ ├── monitor.c
│ │ └── sdb # 简易调试器
│ │ ├── expr.c # 表达式求值的实现
│ │ ├── sdb.c # 简易调试器的命令处理
│ │ └── watchpoint.c # 监视点的实现
│ ├── nemu-main.c # 你知道的...
│ └── utils # 一些公共的功能
│ ├── log.c # 日志文件相关
│ ├── rand.c
│ ├── state.c
│ └── timer.c
└── tools # 一些工具
├── fixdep # 依赖修复, 配合配置系统进行使用
├── gen-expr
├── kconfig # 配置系统
├── kvm-diff
├── qemu-diff
└── spike-diff