# Scalpel **Repository Path**: marvintau/scalpel ## Basic Information - **Project Name**: Scalpel - **Description**: Scalpel, a minimum system - **Primary Language**: Unknown - **License**: WTFPL - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-11-25 - **Last Updated**: 2026-01-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 简介 0. **了解计算机如何工作的必由之路** 和所有打算自己实现一个操作系统的朋友一样,受Linux如何诞生的故事所激励,希望能全面了解计算机的硬件结构,就是被现有的操作系统所隐藏的各种细节,也希望弄明白一个操作系统到底是如何工作的。目前操作系统的架构以及设计实现也非常成熟,大部分学校的计算机系都开设操作系统课程,即使你没有自己实现操作系统,也能明白它如何实现内存和其他硬件资源的管理,进程调度,进程间通信,以及网络等等。你只要遵循所学到的知识,读源码,看教程,然后从一个汇编代码的bootloader写起,逐步加载一个用C写的内核镜像,包括虚拟内存管理,调度器,等等。目前大部分能够找到的homebrew操作系统源码,大概都遵循这个套路。 1. **一个不同的汇编语言开发方式** 汇编代码给人带来的直观感受是多达几千行形状又细又长的代码,其中大部分的指令是MOV,在内存地址之间搬运来搬运去,或者随随便便就可以跳转到某个位置。但事实上,汇编语言支持强大的宏,正确地使用宏可以极大地增强汇编代码的可读性,缩小代码量,并且实现模块化编程。只是由于高级语言和编译器技术很早就得到普及,因此在结合宏进行汇编语言开发的探索没有进行下去。 Scalpel受到[JonesForth](http://git.annexia.org/?p=jonesforth.git;a=summary)这个项目的启发。它是一个Forth语言的实现,同时也是一个由x86汇编完成的项目。这个项目包含Forth的定义,以及实现对这个语言的解释器的设计细节,同时它也成功地向我们演示了在2010年应当如何用汇编语言做些事情。Scalpel也做了同样的事,Scalpel未必是一个成功的系统,甚至很可能不是一个能使用的系统,但是Scalpel也希望能启发人重新思考汇编的开发。 这个开发方式的大体思路是,你不能直接上手去写汇编代码,而是要先围绕一系列基础的操作和数据结构构造出宏,然后使用这些宏来编程。很类似先写出一个底层的代码库,只是在这里这个代码库使用汇编语言实现的。 2. **Forth是什么以及为什么要用Forth** 从**语言设计**的层次,Forth是一个连接式语言(concatenative language),也就是说语言的语法要素通过前后连接而成,不像高级语言如C/Lisp有括号和引号等专门指示代码结构的语法要素,也就是说实际上Forth是顺序执行一系列的关键字。从**语言实现**的层次,Forth包含有一个可以不断扩充的关键字字典。关键字既可以对应到一段汇编代码,也可以对应到其它关键字的序列组合。 这样使得Forth所对应的汇编代码有些不同的特点。对于POSIX兼容的嵌套函数调用,每次调用函数之前,都先需要将所有寄存器中的内容压入栈中,调用结束后再弹出。然而在Forth所对应的系统,寄存器是全局的中转站,因此和POSIX正相反,是进入下一个子过程前时将结果保存至寄存器里,进入后再从寄存器中取回数据。 因此,Forth很类似一个可以使用汇编语言的最小运行时环境。如果说UNIX是一个庞大的C的运行时环境,它围绕着C提供了编译工具、系统不同层次访问各种资源的接口,那么Forth就是一个最小化的汇编语言的运行时环境。一个Forth提供了一个非常基础的汇编器,将汇编代码转化为机器指令序列后加载到内存中,然后通过Forth的关键字及关键字组合来调用它。 总之,这一切的目的并非是为了打造一个高效的或者易用的系统,而是为了使得计算机内的所有软硬件资源都能暴露给使用者。当然,风险自负。 3. **阅读代码** 很多描述性出现在注释中,你需要在阅读注释的同时阅读代码才能明白,可以从Main.S开始。.s后缀是*nix下汇编代码的后缀,你可能需要在编辑器中安装一个代码高亮插件。 4. **动态内存管理 / Dynamic Memory Management** Scalpel现在支持动态内存分配!遵循Unix哲学"提供机制而非策略",核心只提供原始的内存操作原语(mmap, munmap, @, !, c@, c!),而高级的内存管理策略(如malloc/free、垃圾回收器、内存池等)可以在用户空间的Scalpel代码中实现。 Scalpel now supports dynamic memory allocation! Following the Unix philosophy of "mechanism, not policy", the core provides only primitive memory operations (mmap, munmap, @, !, c@, c!), while higher-level memory management policies (like malloc/free, garbage collectors, memory pools) can be implemented in userspace Scalpel code. 详细文档请参阅 [MEMORY.md](MEMORY.md),测试示例请参阅 [memory_test.fs](memory_test.fs)。 For detailed documentation, see [MEMORY.md](MEMORY.md). For test examples, see [memory_test.fs](memory_test.fs). 5. **编译和执行** 这个项目最初是在OS X下开发的,现在同时支持Linux和macOS。在OS X下的系统调用符合BSD规则。cc是BSD下的C编译器,其中整合了汇编器,因此接受AT&T风格的汇编代码。otool是BSD下的十六进制工具,你可以看到汇编后的二进制文件的分布,其中哪些是指令,哪些是数据。 编译:`make` 运行:`./Scalpel` 加载文件:在Scalpel提示符下输入 `include memory_test.fs` This project was originally developed on macOS and now supports both Linux and macOS. To build: `make`. To run: `./Scalpel`. To load a file: type `include memory_test.fs` at the Scalpel prompt. 本项目服从WTFPL协议,意味着you just DO WHAT THE FUCK YOU WANT TO.