南京大学 操作系统 (JYY) 学习笔记:从 UNIX 到 Linux 与庞大的应用生态
写在前面这是本系列的第十二篇。我们已经了解了一个典型的操作系统给应用程序提供的“一切”从操作系统为应用程序提供的对象和 API到可执行文件的链接和加载。操作系统在底层实现了管理硬件资源的极致机制这是狭义“操作系统”负责的功能。本讲内容一个真实的“操作系统”究竟是如何使用这些底层的对象和 API一步步构建出今天如此丰富繁荣的应用生态的在这个过程中又有哪些不可思议的实用工具起到了决定性的作用课前反思操作系统的对象回顾操作系统的对象进程进程 状态机。进程管理 API:fork,execve,exit。连续的内存段可以被看作一个能在进程间共享、或映射到文件的对象。内存管理 API:mmap,munmap,mprotect,msync。从 UNIX 到 Linux 的历史回眸Evolution of the UNIX Time Sharing System最早的 UNIX 版本甚至没有forkShell 首先关闭所有打开的文件然后为 0, 1 fd 打开终端文件当时的系统是单进程的根本不支持多进程。从终端读取命令行。打开文件把加载器代码复制到内存并执行 (相当于后来的exec)。当时还没有fork()这个概念。exit会重新把 shell 加载回内存。Takeaway message: 不要害怕“不好”大胆去做并且持续改进先做一堆“垃圾”出来。你见过的所有伟大系统一开始都只是几个大学生、几个好朋友在车库里组队搞出来的破烂代码……但只要方向对了最后就成功了。从零开始做比什么都重要。早期版本的操作系统其实和我们的 MiniLab 极其相似。Minix年轻人的第一个操作系统Minix1 (1987):UNIX v7 兼容。它是 Linus 后来实现 Linux 的起点。同时兼容 16-bit 和 32-bit向世界真实展示了 16-bit 编程。Minix2 (1997):POSIX 兼容。作为微内核教学系统源代码很简单甚至可以直接印在书的附录里随书附赠。这时候它已经能实现现代 OS 的常用功能了。(TipsMinix 是 32 位的意味着sizeof(int) 2在某些老编译器下的历史包袱)Minix3 (2006):POSIX/NetBSD 兼容。甚至一度是世界上应用最广的操作系统因为被 Intel ME 偷偷内置在无数主板底层里。August, 1991: The Birthday of Linux“Hello, everybody out there using minix – I’m doing a (free) operating system (just a hobby, won’t be big and professional like gnu) for 386(486) AT clones. This has been brewing since April, and is starting to get ready.”—— Linus Torvalds (时年 21 岁)这封邮件类似于在说“我写了个加强版的 OSLab现在发到贴吧comp.os.minix与大家分享”。因为从零开始写全套工具是不现实的所以早期的 Linux 还依赖 Minix 的工具链跑的都是 GNU 的程序gcc,bash…天时地利人和刚好踩中了 386(486) 的时间点计算机硬件恰好在那时开始起飞。“Just for fun”“Revolutionaries aren’t born. Revolutions can’t be planned. Revolutions can’t be managed. Revolutions happen…”—— David Diamond (《Just for Fun》作者)对比当前教育部的政策加强高校有组织科研、新型举国体制、在操作系统换道超车……在学校里总是被一些莫名其妙的事情拖住……因为我们的国家要生存所以很多时候只能在夹缝中求生。但革命往往是在“Just for fun”的不经意间爆发的。“Linux is Obsolete” Debate 世纪大辩论在comp.os.minix论坛上关于 Linux 的讨论盖过了原本的 Minix。祖师爷 Andrew Tanenbaum 坐不住了做出了“官方回应”认为 Linux 采用宏内核Monolithic是“太落后”的设计。21岁的 Linus 初生牛犊不怕虎完全不服气直接发长文回怼。甚至连图灵奖得主、UNIX 之父 Ken Thompson 也参与了这场围观……后来的事 (Linux 代码的指数级暴涨)Linux 2.0 引入了多处理器但使用了 Big Kernel Lock内核本质上不能并行。Linux 2.4 真正实现了内核并行。2002 年才引入了神级机制 Read-Copy-Update (RCU) 无锁同步。2003 年 Linux 2.6 发布随着云计算时代的到来Linux 正式起飞一统天下。Linux 和应用程序的接口 ️Linux 的“两面”Kernel (内核面):负责加载第一个进程。这相当于在操作系统中“放置一个位于初始状态的状态机”。这就是大名鼎鼎的initramfs模式。维护并包含一些供进程操纵的操作系统对象。除此之外“什么也没有”。在用户态看来Kernel 其实就是一个躺在底层被动等待调用的 Trap Handler。Ecosystem (发行版和应用生态面):构建在 Linux Kernel 系统调用之上的系统工具 (coreutils,binutils,systemd…)。桌面系统 (Gnome, XFCE, Android)。应用程序 (文件管理器, VSCode…)。The last piece: “初始状态”Everything is a state machine既然是状态机那“操作系统中的对象”必然需要一个初始状态。它是什么呢当你更新 Linux 系统时经常会看到屏幕上卡在update-initramfs... (漫长的等待)。没错这就是 Linux Kernel 启动后的“初始状态”载体。Initramfs点亮 Linux 世界的第一把火我们的 initramfs 实验里面可以只有一个最小的init文件比如静态编译的极简 Linux 镜像甚至可以是任何你自己写的一个二进制a.out。系统启动后Linux 还会为你增加/dev和/dev/console因为总得给stdin/stdout/stderr找个“输出的地方”。真实的 initramfs (你可以解压它看一看):它包含基本的命令行工具、基础的设备驱动程序以便随后能从真正的磁盘或网络上挂载庞大的文件系统以及紧急文件系统修复工具万一磁盘坏了还能抢救一下。点亮世界的工具Busybox在真实的初始阶段你看不到华丽的桌面甚至没有完整的系统只有一个busybox在默默支撑起早期的生命[ [[ acpid adjtimex ar arch arp arping ash awk basename bc blkdiscard blockdev brctl bunzip2 busybox bzcat bzip2 cal cat chgrp chmod chown chpasswd chroot...并不是我们平时“看到”的“Linux”世界启动的初级阶段在 initramfs 中加载剩余必要的驱动程序磁盘/网卡。挂载真实的根文件系统。Linux 内核有启动选项类似环境变量记录在/proc/cmdline里。读取 root filesystem 的/etc/fstab。神之一手将控制权移交给另一个程序例如现代 Linux 的霸主systemd。启动的第二级阶段看一看系统里的/sbin/init到底是什么计算机系统没有魔法一切的神奇都有底层系统调用的合理解释。移花接木构建真正应用世界的系统调用switch_root命令背后的核心系统调用是pivot_root()intpivot_root(constchar*new_root,constchar*put_old);这个系统调用会改变调用进程所在 mount namespace 的根目录挂载点。它把当前的根挪到put_old目录下并把new_root提拔为新的系统根目录在此之后早期的那个用来过渡的Initramfs就会被释放功成身退。/sbin/init指向的程序比如systemd开始接管一切加载网卡、配置 IP、修改 tty 字体……真正的操作系统世界就此展开。终局操作系统 对象的集合与生态的繁荣总结什么是操作系统初始状态:initramfs中的对象 /dev/console 加载的init。状态迁移:硬件选择一个进程对象执行一条指令。系统调用支撑一切:进程管理:fork,execve,exit,waitpid…文件对象访问:open,close,read,write,pipe,mount…地址空间管理:mmap,sbrk…特权控制机制:pivot_root,chmod,chown…操作系统是幕后的 MVP仅靠“初始状态 系统调用”这些机制操作系统完全“感知不到”上层应用程序的存在。它只是无私地奉献着底层机制。(嘿也许在 AI 时代操作系统可以通过为每一个 system call 甚至 function call 提供 traceability从而真正去“感知”并理解应用的意图了)应用生态从光盘到开源包管理器前互联网时代软盘发行 (DOS) - 光盘发行 (Win95)。双击安装输入 CD-Key当时要破解简直太容易了。应用商店模式OS 提供 SDK/API开发者独立打包发行提交审核如 AppStore 或 Microsoft Store交 $19 保护费开个账号。开源模式 (Debian)开发者共同维护代码和应用仓库。“We want to create a free operating system, freely available for everyone… we are referring to software freedom.”—— Debian Project计算机科学与其他学科截然不同的一点就在于开源开放。1998 年诞生的apt-get install firefox是跨时代的“Advanced Packaging Tool”彻底重塑了软件的分发模式。Debian 的包管理与“软件供应链”一个.deb软件包本质上只是一个压缩包control.tar.xz: 包含元数据维护者、依赖 Depends、描述 Description…data.tar.xz: 包含实际要解压到绝对路径的各种二进制文件。dpkg: 安装工具其实它也只是操作系统上的一个普通应用程序利用简单的文件读写系统调用完成“安装”。为什么建设我们国家自己的操作系统生态那么艰难生态的关键是开发者。但是 qualified合格的开发者太少了大学四年都在写高血压代码不懂底层原理。错误的设计 无法维护的泥潭。这门《操作系统》课程的终极使命就是让大家“见识”各种优秀与糟糕的设计从而写出真正高质量的系统级代码。蒋门万岁AI 时代软件生态会消失吗也许未来我们只需要一个“最小”的执行环境剩下的庞大包管理和组件全部由 AI 随时随地按需生成。篇末结语 (Virtualization 虚拟化篇 完结)Take-away Messages:至此我们终于完全展示了逐层抽象的计算机系统世界最底层硬件向上提供了指令集体系结构 (ISA)。基于指令集我们实现了操作系统提供了各种对象、Syscall API以及由 initramfs 定义的初始状态。操作系统之上支撑起了基础的系统工具coreutils,shell,apt,gcc…。在系统工具之上才是各式各样繁荣的应用程序。实际上我们在计算机系统中看到的五彩斑斓的画面全都是由应用程序“完成”的操作系统只是默默退居幕后提供着极其原始的系统调用接口。正是因为这些系统调用接口异常稳定、向后兼容经过几十年的演化和积累形成了难以逾越的技术屏障。在颠覆性的技术革新到来之前任何想要“另起炉灶”做新操作系统的尝试都注定是极其困难的。

相关新闻

南京大学 操作系统 (JYY) 学习笔记:动态链接的黑魔法与内存入侵 (Dynamic Linking)

南京大学 操作系统 (JYY) 学习笔记:动态链接的黑魔法与内存入侵 (Dynamic Linking)

写在前面:这是本系列的第十一篇。 在前几讲中,我们已经知道进程从 execve 的初始状态开始,可以通过 mmap 改变地址空间,通过 fork 创建新进程。只要有 ELF 可执行文件,把它的 PT_LOAD 数据段正确映射到内存里&#xff…

2026/10/16 8:37:44 阅读更多 →
Windows RTMP直播服务器终极指南:5分钟快速搭建专业流媒体平台

Windows RTMP直播服务器终极指南:5分钟快速搭建专业流媒体平台

Windows RTMP直播服务器终极指南:5分钟快速搭建专业流媒体平台 【免费下载链接】nginx-rtmp-win32 Nginx-rtmp-module Windows builds. 项目地址: https://gitcode.com/gh_mirrors/ng/nginx-rtmp-win32 想在Windows系统上快速搭建一个专业的RTMP直播服务器吗…

2026/10/16 10:45:06 阅读更多 →
消息队列选型对比:RabbitMQ、Kafka 与 Redis Stream 的适用边界

消息队列选型对比:RabbitMQ、Kafka 与 Redis Stream 的适用边界

消息队列选型对比:RabbitMQ、Kafka 与 Redis Stream 的适用边界 一、深度引言与场景痛点:一条消息延迟了 10 秒,用户以为系统坏了 7 月在刷题系统中实现了一个"AI 题解生成"的异步功能:用户提交题目后,系统将…

2026/10/16 10:45:09 阅读更多 →

最新新闻

51单片机数码管动态显示:原理、电路、代码与调试全解析

51单片机数码管动态显示:原理、电路、代码与调试全解析

提到基于51单片机的数码管动态显示,很多朋友第一反应是学生时代实验课上的经典题目,觉得老套、简单、没技术含量。但说句实在话,我后来做过的不少实际项目里,省成本、赶工期时用的还是这一套思路:一个几毛钱的MCU、几个…

2026/10/16 12:55:49 阅读更多 →
免费Claude Code实战:从API额度到编辑器接入的完整指南

免费Claude Code实战:从API额度到编辑器接入的完整指南

先聊个很多人都在问的方向:free-claude-code。字面意思是"免费使用 Claude 写代码",但真正折腾过的人都知道,它说的不是简单找个账号去白嫖,而是一整套围绕 Claude 代码能力展开的工具链、额度和使用策略。作为一个把这…

2026/10/16 12:55:49 阅读更多 →
鸿蒙ArkUI Flex布局详解:核心参数、踩坑笔记与实战案例

鸿蒙ArkUI Flex布局详解:核心参数、踩坑笔记与实战案例

开发 ArkUI 布局踩了不少坑之后,我把和 Flex 相关的经验和踩坑记录整理成这份完整文档,希望能帮你少走弯路。这篇文章会从 Flex 的核心设计逻辑讲起,把 direction、wrap、justifyContent、alignItems、alignContent 以及子组件的 flexGrow、f…

2026/10/16 12:55:49 阅读更多 →
AirLLM实战:低显存与纯CPU环境下的分层加载大模型推理指南

AirLLM实战:低显存与纯CPU环境下的分层加载大模型推理指南

如果你手里没有一张像样的显卡,内存倒是有两三百G,却想碰一碰动不动几十B参数的大模型,AirLLM这个名字你应该留意到。我最初看到它的时候,说实话不太相信一个如此简单的方案能把显存占用压到这么低,但实测了几轮之后&a…

2026/10/16 12:55:49 阅读更多 →
Flink Checkpoint故障排查:阻塞、超时与失败的三类根因分析

Flink Checkpoint故障排查:阻塞、超时与失败的三类根因分析

1. 为什么Checkpoint失败不是“重试一下就好”的小问题 Flink Checkpoint 问题排查,这个标题里藏着一个被太多人低估的真相:它从来不是单纯的技术故障定位,而是一场对整个流式作业健康状态的系统性体检。我见过太多团队在生产环境里把Checkpo…

2026/10/16 12:55:49 阅读更多 →
关联规则挖掘实战:从Apriori到FP-Growth的推荐系统与用户行为分析

关联规则挖掘实战:从Apriori到FP-Growth的推荐系统与用户行为分析

1. 关联规则到底在解决什么问题第一次接触“关联规则”这个词,很多人会以为它跟逻辑推理、因果分析是一回事。其实不是。关联规则挖掘属于无监督学习里非常实用的一支,核心任务只有一个:从一堆事务记录里,找出“什么东西经常跟什么…

2026/10/16 12:54:48 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →