引导入门:
站在一个外行的角度,所谓操作系统,其实是不存在的(你在说什么 ?), 是的,不存在的,不管你信不信,你都要接受这个现实,你可以想象一下,电脑是如何启动的:
- 按动启动按钮,这里可能由一个简单的电路来实现接收按钮的按下操作,这可不是普通的船型开关,所以在电脑启动前,电脑必须加电的,船型开关,比如家里的电灯就不需要,直接上下拨动就表示开或者关
- 最先加电的是主板,它会尝试和CPU进行联络,确保CPU一切正常后,它会通过CPU的电路先将BIOS中存储的一部分硬件驱动加载到内存中去, 所谓驱动,其实就是一些机器码,你可以想像得到,这时候没有java没有C没有任何编程语言,只有电路。
- 加载好了之后,主板尝试启动BIOS系统,它确实是一个系统,在内存中已经加载好了,这时候指令寄存器会确保跳转到内存中正确的位置进行启动
- BIOS启动后,根据已经加载的硬件驱动,进行硬件的查找,比如显卡,键盘,鼠标,硬盘或者软驱,它会在找不到一些硬件的时候报错,当然有些坑爹的BIOS会在找不到键盘的时候进行如下提示:keyboard not found , press f1 to continue
- 然后,BIOS会根据用户设置的启动方式,按照启动顺序挨着盘地在可以搜索到的盘中查找操作系统,它查找操作系统的方式和我们正常人可不一样,当看到一个盘的时候,它把它的第一个柱面的第一个扇区拷贝到内存中去,然后查看第512个字节的位置,如果是一个启动盘,则它会继续执行里面的内容,这也就是所谓的启动区了,如果不是,pass,下一个
- 如果找到启动区,BIOS的就会把接力棒交给启动区去执行了,这时候启动区仍然可以调用BIOS已经加载好在内存中的驱动,这就是为啥我们写操作系统的时候,可以调用显卡驱动的原因。
- 那么如何让BIOS启动的时候,报系统找不到的错误呢?so easy, 修改硬盘的第一个柱面第一个扇区的最后两个字符,甚至只修改一个就行,只要不是 0x55,0xaa 就可以,这样玩风险很大,玩不好挂掉整个硬盘不要怪我。不过你也可以为此专门只做只有你自己才可以打开的操作系统,你可以写个小程序,专门修改这个位置的字符,就达到了加密的目的,当你想启动系统的时候 ,再把它改过来。
正式接管系统之后,你可以做任何事情了,这时候想效用一下显卡显示个字符之类的都是小菜一叠。
下面就是直接调用显卡驱动,在屏幕上面显示一个字符的汇编源程序
MOV AL,'H'
MOV AH,0Xe
MOV BX,15
INT 0X10
RESB 0x1fe-$
DB 0x55,0xaa
这段程序的解释:
既然我们的操作系统,是写在BIOS已经加载好了之后,这时候我们已经可以加载BIOS为我们准备的显卡驱动了(显卡驱动?不是要等操作系统安装后安装吗?这里是什么?其实,每个显卡在设计的时候,都会遵循一个默认的显卡驱动,这个驱动可能很简单不会发挥出你显卡真正的威力,但是这是必要的,因为BIOS启动的时候,需要显示的东西,要通过这个显卡驱动完成,所以说这个显卡驱动,每个显卡都一样,你总不会说出了一款显卡,就要在BIOS里面加入新的驱动吧。)
我们这个程序,其实就是调用显卡驱动完成的,没有什么神奇的地方,后面的RESB 0x1fe-
,中的
符号,其实是计算前面已经有多少个字节的意思,所以 0x1fe正好就到了该写那两个字符的位置了,你懂的。
DB意思就是写一个字符,后面跟了 0x55 0xaa 就是表示写两个字符的意思,你懂的。
那么我们调用显卡显示字符,其实就是4行:
MOV AL,'H' ;
MOV AH,0Xe ;显示一个文字
MOV BX,15 ;调用显卡BIOS
INT 0X10 ;调用显卡BIOS
怎们样,简单不?这里甚至可以调用颜色呢:MOV BX,15 中传入的颜色值
今天写到这里,先上班了。