1990:种下那棵不落叶的树-第4集 破墙者
笔言: 推荐两本我正在写一本关于算法,另外关于数学模型;
思想编码者:一九八四
重生1995:我的数学模型能暴击
我新写故事:代码破晓:2014 [大语言的根基:Transformer]
故事大纲(45集微故事版)
核心设定
- 作品信息:书名《1990:种下那棵不落叶的树》,文艺副标题《代码山河》;
- 核心意象:以“树”【Linux】为核心,根系对应内核、枝干对应子系统、叶对应应用,“不落叶”寓意开源精神的永续;
- 主角设定:叶知秋,32岁,名字取“一叶知秋”之意,暗含“从微小预知变革”的内涵;
- 关键节点:穿越至1990年春天玉兰花刚开的北京;
- 个人特质:随身携带《庄子》,以“庖丁解牛”喻内核优化;调试代码间隙爱吹口琴,最爱《莫斯科郊外的晚上》;厨艺精湛,常以“算法如做菜,火候即时机”教导学生;口头禅为“代码要写得像散文,机器能懂,人也能读”。
第4集 破墙者
实现扩展内存访问。两人首次共餐——食堂的馒头配咸菜。
本集专属旁白:播放地址
本集播客: 播客地址
下面是我个定制:
《1990:种下那棵不落叶的树》两个版本的主题曲(大家评选一下):

她是一棵树A版: 歌曲地址
她是一棵树B版: 歌曲地址

第4集:破墙者
一、开篇:手术室外的字节
场景:1990年3月29日,清晨六点。医院走廊。
手术室的红灯已经亮了九个小时。
沈书影坐在塑料椅上,手里捏着一张纸——是叶知秋昨晚托陈建国送来的。纸上画着潦草的示意图:
保护模式内存布局草图:
0x00000000 ┌─────────┐
│ 内核代码 │ ← 我们的“司令部”
│ (1MB内) │
0x00100000 ├─────────┤
│ 扩展内存 │ ← 新大陆!
│ 可用区 │
0x00400000 ├─────────┤
│ 用户程序 │ ← 未来的应用
└─────────┘
纸的背面写着一行小字:“等伯父醒来,给他看这个。告诉他——墙已经开了缝,光正在进来。”
沈书影把纸折好,放进衣兜。她的手在抖。
走廊尽头传来脚步声。叶知秋提着两个铝饭盒走来,眼睛布满血丝。
“写完了。”他把饭盒递给沈书影,“第二阶段加载器的完整版。能进保护模式,能建GDT(全局描述符表),能……如果伯父醒了,还能演示给他看。”
沈书影没接饭盒:“我爸常说,铅字排版最难的,不是把字排整齐。是在版心固定的情况下,让字既整齐又有弹性。”
“什么意思?”
“意思是你得留出血位。”沈书影轻声说,“就是版面边缘的空白。看起来浪费空间,但没了它,印出来的字会挤到纸边,不成样子。”
她看向手术室的门:“你现在做的内存布局,留‘血位’了吗?”
叶知秋愣住了。
在2024年,他习惯了虚拟内存、内存保护、地址空间随机化……那些复杂的“血位”。但在1990年,在只想突破640KB限制的当下,他确实没考虑——如何防止程序越界、如何隔离内核与用户空间、如何留出“安全的空白”。
“还没……”他承认。
“那就现在想。”沈书影说,“我爸的手术,医生也留了‘血位’——切除范围比肿瘤大一圈,为了安全。技术也一样。”
手术室的门就在这时开了。
二、第一个知识点:从实模式到保护模式
医生摘下口罩:“手术……成功了。但还要观察48小时。”
沈书影整个人软下去,叶知秋扶住她。
“可以进去看一眼,但不能说话。”
重症监护室里,沈国栋身上插满管子,但眼睛是睁着的。他看到女儿,微微动了动手指。
沈书影掏出那张纸,展开给他看。
沈国栋的目光在图纸上停留了很久,然后——他努力抬起右手,用食指在空中虚画了一个方框,又在方框里点了几个点。
护士不解,但沈书影懂了。
“他在说‘字架’。”她低声对叶知秋说,“字架的格子是方的,但字模是活的,可以调位置。你的内存格子……能不能也这样?”
回机房的路上,叶知秋一直在想这句话。
知识点一:保护模式的本质
他回到屏幕前,开始给沈书影——也是给自己——梳理思路:
“我们现在用的叫‘实模式’。”叶知秋在纸上画图,“CPU像个单纯的邮差,你说‘把信送到0xB8000’,它就送去。不问这地址是不是别人的家,不问你是不是有权送。”
“所以程序可能踩到别人的内存?”
“对。而且所有程序都运行在同一个‘特权级’——相当于大家都有万能钥匙。”叶知秋画出新图,“保护模式不同。它引入了‘描述符表’,像给整个城市建立户籍系统。”
他画出三个核心概念:
- 全局描述符表(GDT):城市的户口簿,记录每块内存区域的信息:起始地址、长度、权限(可读?可写?可执行?)
- 段选择子:每个程序拿到的‘通行证’,上面写着‘你可以访问GDT里的第几号区域’
- 特权级:分0~3级,0级最高(内核),3级最低(用户程序)
“比如,”叶知秋举例,“我把内核代码放在GDT的第1项,设置特权级0。把用户内存区放在第3项,设置特权级3。这样用户程序想访问内核区域?不行,通行证级别不够。”
沈书影理解了:“就像印刷厂——排版车间谁都能进,但铅字库只有老师傅有钥匙。”
“对。而且更妙的是——”叶知秋眼睛发亮,“在保护模式下,程序使用的不是真实物理地址,而是‘逻辑地址’。CPU通过GDT自动转换成物理地址。”
“这有什么好处?”
“两个好处。”叶知秋竖起手指,“第一,程序以为自己在‘0地址’开始运行,实际可能被放在物理内存的任意位置——方便安排。第二,如果程序越界访问,CPU会直接报错,不会让它破坏其他程序。”
“这就是‘血位’。”沈书影说。
“对。”叶知秋深吸一口气,“现在,我要实现它。”
三、第二道难关:GDT的陷阱
但实现起来远比理论复杂。
叶知秋开始写GDT的初始化代码。一个GDT描述符占8字节,结构如下:
struct gdt_entry {
uint16_t limit_low; // 段限长低16位
uint16_t base_low; // 段基址低16位
uint8_t base_mid; // 段基址中8位
uint8_t access; // 访问权限字节
uint8_t limit_high:4; // 段限长高4位
uint8_t flags:4; // 标志位
uint8_t base_high; // 段基址高8位
};
“这8个字节的每个位都有特定含义。”叶知秋指着屏幕,“比如这个‘access’字节——”
他在黑板上分解:
bit7: Present (段是否存在)
bit6-5: DPL (描述符特权级, 00=最高)
bit4: Descriptor type (1=代码/数据段, 0=系统段)
bit3: Executable (1=代码段, 0=数据段)
bit2: Direction/Conforming (方向/依从)
bit1: Readable/Writable (可读/可写)
bit0: Accessed (是否被访问过)
沈书影看得头晕:“必须记这些吗?”
“必须。因为CPU只看这些位。填错一个,切换保护模式时就会死机。”叶知秋苦笑,“而且更麻烦的是,我们需要至少三个描述符:一个空描述符(GDT第0项必须是空的),一个代码段,一个数据段。”
他写了第一版代码。切换到保护模式的步骤是:
- 禁用中断(cli)
- 加载GDT到专用寄存器(lgdt)
- 设置CR0寄存器的保护模式位
- 远跳转到保护模式代码段
代码写完了,测试。
重启,运行——屏幕突然花屏,然后死机。
“哪里错了?”沈书影问。
叶知秋盯着代码看了半小时,突然拍桌子:“偏移量!保护模式下,段选择子不是直接对应物理地址,而是GDT的索引。索引要乘以8!”
他修改代码,将段选择子的值左移3位(相当于乘以8)。
再测试——还是死机。
四、生活的启示:字模与对齐
连续失败两天后,陈建国带着新消息来了。
“清华那边有个教授,”他说,“也在研究保护模式。他说了一个关键点——GDT必须在内存中按8字节对齐。”
“对齐?”叶知秋没理解。
“就像字模。”沈书影忽然说,“印刷厂的铅字,每个字模大小必须一样。排版时,字模盒的格子尺寸是固定的。如果你刻的字模比格子大一点,就塞不进去;小一点,就会晃动。”
陈建国点头:“CPU从内存读GDT时,是一次读8字节。如果你给的地址不是8的倍数,它可能读错位。”
这是叶知秋在2024年从未考虑过的问题——现代编译器自动处理对齐。但在1990年,在汇编级,一切都得手动。
知识点二:内存对齐的重要性
叶知秋修改代码,确保GDT的起始地址是8的倍数。他用了最简单的方法:在数据区前填充空字节。
但还有问题:段限长(limit)字段的设计很反直觉。
“limit表示段的‘大小-1’。”叶知秋解释,“如果你想要64KB的段,limit应该填0xFFFF(65535)。而且limit字段被拆成三部分:limit_low(16位)+limit_high(4位)。”
更复杂的是,flags字段的Granularity位(粒度位):
- 如果G=0,limit以字节为单位(最大段大小1MB)
- 如果G=1,limit以4KB页为单位(最大段大小4GB)
“我需要计算。”叶知秋在纸上列公式,“内核代码段从0x0000开始,长度设1MB。那么limit = 1MB - 1 = 0xFFFFF。因为G=1(按页算),实际填写的limit值 = 0xFFFFF / 4KB = 0xFF。”
他写下具体数值:
limit_low = 0xFFFF // 低16位
limit_high = 0xF // 高4位(0xF = 1111)
G位 = 1
沈书影看着这些十六进制数字,忽然说:“像不像电报码?”
“什么?”
“我父亲年轻时在邮局干过。”她说,“电报用四个数字代表一个汉字。发报员要背编码本。你这套GDT编码,就是给CPU的‘电报码’。”
这个比喻让叶知秋豁然开朗。
是啊,GDT不就是给CPU的“内存地图编码本”吗?每个描述符是一个“地址+权限”的密码,CPU凭此翻译逻辑地址。
“问题可能出在权限字节。”叶知秋重新检查access字段。
他原先把代码段的access设为0x9A(二进制10011010),意思是:存在、特权级0、代码段、可执行、可读。
但有一个细节——对于代码段,可读位(Readable)实际上控制的是“是否允许从该段读取数据”。而在保护模式早期,有些CPU对此很敏感。
他试着改为0x98(不可读)。再测试——
屏幕还是黑了,但这次,黑屏前闪过一行极小的小字:“Segment Not Present”(段不存在)。
“进步了!”叶知秋兴奋,“至少CPU进入了保护模式,并且开始检查段权限了!”
五、第三个知识点:调试的黑暗时代
但接下来的调试,像在黑暗中摸象。
1990年没有源码级调试器,没有保护模式下的调试工具,甚至连打印日志都困难——因为一旦进入保护模式,原有的DOS中断(包括打印字符的int 0x10)可能失效。
叶知秋想了个笨办法:在切换保护模式前,在显存特定位置“埋”几个字符作为标记。如果切换成功,保护模式下的代码会修改这些字符。
他设计了四个标记:
- 地址0xB8000: 写‘A’(表示开始切换)
- 地址0xB8002: 写‘B’(表示GDT加载成功)
- 地址0xB8004: 写‘C’(表示CR0设置成功)
- 地址0xB8006: 写‘D’(表示远跳转成功)
然后他在切换代码的每个关键点后,插入修改标记的指令。
第一次运行:标记停在‘B’。说明GDT加载就出问题了。
他检查lgdt指令——发现写错了操作数顺序。修正。
第二次运行:标记停在‘C’。CR0设置有问题。
他发现CR0的保护模式位是第0位(PE位),但自己设成了第1位。修正。
第三次运行:标记到了‘D’,但屏幕依然黑屏——远跳转成功了,但保护模式下的代码没执行。
“可能段选择子还是不对。”叶知秋几乎绝望。
就在这时,沈书影从医院回来了。父亲已经脱离危险,转到了普通病房。
“我爸让我带话给你。”她说,“他说:铅字排版时,如果一排字怎么也排不齐,就把字模全倒出来,从第一个字重新排。有时候,不是某个字错了,是整排的基准线歪了。”
叶知秋怔住。
基准线。
他忽然想到:进入保护模式后,所有段寄存器(CS、DS、SS等)都需要重新加载正确的段选择子。但他只重载了CS(通过远跳转),忘了重载DS和SS。
“我犯了低级错误。”他苦笑,“就像盖房子,只打了主梁,忘了打承重墙。”
六、突破:第一束来自墙外的光
3月31日,凌晨三点。
叶知秋写出了完整的切换代码:
switch_to_protected_mode:
cli ; 关中断
lgdt [gdt_descriptor] ; 加载GDT
; 设置CR0的PE位
mov eax, cr0
or eax, 0x00000001 ; PE位=1
mov cr0, eax
; 远跳转刷新CS
jmp CODE_SEG:init_pm
[bits 32]
init_pm:
; 重载所有段寄存器
mov ax, DATA_SEG
mov ds, ax
mov ss, ax
mov es, ax
mov fs, ax
mov gs, ax
; 设置栈指针
mov ebp, 0x90000
mov esp, ebp
; 调用保护模式下的主函数
call protected_main
其中CODE_SEG和DATA_SEG是计算好的段选择子:
- CODE_SEG = 0x08(GDT第1项,索引1×8=8)
- DATA_SEG = 0x10(GDT第2项,索引2×8=16)
而protected_main函数,要做第一件有象征意义的事:在扩展内存区域分配第一块内存,并写入一个中文“活”字。
这是给沈国栋的礼物。
保护模式下的显示需要重新实现(不能用BIOS中断了)。叶知秋直接写显存,但这次用32位寻址:显存物理地址0xB8000对应线性地址也是0xB8000(他设置了平坦内存模型)。
他在扩展内存区域(物理地址0x100000,即1MB处)分配了4KB空间,然后将“活”字的点阵数据复制过去。
最后,在屏幕中央显示一行字:
保护模式已进入
扩展内存首地址:0x00100000
已写入汉字点阵:活
测试。
按下回车。屏幕闪烁一下。
然后——绿色的字出现了!完整的三行!
更关键的是,叶知秋写了个测试函数:尝试读取1MB处的数据,再写回屏幕。如果成功,证明扩展内存可访问。
屏幕上缓缓出现第四行:
扩展内存测试:读取0x00100000处数据成功
字符‘活’验证通过
叶知秋猛地站起来,椅子翻倒在地。
他成功了。真正地、完整地进入了保护模式,并且访问了扩展内存!
墙,破了。
七、医院的演示
第二天上午,叶知秋和沈书影抬着那台IBM PC主机和显示器,来到医院。
医生坚决反对:“这是重症设备区!”
“就十分钟。”沈书影恳求,“让我父亲看看……他等了一辈子的东西。”
最终妥协:只能接蓄电池,不能用医院电源;必须快。
在沈国栋的病床前,14英寸显示器亮起。
叶知秋启动程序。屏幕显示引导过程:
引导扇区加载...
第二阶段加载器启动...
打开A20...
加载GDT...
切换到保护模式...
每一行出现时,沈国栋的眼睛就亮一分。
最后,屏幕上显示:
[系统状态]
模式:32位保护模式
基本内存:640KB
扩展内存:3072KB (可用)
GDT项数:3
当前特权级:0
已初始化扩展内存区域
首字:‘活’
沈国栋的手颤抖着抬起。沈书影把父亲的手放在键盘上。
老人用食指,轻轻按下一个键——叶知秋预设的演示键。
屏幕上,“活”字开始变化:从宋体点阵,慢慢“溶解”,重组,变成了印刷厂常用的楷体,然后又变成父亲最熟悉的仿宋体。
虽然只是简单的三帧变换,虽然只有16×16的粗糙点阵。
但沈国栋的眼泪流了下来。
“好……”他嘶哑地说,“这个‘活’……活得好……”
沈书影抱住父亲,也哭了。
叶知秋站在一旁,忽然明白:他破的不仅是640KB的物理墙,还有更深的墙——汉字在数字世界里的次等公民墙、中国技术只能追随的墙、一个老印刷工人对时代更迭的恐惧之墙。
八、墙外还有墙:虚拟内存的雏形
当天下午,陈建国带来一台新机器。
“这是实验室刚到的‘样机’。”他说,“CPU是Intel 80386,真正的32位芯片。最重要的是——它支持分页机制。”
知识点三:从分段到分页
叶知秋接过手册,快速翻阅。
保护模式的分段机制,是把内存分成大小可变的“段”。而分页机制,是把内存分成固定大小的“页”(通常4KB)。
“分页的好处是什么?”沈书影问。
“三个革命性好处。”叶知秋兴奋地说,“第一,虚拟内存——程序可以使用比物理内存更大的地址空间,不需要的部分暂存磁盘。第二,内存隔离——每个程序有自己的页表,互不可见。第三,共享内存——不同程序可以映射到同一物理页,共享代码和数据。”
他画示意图:
程序视角:
0x00000000 ┌─────────┐
│ 代码区 │
0x00400000 ├─────────┤
│ 数据区 │
└─────────┘
实际物理内存:
页框0 ┌───┐ 程序A代码
页框1 ├───┤ 程序A数据
页框2 ├───┤ 程序B代码
页框3 └───┘ 空闲
通过页表建立映射:
程序A的0x00000000 → 页框0
程序A的0x00400000 → 页框1
程序B的0x00000000 → 页框2
“这就像……”沈书影思考,“印刷厂的‘版样库’。实际铅字只有一套,但可以排出无数种版面。编辑想要哪个版面,就从库房调取对应的版样。”
“对!”叶知秋激动,“而且更重要的是,有了分页,我们甚至可以在程序不感知的情况下,把它的内存页面换到磁盘,需要时再换回来。这样就能运行比物理内存大得多的程序。”
陈建国点头:“这就是你们下一堵要破的墙——物理内存限制的墙。不过……”
他表情严肃起来:“我听到消息,学校要清查‘未经批准的重大科研项目’。你们这个……可能得暂时转入地下。”
“为什么?”沈书影问。
“因为有人打了小报告,说叶知秋‘利用学校设备进行私人项目,可能涉及技术泄密’。”
窗外,春天的阳光突然被乌云遮住。
九、深夜的选择
当夜,叶知秋面临选择。
陈建国建议:“把代码备份,项目暂停。等风头过去。”
沈书影说:“我爸让我告诉你——当年印刷厂引进德国机器时,也有人举报‘崇洋媚外’。父亲说,只要东西是真的,对人民有用,就不怕。”
叶知秋坐在机房,看着屏幕上那句“扩展内存:3072KB (可用)”。
他想起了2024年的开源世界:代码自由流动,知识没有国界。一个中国开发者写的代码,可能运行在非洲的服务器上;一个芬兰大学生创造的系统,改变了整个世界。
“我不想停。”他最终说,“但我们可以换种方式。”
“什么方式?”
“开源。”叶知秋说,“把代码公开。谁都可以看,谁都可以用,谁都可以改。这样,就没有‘泄密’的问题了——因为根本没有‘密’。”
沈书影眼睛亮了:“就像……公开的铅字字模?谁需要都可以来印?”
“对。而且,”叶知秋想起Linux的历史,“如果有人想使坏,反而会有更多人站出来保护它。因为代码不属于我个人,属于所有需要它的人。”
这是1990年,中国大陆还没有“开源”这个概念。但叶知秋要引入的,不仅是技术,还有技术哲学。
十、破墙者的宣言
4月2日,叶知秋在北大BBS(电子公告板系统,当时还是电话拨号连接)上发布了第一个帖子:
标题:关于“华夏内核”项目的情况说明与代码发布
发信人:ye_zhiqiu
本人叶知秋,在北大计算中心实习期间,开发了一个实验性操作系统内核。
目前已实现功能:
1. 引导扇区(512字节,支持中文显示)
2. 第二阶段加载器(打开A20,进入保护模式)
3. 基础内存管理(分段机制,支持扩展内存)
4. 简单文件系统框架
现决定将全部代码公开。
任何人都可以:
- 查看、使用、修改代码
- 提出改进建议
- 基于此代码开发自己的系统
- 唯一要求:如果你改进了代码,请也公开你的改进
代码包已上传至校内FTP服务器(地址见下)。
压缩包内含:
1. 完整源码(汇编/C)
2. 技术文档(中文版,沈书影整理)
3. 使用说明
这个项目不会停止。
墙在那里,我们就破墙。
没有路,我们就铺路。
——叶知秋 1990.4.2
帖子发出后,最初几小时只有零星查看。
但到傍晚,回帖开始涌现:
“清华计算机系学生:看了代码,GDT实现很干净。我们实验室有兴趣参与。”
“中科院计算所研究员:保护模式切换部分有创新,想和作者交流。”
“南京大学青年教师:能否移植到国产‘紫金’机器上?”
“一个印刷厂工人的女儿:谢谢。我父亲看到了汉字在计算机里的新生。”
还有一封站内信,来自“zhang_professor”(张教授):
“年轻人,勇气可嘉。但你要知道,破墙者往往最先被落石所伤。来我办公室谈谈,周三下午三点。”
叶知秋关掉电脑,走到窗前。
玉兰花已经落尽,但新叶郁郁葱葱。更远处,工人们正在拆除一堵旧围墙,砖块落地发出沉闷声响。
沈书影走到他身边:“我爸今天能喝粥了。他说,等出院了,想来机房学打字。用你们系统里的中文输入法——如果将来有的话。”
“会有的。”叶知秋说,“不止输入法,还会有编辑器、编译器、网络协议……所有让汉字在数字世界活下去的东西。”
他回头看着屏幕,那里还停留在BBS的界面。
“你知道吗,”他轻声说,“在保护模式下,地址0x00000000到0xFFFFFFFF,是整整4GB的地址空间。虽然我们只有几MB物理内存,但CPU已经给了我们整个世界的图纸。”
“就像父亲的字架,”沈书影说,“虽然只有三万铅字,但能排出无限种文章。”
窗外,拆墙的工人开始清理砖块。有的砖会被扔掉,有的会被运去新的工地,砌成新的墙——或者,桥。
本集核心技术点总结
- 保护模式核心机制:全局描述符表(GDT)、段选择子、特权级(0-3级)
- GDT描述符结构:8字节的精确布局,每个位的含义(基址、限长、权限、标志)
- 实模式到保护模式切换步骤:关中断→加载GDT→设置CR0.PE→远跳转→重载段寄存器
- 内存对齐要求:GDT必须8字节对齐,否则CPU读取错误
- 保护模式下的内存访问:通过段选择子+偏移地址,由CPU自动转换为物理地址
- 分页机制简介:固定大小分页 vs 可变大小分段,虚拟内存的基础
- 1990年的调试技术:在缺乏工具时如何用“内存标记法”调试底层代码
- 开源理念的早期实践:在无明确法律框架下,如何通过公开代码实现技术共享与自我保护
片尾镜头:
- 医院里,沈国栋用颤抖的手在纸上写下“活”字
- 机房,屏幕上显示着“扩展内存测试通过”
- BBS界面,回帖不断刷新,形成滚动的代码瀑布
- 拆墙工地,一块旧砖被放在手推车里,推向朝阳的方向
- 字幕:“墙破了。光进来了。但拿砖的手,才刚刚握紧。”
【下集预告】
张教授的神秘邀约背后,是国家“863计划”的真正意图?而香港老周带来新消息:台湾某公司正在研发“中文操作系统”,已经注意到叶知秋的开源项目……
下一集:《GDT与选择》——当技术道路面临岔口,当国家需求与个人理想碰撞,破墙者该如何选择下一个方向?

本集片尾曲:
墙外有光: 音乐地址
歌词:
病历上写着百分之三十的春天
键盘上困着九十二字节的诺言
你说要让两个字学会绽放
像玉兰在雨夜里撑开花瓣
父亲的手指抚摸过铅字的山脉
现在停在CRT玻璃的河岸
他问墙外还有多少亩土壤
能种下来不及长大的愿望
我们在0xA0000的边界线徘徊
寻找一扇没有锁孔的门
直到你画出内存的地图
说墙的那边——有另一片清晨
墙外有光 墙外有三千个K的荒原
墙外有我们从未见过的字节在蔓延
打开A20那扇窗 让地址线延长
让每个字都有地方存放它的童年
墙外有光 墙外有父亲等待的眺望
墙外有女儿握紧的百分之三十的希望
如果墙必须存在 就让它成为桥墩
让我们踩着它 走向更远的土壤
五台国产机器排列成考场
你测试三条通往墙外的秘径
键盘控制器 BIOS中断 快速端口
每把钥匙都对应一种明天的可能
印刷厂的字架教会我们分配
常用字在近处 生僻字在高处
你设计最简单的内存约定
谁需要谁取走 用完就放回原处
深夜的机房只有屏幕在呼吸
你写下struct mem_block的定义
说系统不需要完美的算法
只需要记得——借了要还回去
墙外有光 墙外有十万汉字的故乡
墙外有铅字工人梦里的永生长廊
打开A20那扇窗 让记忆体延长
让每个漂泊的指令都找到回家的床
墙外有光 墙外有手术室外的守望
墙外有女儿不敢流出的泪光
如果墙必须存在 就把它拆成砖块
一块砌成病床 一块砌成未来
父亲说:这机器该叫“活字”
单个字是死的 拼在一起就活了
就像这堵墙 单个字节是沉默的
连成一片 就能听见光在唱歌
墙外有光 墙外有我们种下的森林
墙外有后来者将建造的整个文明
打开所有锁着的窗 让可能性延长
让每颗种子都知道——墙不是终点 是路标
墙外有光 墙外有比光更亮的坚定
墙外有比数字更温暖的约定
如果墙必须存在 我们就成为凿子
在石头上刻下:此处通往 更柔软的明天
版权声明
1990:种下那棵不落叶的树和主题曲和片尾曲以及相关封面图片等 ©[李林][2025]。本作品采用 知识共享 署名-非商业性使用 4.0 国际许可协议 进行授权。
这意味着您可以:
- 在注明原作者并附上原文链接的前提下,免费分享、复制本文档与设计。
- 在个人学习、研究或非营利项目中基于此进行再创作。
这意味着您不可以:
- 将本作品或衍生作品用于任何商业目的,包括企业培训、商业产品开发、宣传性质等。
如需商业用途或宣传性质授权,请务必事先联系作者。
作者联系方式:[1357759132@qq.com]











