没有人解释的问题:内核的边界在哪里?

合集 · 直观理解计算机技术【CoreDumped】 (68)

  1. 11:03
    代码中指定变量类型为何如此重要?
  2. 13:46
    栈为何如此之快?
  3. 17:53
    堆为何如此之慢?
  4. 19:56
    动态数组的内部机制(ArrayList VS LinkedList)
  5. 15:37
    探索计算机并发与多任务处理的历史
  6. 12:54
    晶体管是如何运行代码的?
  7. 16:12
    晶体管是如何记忆数据的?
  8. 18:47
    制作一个CPU来运行程序
  9. 11:23
    计算机如何将字符串转换为数字
  10. 17:18
    动态随机存取存储器(DRAM)的工作原理
  11. 16:05
    计算机处理器是如何运行条件和循环的?
  12. 6:51
    一个程序不是一个进程
  13. 14:52
    深入理解进程,如何进行上下文切换?计算机科学中最深刻和最成功的想法之一。
  14. 20:20
    处理器内部的单个位如何保护操作系统的完整性?
  15. 13:14
    计算的心跳:时钟如何推动 CPU 前进?
  16. 14:22
    英语原声版-计算的心跳:时钟如何推动 CPU 前进?
  17. 14:15
    (英语原声)进程间通信:共享内存或发送消息
  18. 12:29
    (中文配音)进程间通信:共享内存或发送消息
  19. 14:59
    (中文配音)为什么单核处理器需要线程?
  20. 16:07
    (英语原声)为什么单核处理器需要线程?
  21. 9:26
    (中文配音)多核系统上的线程
  22. 11:27
    (英语原声)多核系统上的线程
  23. 11:52
    (中文配音)为什么应用程序是特定于操作系统的?
  24. 13:09
    (英语原声)为什么应用程序是特定于操作系统的?
  25. 13:15
    (英语原声)硬件如何在多任务处理中协助软件?
  26. 11:29
    (中文配音)硬件如何在多任务处理中协助软件?
  27. 20:34
    链表的一个实际应用
  28. 45:02
    让你的电脑运行更流畅的奇妙算法
  29. 43:38
    (流畅中文配音)让你的电脑运行更流畅的奇妙算法
  30. 19:41
    (原声双语字幕)当程序调用 sleep() 时会发生什么?
  31. 17:57
    (流畅中文配音)当程序调用 sleep() 时会发生什么?
  32. 20:40
    这个简单算法驱动了真正的解释器:Pratt Parsing
  33. 18:19
    (双语字幕)编程中最难以捉摸的Bug:竞态条件
  34. 19:23
    (流畅中文配音)编程中最难以捉摸的Bug:竞态条件
  35. 16:02
    (中文配音)阻止内存攻击的底层电路
  36. 14:51
    (英语原声)阻止内存攻击的底层电路
  37. 18:04
    为什么有些项目会使用多种编程语言?
  38. 19:32
    为什么有些项目会使用多种编程语言?
  39. 17:15
    别再杀进程了!让 Ctrl+C 变成“喵”……(用信号实现)
  40. 19:23
    别再杀进程了!让 Ctrl+C 变成“喵”...(用信号实现)
  41. 19:05
    80 年代避免竞态条件的算法(以及它为何失败)
  42. 19:43
    80 年代避免竞态条件的算法(以及它为何失败)
  43. 22:10
    CPU如何与众多不同设备交互?
  44. 23:52
    (中文配音)CPU如何与众多不同设备交互?
  45. 14:04
    (中文配音)你每天都在用的奇特CPU操作
  46. 13:04
    你每天都在用的奇特CPU操作
  47. 18:04
    (中文配音)历史如何塑造了我们今天仍在使用的编程术语?
  48. 17:42
    (英语原声)历史如何塑造了我们今天仍在使用的编程术语?
  49. 16:41
    为什么有些底层项目里会充满这种奇怪的代码?
  50. 16:39
    (中文配音)为什么有些底层项目里会充满这种奇怪的代码?
  51. 21:35
    编译与解释代码如何共处同一程序中?
  52. 21:30
    (英语原声)编译与解释代码如何共处同一程序中?
  53. 17:09
    【双语字幕】Core Dumped 常见问题的集中回答
  54. 13:36
    【双语字幕】90年代的设计决策阻碍了Python并行化
  55. 12:01
    【中文配音】90年代的设计决策阻碍了Python并行化
  56. 17:51
    Linux创建进程的奇怪方式
  57. 18:14
    【中文配音】Linux创建进程的奇怪方式
  58. 19:49
    CPU如何运行函数?
  59. 19:38
    【中文配音】CPU如何运行函数?
  60. 17:15
    没有人解释的问题:内核的边界在哪里?
  61. 19:36
    【英语原声】没有人解释的问题:内核的边界在哪里?
  62. 35:49
    硬件如何让线程问题不再那么棘手?
  63. 19:47
    为什么在macOS、Windows和Linux上安装应用程序如此不同?
  64. 24:00
    游戏公司真的能破坏你的电脑吗?
  65. 10:43
    一个视频说透“架构”:为什么你的程序换个CPU就可能跑不了?
  66. 14:45
    CPU如何执行有符号和无符号运算?
  67. 19:11
    简单指令, 奇妙算法
  68. 9:26
    当CPU遇到它不认识的指令,会发生什么?😱【底层原理】
Description
https://www.youtube.com/watch?v=ZmPIxfCggFw
视频总结
 本视频解释了“Linux只是内核而不是完整操作系统”这句话的真正含义。核心线索从进程创建机制出发,通过追溯Linux系统中的进程树,一直追到所有用户进程的祖先——PID为1的init进程。Linux中的用户进程并不是由内核直接创建的,而是通过“进程自我克隆再替换程序”的机制,由已有进程不断派生形成树状结构。系统启动时,内核首先被加载到内存并运行在CPU的特权模式中,负责直接与硬件交互以及提供系统调用接口。当内核完成初始化后,会在启动代码中硬编码执行一个程序,即init进程,这是系统中唯一一个不是由其他用户进程创建的用户进程。
视频进一步解释了用户空间与内核空间的区别。CPU通过受限模式和特权模式将普通程序与内核隔离,普通应用只能通过系统调用请求内核访问硬件资源。内核本身只负责底层资源管理,例如内存管理、设备驱动、中断处理等,并不知道窗口、按钮或桌面等高级概念。图形界面、桌面环境、显示服务器、网络管理器、包管理器、SSH服务等组件实际上都是运行在用户空间中的普通进程,它们共同构成了我们日常使用的操作系统体验。
由于Linux项目只提供内核,而不同发行版会在其上组合不同的用户空间服务与程序,例如不同的init实现(systemd、sysv-init、openrc等)、不同桌面环境(GNOME、KDE等),因此不存在唯一的“标准Linux系统”。发行版之间的差异主要来自这些用户空间组件的组合方式。
视频最后讨论了另一个更模糊的问题:如果操作系统的大部分组件都只是普通用户进程,那么操作系统与普通应用程序之间的边界在哪里。一个可能的定义是由init进程自动启动的核心服务,但这个定义仍然不完美,因为很多基础工具只在用户调用时运行。由此得出的结论是:内核与用户空间之间的界线非常清晰,但操作系统与普通应用之间的界线往往是模糊且带有主观性的。

Comments

0394101503 2026-03-10

Linux是宏内核,理论上只要内核团队乐意,可以像Windows一样把GUI、文件管理器、抽象层HAL都放进内核,并且把英伟达的显卡驱动踢出内核

♥ 137 ↩ 5

bili-asdf 2026-03-05

确实,Ubuntu/Fedora/Arch这些是OS的名字,Linux是kernel的名字。 类似的还有fuchsia/zircon,macOS/XNU[笑哭]

♥ 107 ↩ 10

灵的空洞 2026-03-05

简单来说,kernel就是硬件操作程序,OS就是方便你使用kernel的东西[吃瓜]

♥ 37 ↩ 10

wovekill 2026-03-09

但是,一套完整的真正的操作系统,其开发难度和工程量都要比开发一个内核要大很多很多倍[doge]

♥ 22 ↩ 6

唐3的倔强人生 2026-03-07

斯托曼早就说了,如果你想表达操作系统,一定要写全GNU/Linux,这才是完整的开源革鲁计划。

♥ 14 ↩ 1

EVERYMORENIGHT 2026-03-06

在wsl-Ubuntu里试了一下,pstree出来的父进程居然是init{Ubuntu},问了一下deepseek才知道wsl并没有使用init这个符号链接(在/sbin中确实存在,/lib/systemd/systemd也存在),而是微软自己写的一个/init。而且启动shell的父进程也不是用户,而是SessionLeader,uptime里显示的也是0 users。

♥ 12 ↩ 2

cav1ar_ 2026-03-06

linux系统中所有的用户态软件都不是必须的。举一个最简单的例子,一个由纯Go/Rust等编译型语言编译并静态链接的二进制文件,完全可以在不依赖任何文件层级或者系统库的情况下运行。 如果你要说能提供最小运行环境,可以参考下各个发行版的seed(以debian/ubuntu为例),seed中规定了系统必须包含的最少软件包。debootstrap之类的工具参考seed从archive中拉去相应软件包,并最终构建出一个可用的用户态空间。

♥ 11 ↩ 5

敏锐蕃加 2026-03-05

那我们使用的操作系统得取个名字了,就叫___系统吧[doge]

♥ 11 ↩ 9

柴可卿 2026-03-05

我们平时用的macOS的血缘关系更贴近IBM大型机上跑的系统[笑哭]而不是Linux

♥ 10 ↩ 1

南北绿豆23 2026-03-11

我感觉第二条分界线不用定义,用户空间就看作是包括init进程在内的所有进程就行,有的是方便使用的服务程序,有些则是自定义程序,区分的标准也不可能固定

♥ 9

怕上火恰阿帕茶 2026-03-06

太有意思了,平时只会用电脑,却不知道电脑是怎么运行的[打call]

♥ 8 ↩ 17

別把我bili稽了啊 2026-03-05

太棒啦 圖形示意精確 例子量大管飽 一點就通[点赞]

♥ 6

抱歉我只会举一反三 2026-03-19

操作系统,由操作系统的开发员开发,有多个组件组成,组件之间有协同,提供给用户程序运行的平台,用户程序能够有限操控这台电脑,且是系统的,整体的,且整体以某几个方向作为指导,以此开发。也给使用者一个感觉,这个系统是以某个风格的系统,以此风格用,不管这是怎么开发的,什么状态。系统组件并不会一味这样做,每个组件以内核状态,内核空间里运行。有些组件是以内核状态运行的,有些则以用户状态运行。普通开发者只能在用户空间开发,间接有限控制电脑。除非你自己很懂系统开发,自己开发了,由替换了原来的操作系统的代码,不过这又是另一个话题了。

♥ 5

花簪绛树 16d ago

我特别喜欢这种解释边界的科普视频,很多时候我们觉得知识点在脑子里很混乱就是因为没有搞清楚边界

♥ 3

泼墨而去 2026-03-20

几十年来为什么只有一个Linux内核,为什么没人重写一个内核?

♥ 3 ↩ 7

Skelon_Chan 2026-03-05

这种动画和切换是如何做的?

♥ 3 ↩ 3

刺破图 2026-03-07

Windows创建进程的方式更直观优雅,Linux的方式更反直觉。

♥ 3 ↩ 4

好好好玩这个 2026-08-01

把英伟达的显卡驱动踢出内核

♥ 2

理科生-YR 2026-07-11

有没有首个进程启动chromium的发行版

♥ 2 ↩ 3