Amiriox's Storage

Declaration does not declare anything.

amiriox@terminal: ~/journey
$ whoami > /dev/null # RSS: /atom.xml ## Tutorial TLDR 下划以查看博客文章 $ tldr amiriox 折鸦/折鸦夜明け前/無暝; Amiriox Makinohara > 极端社恐, 线上线下基本上是两个人, 但欢迎聊天/交换友链 > 计算机科学狂热爱好者, OS/C++/Rust, Vim 党 $ vim ~/anime.rs const anime_arr: [anime; 10] = [末日三问, 虚构推理, 魔女之旅, 四叠半, 浪客剑心, 葬送的芙莉莲, 我心危, 比翼之吻, 孤独摇滚, GBC]; -- INSERT -- 1, 1 All # cat ~/hobbies.md * 游戏: 空洞骑士/只狼:影逝二度/怪物猎人/赛博朋克2077/明日方舟/丝之歌.unwrap() * 听音乐: * J-POP: 可惜夜/夜鹿/majiko/Reol/Aimer/花谱/结束乐队( * Vocaloid: 洛天依/诗岸/星尘Infinity * R&B: 陶喆/王力宏 * 正在培养的爱好: 板绘/像素画/摄影/文学 ## 不断 refactor 的灵魂 $ objdump -s -j .rodata /usr/bin/amiriox_soul | grep -oP '\s\K[^\0]*' 0x00401000 保持必要的力量与清醒, 去努力维持您自己的宁静与尊严 0x0040104C 水利万物而不争,故万物莫能与之争 0x0040107B He who has a why to live can bear almost any how.

数据的可持久化需求的抽象层次矛盾

为什么需要数据库?

绝大多数学校的程序设计课节课时或开课期间的实验课都会有一个工程实践, 一般是 XX 管理系统, 向刚刚学习程序设计的学生浅显地介绍实际工程中的一些应用(输入输出交互/控制流/数据处理/可持久化), b 格高一点的如 gitlet 针对可持久化还会有对象的序列化/反序列化等介绍, 建立起对于可持久化数据的基本认知.

一个运行中的程序的实例(进程以及其中可能存在的多个线程) 实质上是一段内存中的数据(代码区/数据区, 堆/栈, 环境和参数), 例如局部变量或者动态分配的内存, 而这些都是不可持久化的数据, 在程序关闭后大部分数据会被操作系统清理. 此时如果想可持久化某些数据使得下次程序启动仍然可以打开, 就需要将数据可持久化到磁盘上(更现代来说是闪存). 例如, 在 XX 管理系统中会通过语言标准库提供的文件输出接口把用户数据或日志逐行存在文件中, 在 gitlet 项目中会把 Commit 的对象等序列化后写入文件.

当然, 这些看似朴素的做法也并不是错误的, 事实上早期的数据库就是这种数据的结构和存储方式耦合度较高的做法(直到关系型数据库的提出), 而直到现在许多数据库(某些 NoSQL)也使用 JSON 等文件格式来表达一个对象的方式来存储数据. 然而, 这样的方式存在许多问题. 其中的主要矛盾是, 现实工程中的数据和数据间关系是复杂的, 而计算机科学中处理复杂问题的最主要手段(可能是唯一的手段)就是抽象. 序列化与反序列化一个对象的方式尚且较为灵活, 此处以纯文件输入输出举例: 我们可以明显看出从”纯粹文本文件”到”有语义的数据”之间有一个较大的跨度, 如果用户数据新增了某个属性(酒店管理系统新增了检验年龄的功能), 则需要重新构建整个数据文件; 除此之外, CRUD 等基本操作也过于朴素不利于优化. 这种抽象层次的缺失造成了一种耦合: 如果数据间的关系发生变化, 就会对较底层的文本文件有较大的影响, 引入无关复杂性而不利于维护(白话说就是麻烦).

阅读全文 »

现代计算机通过每一层都是下一层的缓存的抽象构建出存储器的层次结构, 依据程序的局部性原理巧妙解决了存取信息的速度远小于 CPU 处理速度的问题.

前置知识可看: CSAPP3e第六章(存储器层次结构) | Amiriox’s Storage

Cache lab 分为两个部分:

  1. 第一部分写一个模拟程序, 模拟缓存的行为; 如果对缓存的原理和行为理解透了难度不高, 主要难点是必须用 C 写
  2. 第二部分是优化一个矩阵转置的函数, 转置有着鲜明的”两个数组访问模式相反”的特点, 导致必然有一个数组的访问模式缓存不友好. 要理解分块技术和缓存冲突不命中的常见情况及调整措施. 这个 lab 要求比较极端, 给定的缓存组关联度是 \(1\), 也就是说只要是同一组的就会冲突不命中抢夺缓存行.

这是我做起来体感最痛苦的一个, 很多人也有相同的感受. 不过 lab 本身是没什么问题的, CMU 是一款我的问题

阅读全文 »

禁用大量常见运算符, 强制规定特定位运算运算符和运算符数量限制实现特定运算

所谓 Hacker’s Delight

在写 CSAPP Lab 之前一定要仔细阅读文档, 一行要求都不能落下, 比如这个 lab 就有一些无聊的要求:

  1. 要求变量声明必须在开头(这 C89 古董规则太搞了)
  2. 不允许使用大字面量(超过 0xFF 的)

为了您的阅读方便, 本文对于特定位/位模式采用行内引用 (01, 1000, 1101), 对于数字的十进制值, 位的编号等采用 \(\LaTeX\) 的数字字体 (\(3, 4, 5, 6\))

阅读全文 »

本文是 OSTEP (Operating System: Three Easy Pieces) 的简单笔记, 由于 OSTEP 和我写博客的叙述思路很像(日常往自己脸上贴金hhh), 所以这里就只列一个大纲供自己复习.

并且本文建立在 一条操作系统的使命 | Amiriox’s StorageCSAPP3e第六章(存储器层次结构) | Amiriox’s Storage 两篇文章的叙述之上, 仅仅增量补充了必要的内容

一些重要的主题 (如调度和并发) 可能 (几乎是一定) 会单独开一篇文章, 在基于这本书介绍的内容下再补充一些我其他地方学到的相关知识和经验.

OSTEP 是一本无论从知识本身还是讲解技巧上都比较不错的书, 推荐读原书而非总结博客.

阅读全文 »

组件介绍

  • cpu 内存, 系统总线, pci总线
  • 早期简单设备GPIO直接控制
  • PCI/USB总线

I/O 相关概念

I/O传输方式:

  • PIO(PMIO/MMIO轮询), Interrupt, DMA (中断不一定一定比PIO好)

I/O传输内容:

  • 操作系统组件与驱动交互, 驱动与设备交互
  • 驱动传递给设备命令和数据
  • 文件/流/virtio-mmio的共享内存(1, 2略)
阅读全文 »

(六) 7.13:

回顾会议内容, 总结任务目标:

  • arceos/tour/* 添加对其他架构 (aarch64/x86_64/loongarch) 的支持
  • arceos/tour 下新增一些例子, 体现 ArceOS 特定功能, 如图形显示功能/文件系统功能/新调度算法功能

把工具链换到最新的:

  • #[naked] 更改为 #[unsafe(naked)]. 裸函数使得编译器不会为函数生成序言和尾声代码(比如保存/恢复寄存器, 设置栈帧等), 操作系统开发的部分场景要求完全控制寄存器细节

  • 同时将 asm! 改为 naked_asm!. 裸函数内一般没有 Rust 代码, 因为会隐含地依赖序言和尾声, 所以几乎都是内联汇编代码

  • naked_asm! 不支持伪指令和宏(虽然我不知道为什么原来这里要写伪指令, 可能是和 arm 统一?), 所以要把那一段全部改写成 RISC-V 汇编, 好在代码量比较少, 如果多了我还真想不出什么方便的方法

阅读全文 »
0%