第一章:计算机系统漫游
1.信息=位+上下文
①. 系统中所有的信息——包括磁盘文件、存储器中的程序、用户数据、网络数据都是由一串
位
表示的。
②. 区分不同对象的唯一方法是:我们
读到这些数据对象时的上下文。
2.CPU基本操作(汇编语言的工作过程):
①、加载:把一个字节或字从内存复制到寄存器,以覆盖原来的数据。
②、存储:把一个字节或字从寄存器复制到内存的某个位置,以覆盖这个位置上原有的内容。
③、操作:把两个寄存器的内容复制到ALU,ALU对这两个值作算术操作,并将结果放到某个寄存器中,以覆盖该寄存器原有内容。
④、跳转:从指令本身抽出一个字,并将这个字复制到PC寄存器中,以覆盖PC中原有的值。
3.文件
文件就是字节序列,仅此而已。
文件这个
简单而又精致的概念其内涵是相当丰富的,因为
它向应用程序提供了一个统一的视角,来看待系统中可能含有的各式各样的I/O设备,如磁盘、键盘、显示器、网络等等。
4.抽象
计算机中的一个重大课题就是提供不同层次的抽象表示,来隐藏实际实现的复杂性。
操作系统(内核)是应用程序和硬件之间的媒介,它提供了三个基本的抽象:
①、文件对I/O设备的抽象。
②、虚拟存储器对内存和磁盘的抽象。
③、进程对处理器、内存和I/O设备的抽象。
读后感:
作者从一开始就明确地指出了计算机以及软件的本质:计算机是用于处理信息的工具,而信息就是位和上下文。所谓的“位”,通俗地讲就是1或0,对应到物理量就是电平的高低,这就是信息的最小单位。而“上下文”指的是“语境”,同样的一串位(比如“1001 0011”)在不同情况(语境)下,表示的意思也不一定相同。
就好比在英语的世界里,26个英文字母就是“位”,这些位可以通过不同的组合来表示不同的信息,如"apple" 就是由位组合而成的“字”,许许多多的字连起来就是一句话、一首歌、一篇文章、一部小说等等。所以,我们在电脑屏幕上看到的一切信息,包括一个图标、一个MP3文件、一部电影等等,其本质都是一连串1/0的组合。
认识到事物的本质,是掌握相关知识的关键。有了上面对计算机软件的本质认识,我们可以进一步理解所谓的文件、操作系统、编程语言、业务模块等等,这些堪称庞大的“模块”无非是一些牛人前辈们对信息进行了一系列加工、封装、架构,从而打造出了现如今纷繁复杂的计算机系统。
作为普通码农的我们,都是活在极其聪明的前辈们构建的“概念”里,比如K&R构建(发明)了C语言,Linus用C语言构建了Linux系统,Andy Rubin在Linux系统上又构建了Android操作系统。这些能用别人做好的东西发明另一样东西的人,可谓是牛人中的战斗机;还有一部分人能把别人发明的东西、别人构建的概念很容易就学会,并且用得很好,这部分人就是牛人;而剩下就像你我这样的人(自认为是牛人的都不会看到这里,嘿嘿),疲于奔命,学习日新月异的技术,为的只是不被时代淘汰,为的只是混口饭吃,还有的是为了有朝一日能挤进牛人圈子里。
怎么样才能从菜鸟变成技术牛人呢?这也是我经常问自己的问题。如今有一点点感悟,斗胆说出来与大家分享一下,有什么不对的地方也请大家不吝赐教。既然我们是跟在别人屁股后面,学习别人发明出来的东西、别人构建出来的概念,那么我们完全可以战略上藐视它,战术上重视它:
①、我要学习的东西在本质上就是一连串的1/0,没什么神秘,没什么了不起的。(藐视它,你才不会被它吓跑)
②、我要学习的东西它是什么(能干什么)?它怎么是做到的?为什么要这么做?(重视它,你才能掌握好它)
在上面说的第②点中,能回答第一个问题是普通用户,能回答第二个问题是开发人员,能回答第三个问题是才是真正的技术牛人。
我认为计算机世界里还有一点很重要,那就是“抽象”,用艺术来形容这个词都不为过。"计算机中的一个重大课题就是提供不同层次的抽象表示,来隐藏实际实现的复杂性。" 这句话本身就很抽象,但能够真正理解它,将使你如虎添翼。我所理解的抽象,即是对一类事物共性的提取过程或结果。抽象的艺术随处可见,比如Linux里把所有的I/O都抽象成了文件,带来的好处就是应用开发者可以通过统一的读写接口访问硬件,简单地控制着各种硬件的工作。Linux里的各种驱动模型也是抽象的结果,比如platform总线提供了一种通用的方法让驱动程序和设备相互匹配;usb模块又基于platform总线,抽象出了usb控制器的通用行为;input子系统抽象出了所有输入设备的共性;framebuffer抽象出了显示器的通用操作和属性等等。于是乎,驱动开发人员的开发步骤几乎可以简化成三个步骤:分配某个结构体、填充该结构体、将该结构体注册入内核。应用开发人员的开发步骤也可简化成:打开、读写、关闭。 回过头来想想,发明这套机制的是何等高明之人啊,我辈除了顶礼膜拜之外,只能认真研习,仔细品味才对得起神人们贡献出的智慧结晶。
好了,今天就到这里了。