随笔-放慢心态1

按照现在的工作状态,实在无法保证之前的技术博客按计划进行。在罪恶感的驱使下,我拿了自己无聊时写的随笔,用来充数。看看一个仍旧奋战在一线的程序员,如何在万恶的房价经济社会中,如何苦苦挣扎。

连续两周出差,身体严重透支。正好有一个小时的时间,在等一位朋友过来。用来整理技术文章是不够,正好把这一小段时间的感想记录下来。

人生过了三十岁,时间的齿轮好像突然加快,仿佛总是处在一个“时间不够”的状态。要学习新的东西、要照顾家庭、各种朋友应酬…忙来忙去,最后都忘记了自己为了什么在忙碌。

龙应台有本书《孩子你慢慢来》,我曾经在出差途中看完。有段话,这么写的,对比得很有意境:“淡水的街头,阳光斜照着窄巷里这间零乱的花铺。 回教徒和犹太人在彼此屠杀,衣索匹亚的老弱妇孺在一个接一个地饿死,纽约华尔街的证券市场挤满了表情紧张的人——我,坐在斜阳浅照的石阶上,愿意等上一辈子的时间,让这个孩子从从容容地把那个蝴蝶结扎好,用他五岁的手指。”

我很喜欢这段话。生活从来就不美好,世界残酷而真实,美好只存在于我们的内心,那些你所珍惜的事物,导引了我们生活的方向。

大学的第一年,元旦第一天,我一个人坐在三工教学楼的某个教室里面,努力准备马上要考试的科目。第一场雪就在那个时候下起来了,我看着窗外,就这么呆呆的看着雪坐了一个上午。

那时的自己,仿佛青春永远都会在,未来的日子总感觉非常遥远。除了不时会冒出来的考试,踢球、泡图书馆、看漫画,无聊时可以花两个礼拜画一张图,从容天真。

离开学校后,画风变了。如果每个人的生活都是一场电影,那么,在离开学校的这十几年,每一帧都充满了急躁,对未来的恐惧。 继续阅读“随笔-放慢心态1”

640 total views, 1 views today

Foxdisk04-启动原理1

我不记得是哪个小品了,赵本山用他的标准铁岭普通话说:“我不想知道它怎么来的,我只想知道它是怎么没的。”

对编程而言,“怎么来的”实际上非常重要,不能不了解。Foxdisk的启动过程,在“如何安装1”中已经有了说明,本篇会尽量的把相关的背景知识介绍清楚。

有几个关键词:BBS、Legacy BIOS、UEFI、MBR。

BBS

英特尔、Phoenix和康柏公司在1996年联合发布了BIOS引导规约(BIOS Boot Specification),简称BBS(图2)。尽管十几年已经过去了,但是这个规约中的大多数内容至今仍被使用着。本文中使用的很多术语和数据结构都来自这个规约。

Foxdisk04-BBS spec

 图1 BIOS Boot Spec

BBS将引导设备划分为以下三种类型: 继续阅读“Foxdisk04-启动原理1”

413 total views, no views today

Foxdisk03-如何安装2

整个Foxdisk3.01的代码,是将安装程序和主程序混在一起编译的。安装程序负责将代码拷贝到指定的硬盘区域,包括MBR代码、Foxdisk的启动代码、Foxdisk的资源、Foxdisk的code段和数据段。在“如何安装1”中叙述的foxdisk在硬盘中的映像,都是由它来实现的。

混编的好处是,安装程序能够很容易的定位主程序各种段(code、data、stack等等)的位置,方便安装。另外,很多函数可以共用。坏处是,安装程序也要占据不少的空间。我之前为了方便C和汇编混合,设定了编译模式为small,也即Code段必须在64K内,Stack和Data段加起来在64K之内。我在设计初期没有考虑好,代码写到后半段就感到很痛苦—许多想实现的功能因为代码的限制,没法去实现。

现在的编译器早就取消了这样的限制,以技术而言,BorlandC++3.1已经是石器时代的产品。以我现在常用的Vs2015,从来不用去考虑类似这样的问题,可以专注在程序本身的实现。计算机软件的发展非常快,一不小心我也变成了老古董了。

回到正题。与安装相关的文件有Setup.c、Setup.h、iSetup.c和iSetup.h,与主程序共用了磁盘访问、图像显示等函数。外设的访问,在后面专门写几个章节进行介绍,用汇编去访问外设,我估计现在除了开发驱动或者OS的程序员,很少会有人去关注它们了。

从Setup.c的main()函数开始跟踪,了解安装过程。

main函数做了两件事情: 卸载和软件安装。卸载的过程故意设计得复杂,通过判断命令行以及热键,确定用户需要完全卸载,然后再将相应的扇区覆盖。这几天我重读代码,觉得这里的设计很有问题,有可能导致卸载后无法进入操作系统了。

软件安装通过两个函数实现,firstSetup()和updateSetup()。前一个函数是首次安装,后一个是针对已经安装的软件进行参数更改或者代码升级。main()最后的汇编代码:

asm mov ax,3

asm int 0x10

其作用为回到文本模式。程序是在DOS环境下,并使用图形模式安装的,如果没有回到文本模式,DOS的命令行无法执行。

通篇代码中,有大量嵌入汇编的地方。这种写法不是很好,程序可读性比较差,我主要是习惯了汇编来实现一些小功能,不自觉的就用上了。后续出现内嵌汇编的地方,都会给出解释。

firSetup()中,将安装主程序的步骤分为了四个,代码中给出了很详细的说明,很容易读懂。此函数中所调用的图形函数和磁盘访问函数,其功能都比较单一,通过函数说明可以了解其作用。

我尽量不去调用C的库函数,以防止代码量的增加。因此,很多经典的函数,比如memset、memcpy等,只能重新自己实现。另外一个原因,Foxdisk的主程序中,是没有操作系统的,那些库函数也没法运行。我参考的代码来自于linux2.6,不愧是千锤百炼的代码,非常精简高效。

firSetup()中频繁使用的汇编代码:

asm xor ax,ax

asm int 0x16

这段代码的功能是等待按键,类似于C语言中的getchar()或者pause()。

updateSetup()的实现代码在iSetup.c中,其实现方式类似于firSetup(),就不一一解释了。

这两个函数都打开了时钟中断,实现一些需要定时的功能。篇幅所限,不再详细说明,在后续章节中针对时钟中断做一个详细说明。

379 total views, no views today