解决 bear 在 MacOS 中生成空 compile_commands.json
在做到 xv6 的最后一个 lab 时,我终于忍受不了满屏的爆红,着手开始配置代码高亮。参考 https://zhuanlan.zhihu.com/p/501901665 配置 Intellisense,然后我遇到了一个问题:
make clean && bear — make qemu 生成空 compile_commands.json
我 google 查了一下,目前没有中文博客提到这个问题。我在 Bear 的 issue 下发现这个问题已经老生常谈了,因为 linux 和 macos 下 bear 的工作原理不同:
For your problem, here is a little background information… Bear works differently on Linux and Mac. On Linux it intercept the process executions with a preloaded shared object. This trick does not work on Mac. Instead it use ...
virtual-memory-for-user-applications
MIT 6.s081 lecture 17 个人总结笔记
参考:
https://mit-public-courses-cn-translatio.gitbook.io/mit6-s081/lec17-virtual-memory-for-applications-frans
https://pdos.csail.mit.edu/6.828/2020/readings/appel-li.pdf
之前我们知道,virtual memory 的 page fault 已经被内核玩出了花。进程 fork 的 COW 机制,虚拟内存页表的驱除机制等等,都是利用了 page fault 这个机制实现的。page fault 很好用,那么我们能不能让用户程序也利用上 page fault 呢?
为了让用户程序有效的利用上 page fault 机制,操作系统内核需要向用户程序提供一系列原语(primitives):
Prot1 降低单个 page 的 accessibility (mprotect)
ProtN 降低 N 个 page 的 accessibility,之所以单独提 ...
xv6-fs
下文中没有具体说明的场景均描述 xv6 文件系统的实现
好吧 我们就来详细捋一捋 fs
组成// todo
事务 Transaction
事务在用数据库的时候就已经经常用到了,但是没想到文件系统也有事务。从文件系统的事务实现中我们也可以管中窥豹数据库的事务是怎么实现的,数据库的 crash recovery 是如何保证的。
xv6事务的作用是保证一组磁盘写操作的原子性 (即要么全部完成,要么全部失败),从而支持 crash recovery。事务是我们对一组整体具有原子性的磁盘写操作的抽象,而我们是如何实现事务这个特性的呢?
当然是凭借日志系统。在xv6中,我们在执行一组磁盘写操作时,会先将这组写操作发到 block cache。block cache 就是磁盘 block 在内存中的 copy。
在write系统调用的最后(也就是事务结束时),这些更新都被从 block cache 拷贝到了 log 中,之后会更新 header block 的计数来表明当前的 transaction 已经结束了。
更新 header block 的计数这个操作是一个原子操作 ...
2023七月到九月总结
2023.7~9月总结从北京回来了,实习基本算告一段落了。至少线下实习告一段落了,能不能继续线上还得等结论。借此机会把 2023.7 ~ 9 月做的事情总结一下:
7月原本计划暑假里好好的把 xv6 给刷了,但是学长突然给了我快手实习的内推,于是暂时搁置了 cs 的学习,全心全意准备面试。一面自我感觉还算可以,但快手那边似乎是因为 hc 的问题迟迟不肯安排二面,鸽了我很长一段时间。这段时间最开始我是在准备面试的,然而等了好几天还没收到二面消息就重启了 xv6 的学习,记得是一口气做到了 traps lab,然后收到了快手的拒信。
收到拒信之后本着一不做二不休的原则又在 boss 直聘上海投,然而只收到了两家公司的面试邀约:禾多科技,字节跳动(抖音开放平台)。
禾多科技一面只问了20分钟,都是非常基础非常简单的问题,二面直接不问了,直接跟我介绍公司业务(做自动驾驶),但是因为只是随便投来练手的小厂,给的实习工资也不够我在北京生活,就拒了。
抖音开放平台面试问得比较有水平,可惜我算法苦手,而面试官又比较看重算法这一块,好死不死一面二面的算法题一道都没有做出来,当然是挂了。问了他们的业务,似 ...
Handler Android 消息机制
解析handler 源码也算是老生常谈了,之前也简单研究过源码。首先列出比较重要的几个类
Handler
MessageQueue
Message
Looper
那么我们就从 Handler 最经典的用法开始分析
1234567891011121314class MainActivity : AppCompatActivity() { private val handler = object : Handler(Looper.getMainLooper()) { override fun handleMessage(msg: Message) { Toast.makeText(this@MainActivity, "处理消息", Toast.LENGTH_SHORT).show() } } override fun onCreate(savedInstanceState: Bundle?) { super.onCr ...
新的开始
看了一下周围人的博客,觉得我原来的博客实在是花里胡哨且没有营养,于是删掉以前的所有文章,顺便换了个清爽的主题:butterfly,并且给博客支持了 RSS 订阅。
泡泡曾推荐我使用他的方案 zola + no-style-please。不过我实在懒得折腾 zola,并且 no-style-please 对我来说有些过于简约了。
总之以后我会尽我所能的产出高质量博客,而不是像以前一样鸡毛蒜皮的小事也要水一篇博文 :D
简约并不是简陋,简约的目的是抽出设计中最核心的部分。这和编程一样,抽象出主要部分的程序总是很好理解且很好维护的,而不是追究任何一个细小的结构,为其套上各种设计模式,最终的结果只会是难以维护,和当初运用各种设计模式的初衷背离了。