PA1

PA1

Sat Jul 19 2025
1930 字 · 11 分钟

开天辟地的篇章

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

(监视器) 读入客户程序 调试器

TEXT
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

NEMU 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

  1. 编译程序:gcc -ggdb test.c -o test
  2. 启动 GDB:gdb ./test
  3. 设置断点:b 9(在第 9 行设置断点)
  4. 运行程序:r(程序会在第 9 行暂停)
  5. 单步进入函数:s(进入 add 函数内部)
  6. 打印变量值:p a(输出 $1 = 10)、p b(输出 $2 = 20
  7. 单步执行:n(执行到 return a + b 行)
  8. 继续执行:c(程序执行到结束,输出 sum = 30
  9. 退出 GDB:q

Tmux 常用命令与操作

一、安装 tmux

bash

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 命令)

七、使用流程示例

  1. 新建会话:tmux new -s myproject
  2. 新建窗口:Ctrl+b → c
  3. 垂直分屏:Ctrl+b → %
  4. 切换面板:Ctrl+b → 方向键
  5. 退出会话(后台运行):Ctrl+b → d
  6. 重新进入:tmux a -t myproject
  7. 关闭会话:进入会话后输入 exit 或 Ctrl+d

八、自定义配置(~/.tmux.conf)

bash

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

PLAINTEXT
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

Thanks for reading!

PA1

Sat Jul 19 2025
1930 字 · 11 分钟

Comment

留下QQ邮箱,可以使用QQ头像~
或者在 Gravatar 设置头像~
(看不到评论试试刷新一下~)