posts

并行, 异步和并发

  • TL;DR 这三个词经常被混着用,但它们回答的是三个不同的问题:并发问的是「同时有几个任务在飞」,并行问的是「有几个核真的在同时执行」,异步问的是「等一个慢操作的时候,要不要把线程也一起停住」。 本文先用手写一个有栈协程把「让出」这件事拆到底层(切换到 rsp 和几个 …

ELF格式解析

  • TL;DR 一个 ELF 文件同时被四个角色读写:编译器产出它、链接器改造它、内核加载器消费它、工具与攻击者审视它。这四个读者看的是同一坨字节,但需求完全不同。ELF 的解法是把文件切成两套正交的索引表: Program Header Table(段视图)——给加载器看,描述“运 …

NEMU RISC-V32 指令模式匹配与汇编级优化

  • TL;DR 本文沿着一条「先问为什么,再看怎么做」的线索,拆开 NEMU 的 RISC-V32 指令解码:从「怎么知道当前是哪条指令」这个问题出发,引出模式字符串,再手推 pattern_decode 如何把它变成 key/mask/shift,最后贴出宿主机 Intel 汇编, …

printf的实现:可变参数、ABI差异与格式化字符串漏洞

  • TL;DR 在libc中的printf的实现已经有一套完整的抽象流程。 但直接读源码容易迷失在细节里。其实整条链路是三个连环问题:参数在哪、怎么按格式串把参数取出来、取出来之后怎么变成字符串,外加一层printf/vprintf/vsnprintf的API设计。以musl …

学习汇编之前必须掌握的硬件知识

  • 摘要 English Version 离开高级编程语言的抽象世界之后,你打算从汇编开始。 在汇编里,你需要直接操作寄存器和内存。不仅如此,还要面对栈对齐、System V、调用栈等等问题。 先修知识至关重要,否则你会错过真正有价值的思想。 最不重要的东西恰恰是语言本身 如果你打算 …

如何解析编程语言表达式

  • TL;DR 这个是在做 NJU PA 时,引出的一个问题。 同时也和编译原理强相关,所以也算是编译原理的基础内容学习。 一个表达式包含什么 词法分析 表达式解析器的第一步是词法分析:将原始字符流切分成一个个有意义的 Token。 这些 Token 包含关键字、标识符、运算符、常量 …

x86架构内核引导流程

  • Bootstrap The PC hardware is designed to make sure BIOS always gets control of the machine first after the computer is powered on. The BIOS …

rCore Labs

  • TL;DR 这篇博客用于记录探索rCore kernel的设计哲学和学习遇到值得思考的内容 对这个实验感兴趣的原因也是Rust是第一个走进Linux项目的现代编程语言(虽然目前大部分仍在驱动程序环节) 对于内核本身,现代编程语言相较于C,也是有很多需要重新设计和考虑的情况 …

Rust的内存模型

  • TL;DR 最近在尝试rCore这个内核实验 这本教程旨在一步一步展示如何 从零开始 用 Rust 语言写一个基于 RISC-V 架构的 类 Unix 内核 。 所以只是理解Rust的各种语言特性就不够了,需要学习Rust的内存模型,理解它是如何在内存空间中组织各个实例 基于 …

数字电路知识点记录

  • TL;DR 最近太无聊,重新拾起cs61c课程,开始有些痛苦的数字电路学习。 我的仓库 这个博客就用来记录一下各种硬件的引脚和电路设计等知识。 Warm up Basic 在更高抽象的程序中,一般情况下都是串行的。 但是在硬件视角中,都是并行的。(电路很快,所以要有负反馈/回授等 …

动态调试xv6内核,复习OS知识

  • TL;DR 很早之前,我就做完了xv6内核的实验,也算是入门了操作系统 xv6小而精的设计思路的确适合初学者入门这样一个复杂的计算机分支 今天经过一定时间的沉淀后,重新来看看当时没有被完全理解,还有一些被一笔带过的知识 固件代码 过去,我们只关注到了内核被加载之后的内容,每次调试 …

分析musl libc 1.2.0 malloc实现

  • musl libc 最近决定着手malloc的实现,一方面是比较感兴趣,另一方面可以加强对内存管理的理解,同时也可以推进对堆安全的理解。 相对于glibc的复杂,或许应该先抛开复杂的性能优化,从最简单的开始学习 所以我选择了musl libc 1.2.0版本 musl libc的 …

Rust实现MOS 6502 CPU模拟器

  • TL;DR 从零用 Rust 实现 MOS 6502 CPU,再到完整的 NES 模拟器:两周时间,247 个 opcode,一个 8-bit 的世界。 项目地址 前言 本人对系统底层和CPU有着浓厚的兴趣,恰好看到喜欢的Youtuber Tsoding 制作了有关MOS …

有关CTF的思考

  • 前言 首先非常高兴各位可以点开这个博客,无论你是否打算走 网络安全/信息安全 这个方向,我有一些小小的感悟在这里分享。 这篇文章我决定放在这里,也是想和其他一起学习网络安全的师傅们共勉。 写下这篇博客的时候,我也只是一个马上进入大二的计算机专业学生,对这些事物有理解偏差,还望谅解 …

Hardware Knowledge You Have to Know Before Assembly

  • Summary After leaving the abstract world of high-level programming languages, you plan to start with assembly. In assembly, you need to …

CS144 Lab2

  • 具体实现细节请参考 我的实现 Lab2 Start 这个实验要求实现一个TCPReceiver类 这个类是基于前两个实验,所以要熟悉前两个实验完成的接口 越靠后的实验,越是在封装上进行编程,如果忘记了,记得回去看接口 从这个实验开始,我们就真正设计到tcp协议中的内容,包括但不限 …

CS144 骨架代码分析

  • 序列化 序列化:将结构化信息转化为大端序的二进制序列 Sponge和Minnow在这里处理有差异,Sponge是解析后直接返回string,Minnow是通过序列化一个Serializer类处理 class Serializer { …

CS144 Lab0

  • cs144是计算机网络中一个比较硬核的项目,十分利于学习现代c++和软件架构的初步理解 现在最新是Stanford Minnow版本使用了c++ 20的标准 Sponge版本 Minnow版本 我的实现 两者都可以选择去做,但更推荐Minnow版本,它更新,并且会涉及一些更高级的 …

CS144 Lab1

  • 具体实现细节请参考 我的实现 Lab1 Start 这一个实验要实现两个功能 Wrapping Integers 这里要实现32位seqno和64位abs_seqno进行相互转换 这里有一个很形象的比喻 32位seqno就像是一圈400米跑道,它只能精确到当前400米中的某个位置 …

个人博客

  • 关于 I’m TuxNode, a computer science major student. Passionate and interested in free software. fsf My Github 自由软件的拥护者 I have to admit …
recent-work

并行, 异步和并发

TL;DR 这三个词经常被混着用,但它们回答的是三个不同的问题:并发问的是「同时有几个任务在飞」,并行问的是「有几个核真的在同时执行」,异步问的是「等一个慢操作的时候,要不要把线程也一起停住」。 本文先用手写一个有栈协程把「让出」这件事拆到底层(切换到 rsp 和几个 …

Read more →

ELF格式解析

TL;DR 一个 ELF 文件同时被四个角色读写:编译器产出它、链接器改造它、内核加载器消费它、工具与攻击者审视它。这四个读者看的是同一坨字节,但需求完全不同。ELF 的解法是把文件切成两套正交的索引表: Program Header Table(段视图)——给加载器看,描述“运 …

Read more →