不远复和蒙以养正

我非常喜爱《易经》,买了很多关于《易经》的书。为什么学习《易经》呢?目的不是为了要学如何算卦,而是想通过它了解古人的观点。或者说,我是把《易经》当作哲学和历史来读的,“好易而不占”。

《易经》里有很多富有内涵的话,比如大家熟悉的厚德载物,自强不息,等等。今日标题中的两个词“不远复”和“蒙以养正”也都出自《易经》这个文化宝库。

“不远复”出自《易经》的复卦,基本的意思就是,“没走多远就要回头看看”,经常回顾走过的路,思考反省,看看是否偏离了方向。

理学家朱熹很喜欢这句话,把它写成大字,挂在自己的书堂中,目的是提醒自己要经常反省,纠正错误,不要背离根本。

其实,“不远复”对于治学和做软件也是很有价值的。

经过几十年的快速发展,关于软件的知识库已经非常巨大,而且几乎每一分钟都还在增加新内容。

回想我刚毕业的90年代,流行的编程语言就那么一两种,操作系统方面也主要是Windows一种(少量Unix),芯片方面主流的就是x86。而今天,形势已经大不相同,每个层面都“多头化”,而且层次的数量还在增多。

这意味着,对于今天的新手来说,可以选择的方向更多了,要学习的内容也更多了。方向多是好事,但是要学的东西多就未必好了。一则可能导致不知道要学什么,茫然不知何从下手。另外也可能学的内容不合适,花了很多时间,但是收益不大。也有可能辛辛苦苦学的东西没过多久就过时了。

这几年与一些大学生和年轻同行做过一些交流,发现的一个普遍问题是“根基薄弱”,对计算机系统的底层原理知之甚少。比如,很多人对进程空间、虚拟内存、页错误这样的基本概念都模糊不清,对cache机制、中断管理和硬件结构就更知之甚少了。

对于《易经》的64卦,我比较熟悉的另一卦是“蒙”卦。

上面的三爻代表山,下面的三爻代表水,山水朦胧,比喻事物的初生状态,卦辞则阐述先哲们的教育观。“非我求童蒙,童蒙求我”,意思是学习这件事,学生要掌握主动权。“蒙以养正,圣功也”是对老师的鼓励,意思是“教育这件事可以培养正气,也很有功德的”。或许是受了这句话的鼓舞,这些年我一直很热心于知识传播,把自己对软件的一些理解和认识分享给同行们。庐山研习班便是一种形式。

《论语》的为政篇有句名言,叫“君子不器”。意思是人不要像器皿那样只有一个用途,不要把自己局限在一个作用上。更进一步的说,是鼓励知识分子不要只读书本,只顾自己,要为社会,为他人做些贡献。

上面这些想法在我脑海中很久了,时不时就浮现出来。2020年太特别了,微小的病毒搞乱了这个世界,也触发我们重新思考一些基本的问题。在这样的背景下,大约三周前的一个晚上,我的脑海中突然冒出一个方案,这个方案把积蓄许久的空想夯实,成为一个计划,这个计划便是把我对计算机系统的理解和认识打造成一个讲座,这个讲座每年更新一个版本,坚持下去,不断提炼,不断改进,让它既“营养丰富”,又容易 “消化吸收”。有了想法后,立刻落笔,便有了下面这个提纲。

基础篇

 

第一讲:万法归一:图灵机和指令引擎

要点:图灵和图灵机,一条长长的纸带,PC,寄存器,X86的通用寄存器,X86的常用指令,有趣的x86指令,断点指令,滑板指令,特权指令,控制寄存器,工作模式,实模式,保护模式,SMM,MSR寄存器,读取CPU的体温,rdtsc

 

实验1:在调试器下认识常用指令和重要寄存器

 

第二讲:从跑到飞:中断和陷阱

要点:不是一开始就会飞,外设和速度差异,理解飞的强需求,中断过程,IDT表,陷阱,控制软件,操作系统的雏形

 

实验2:在调试器中观察IDT表和理解中断机制

 

第三讲:离不开的栈

要点:函数,从函数返回,栈在中断和异常时的作用,内核态栈,Linux内核中的多个特殊栈,用户态栈,栈到底有多大,使用栈的好处,栈的安全问题,栈溢出攻击,DEP

 

实验3:在调试器中理解栈的自动增长和溢出攻击

 

第四讲:内存锥鉴

要点:ENIAC,冯·诺依曼架构,内存与外存,内存的速度,带宽和通道,DDR3,DDR4和DDR5,考验内存,有趣的memset试验,虚拟内存与物理内存,页表结构,页的属性,重要的标志位,页错误,大错误,小错误,如何“玩爆”Linux的内存管理器

 

实验4:在调试器中观察页表和理解页错误

 

第五讲:系统脊梁:PCI总线

要点:理解总线,PCI简史,PCI标准的精髓内容,详解PCI的配置空间,厂商ID,产品ID,设备类型,基地址(BAR),设备寄存器,访问设备寄存器,手工控制U盘,USB控制器举例

 

实验5:在调试器中理解PCI总线

提高篇

 

第六讲:产业格局:固件和ACPI

要点:固件的必要性,多角度理解ACPI标准,ASL,EFI和ACPI,TianoCore,ACPI的表,E820表,ACPI的标准设备,电池举例

 

实验6:在调试器中理解ACPI设备

 

第七讲:多层接力:Cache

要点:冯·诺伊曼的伟大语言,速度之差,多层结构,代码Cache和数据Cache,Cache的结构,局部性,如何编写Cache友好的代码

 

实验7:观察Cache的数量和结构

 

第八讲:中断控制器

要点:PIC的必要性,PIC,APIC,IOAPIC,本地APIC,APIC的重要寄存器,中断优先级,Windows内核中的IRQL,Linux的做法,NMI,多处理器的挑战,IPI,IPI有关的死锁

 

实验8:在调试器中理解APIC

 

第九讲:芯片组

要点:经典的三芯片架构,神秘的主机控制器,DMI,内存控制器,MCH北移,ICH,ICH的消失和重生,PCH中的常用设备,访问PCH中的设备,DMA,内存映射和经典IO空间,SOC

 

实验9:在调试器下理解芯片组

 

第十讲:蓝丸和VMM

要点:再分层,机器层面并行,VTx,VM的Entry和Exit,VMCS详解,虚拟机状态(Guest-state)区,主机状态(Host-state)区,虚拟机执行控制字段,VM-exit控制字段,VM-entry控制字段,VM-exit信息字段,XEN,Hyper-V,KVM

 

实验10:在调试器下理解VMM

为了能让更多人参加,讲座采用线上直播和录像的形式,内容长度为上下两篇,十次讲座,十个动手试验,加课后问答与讨论。

大纲发出后,参加过庐山研习班的格友很快理解了我的思路。

对于这个提纲,虽然只有十讲,但是分量真的不轻,对于听众,如果能坚持下来,听不懂的地方就提问,用心动手试验,那么必定是有收获的。对于我,也刚好是把多年积累的东西整理一下,系统化,条理化,并以一种新颖的方式呈现出来。

知行合一,今天动工准备讲义,一天时间基本完成了第一讲,主题是计算机系统的灵魂:CPU。

分成如下六个小节:

•X86基础:常用寄存器和指令

•X86进阶:特殊寄存器和特权指令

•X86进阶:工作模式和SMM揭秘

•X86进阶:有趣的指令

•理一分殊:扩展到ARM

•万法归一:图灵和图灵机

有些同行担心这个课太难,听不懂,询问要什么基础,我说唯一的要求是听不懂的地方就提问。其实最重要的是诚心,真诚求知的心。

为了尽可能把一些概念说的浅显易懂,在讲义中使用了很多比喻,“用已知描述未知”。

侯捷老师在他的《深入浅出MFC》一书中有句名言:勿在浮沙筑高台。对于每个程序员来说,深刻理解计算机系统的重要性是再强调也不过分的。夯实这个基础,可以终生受益。

 

***********************************************************

正心诚意,格物致知,以人文情怀审视软件,以软件技术改变人生

欢迎关注格友公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值