由于云服务器内存太小,在 Clickhouse 上遇到内存不足: Received exception from server (version 24.9.1): Code: 241. DB::Exception: Received from localhost:9000. DB::Exception: Memory limit (total) exceeded: would use 1....
【开发日志】df、du 和 lsof
最近在服务器上遇到一个诡异的事情,磁盘空间每天都达到上限,好不容易腾出一些空间,好几 G 的存储马上被占完;加上 df -ha 和其他一些工具统计的存储大小相差太大,本来我也懒得去找原因。 但我实在腾不出多余的空间了:总共 100 G 的存储,所有工具都只显示只使用了 40G+,唯独 df 显示剩余空间 4KB… 起初我以为是那些工具没有统计到隐藏或者非权限文件,但我已经是 root 用...
【开发日志】embassy 使用记录
定时打印 (std/本机系统) FYI: 这里使用 std 的原因在于更快地了解和测试 embassy。 [package] name = "embassy-local" version = "0.1.0" edition = "2021" [dependencies] # log feature 不是必要的,但它可以明确表示不使用 defmt(因为它俩互斥) # p.s. [defm...
【开发日志】rCore-N (共享调度器 fork) 搭建和踩坑
注意,这是运行 https://github.com/CtrlZ233/rCore-N (开源操作系统训练营项目 6,共享调度器 rCore-N)的教程,而不是 rv-n-ext-impl 内的 rCore-N https://github.com/duskmoon314/rCore-N 的教程。 关于这两者,共有的教程在 rv-n-ext-impl 文档:使用教程 一章。 这里...
【笔记】rCore (RISC-V):虚拟内存
Why 为什么需要虚拟内存,等价于为什么物理内存的分配策略不够好。 地址冲突问题:应用直接访问物理内存,这需要它在构建的时候就清楚所运行计算机的物理内存空间布局,还需规划自己需要被加载到哪个地址运行。 应用与应用之间如果出现物理地址冲突,解决起来麻烦。 内存和代码不安全:内核并没有对应用的访存行为进行任何保护措施,即便在 U 级别下,每个应用还可以读写其他程序的物理内存。这意味...
【笔记】rCore (RISC-V):抢占式 OS 与中断机制
协作式和抢占式 批处理系统的特性是:在内存中同一时间最多只需驻留一个应用。 只有当一个应用出错或退出之后,批处理系统才会去将另一个应用加载到相同的一块内存区域。 为了提高 CPU 的利用率,操作系统演进成加载多个应用,并发运行这些应用。有两种方式执行这些应用: 协作式:让当前执行的应用主动放弃 CPU 的控制权,其他处理器才能执行其他应用 缺点:程序无法做到在...
【笔记】rCore (RISC-V):tmux 使用记录
背景 tmux 是一个流行且相当成熟的终端复用工具。在 Ubuntu 中,你可以使用 apt install tmux 安装它。 终端复用只有一个目的:在一个终端界面运行多个终端会话,从而尽可能地减少窗口的数量,但尽可能多地控制多个终端。 作为一个每天使用终端的人,有必要梳理和介绍我在这方面的终端使用经验。 实现终端复用 (terminal multiplex) 或者类似的效果有多种...
【笔记】rCore (RISC-V):qemu 使用记录
Qemu 有两种运行模式 qemu-system-riscv64 qemu-system-riscv64 模拟系统级模拟一台 RISC-V 64 裸机,它包含处理器、内存及其他外部设备,支持运行完整的操作系统。 常用以下命令启动内核: qemu-system-riscv64 \ -machine virt \ -nographic \ -bios ../boo...
【笔记】rCore (RISC-V):特权级
src: https://rcore-os.cn/rCore-Tutorial-Book-v3/chapter2/1rv-privilege.html Why 实现特权级机制的根本原因是应用程序运行的安全性不可充分信任。 从我的理解来看,权级的出现主要是为了 处理程序的错误 和 限制程序的资源(指令、内存地址)。 对于前者,一个程序出现错误时,这导致执行环境被破坏,影...
【笔记】rCore (RISC-V):程序的内存布局
程序的内存布局 一个程序加载到内存之后,这部分内存可以划分为两大块:代码区域和数据区域。 可以用段 (section) 来描述一段连续的内存空间,用 .name 来命名一个段,在汇编中,用 .section .name 声明一个段的开始。 代码 (code memory):.text 用来存放代码(也就是指令) 数据 (data memory): ...