RISC-V trap / syscall / trampoline 机制完整解析
RISC-V Trap / Syscall / Trampoline 机制完整解析 一、整体流程概览 1.1 总览 用户态通过 ecall 触发异常 → 硬件最小保存 → 跳转到 stvec → trampoline 完成上下文保存 + 切页表 → 进入内核 → 执行 syscall → 再通过 trampoline 返回用户态。 ...
RISC-V Trap / Syscall / Trampoline 机制完整解析 一、整体流程概览 1.1 总览 用户态通过 ecall 触发异常 → 硬件最小保存 → 跳转到 stvec → trampoline 完成上下文保存 + 切页表 → 进入内核 → 执行 syscall → 再通过 trampoline 返回用户态。 ...
tmux的常用指令(自己配置) prefix Prefix = Ctrl+a(因为我们把默认 Ctrl+b 改了) “Prefix + x”意思是先按 Ctrl+a,松开后再按 x 常用操作 新建窗口 Prefix + c 作用:开一个新窗口,并且继承当前目录 水平/垂直分屏 Prefix + - 作用:上下分屏(vertical split) Prefix + | 作用:左右分屏(horizontal split) 另外你配置里还保留了: Prefix + " Prefix + % 这两个也会在当前目录分屏 面板间移动(Vim 风格) Prefix + h:切到左边 pane Prefix + j:切到下边 pane Prefix + k:切到上边 pane Prefix + l:切到右边 pane 切换窗口 Alt + Left:上一个窗口 Alt + Right:下一个窗口 重命名窗口 Prefix + , 然后输入新名字回车 进入复制模式(Vi) Prefix + Enter:进入 copy-mode 在 copy-mode 里: v:开始选择 y:复制并退出 copy-mode Y:复制到系统剪贴板并退出(前提装了 wl-copy 或 xclip) 重载配置 Prefix + r 作用:不重启 tmux,立即重新加载配置 发送前缀给程序(很少用) Prefix + Ctrl+a 作用:把 Ctrl+a 传给 pane 里的程序(比如你在嵌套 tmux 时会用到) 你这份配置里“自动生效”的项(不需要按键) ...
系统调用syscall(ecall) 1.用户态的准备工作 cpu核心在用户线程(进程)上工作, pc(程序计数器寄存器)指向下一个执行的用户态指令(.text), sp(栈指针寄存器)指向当前用户态线程的栈顶,用于分割栈帧和栈帧中变量的定位. ...
tty 所有终端设备的泛称 pty 伪终端 pts 伪终端从属 terminal 终端模拟器 terminal,一个输入输出设备, 在现代os中已经抽象成了控制终端**(controlling terminal), 可以由伪终端,虚拟控制台,串口终端,usb串口担任控制终端**. 它可以 ...
系统总览 进程管理 内存管理 文件系统 trap 系统调用 驱动 用户函数
选择排序 在i~n-1范围内,找到最小值并放在i的位置上, 然后在i+1 ~ n-1范围内继续 for(int i = 0; i < n - 1; i++){ int min = i; for (int j = i + 1; j < n; j++){ if (arr[j] < arr[min]){ min = j; } } swap(arr[i], arr[j]); } 冒泡排序 在0~i范围内, 相邻位置较大的数向下滚动, 最大值最终来到i的位置,然后0 ~ i-1范围继续 ...
二分查找 在有序数组中确定num的存在 二分查找的两种写法 // 左闭右开 //更适合找边界、插入位置等复杂问题 int searchInsert(vector<int>& nums, int target) { int left = 0; int right = nums.size();// !! while (left < right) {// !! int mid = left + ((right - left) >> 1);// >>运算的优先级低于+ if (nums[mid] == target) return mid; else if (nums[mid] < target) left = mid + 1;// !! else right = mid;// !! } return left; } // 闭区间 //更适合标准查找、简单理解 int searchInsert(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1;// !! while (left <= right) {// !! int mid = left + ((right - left) >> 1); if (nums[mid] == target) return mid; else if (nums[mid] < target) left = mid + 1;// !! else right = mid - 1;// !! } return left; } 在有序数组中找到>=num的最左位置 int findLeft(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1;// !! int ans = -1; while (left <= right) {// !! int mid = left + ((right - left) >> 1); if (nums[mid] >= target) ans = mid; right = mid - 1; else left = mid + 1;// !! } return ans; } 在有序数组中找到<=num的最右位置 int findRight(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1;// !! int ans = -1; while (left <= right) {// !! int mid = left + ((right - left) >> 1); if (nums[mid] <= target) ans = mid; left = mid + 1; else right = mid - 1;// !! } return ans; }
重要的数据结构 struct sockaddr 通信用的地址表, 记录了使用什么来通信和目的地址 这是一个在套接字编程中用来表示"地址"的通用结构, 核心作用是为不同的通行提供一个统一的地址表示接口 ...