`
Tveiker
  • 浏览: 54462 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

裸机跑起自己得程序

阅读更多
这是一个关于启动得程序。其目标是将一个程序不依赖任何操作系统而运行起来。下面是关于它的一点内容。

首先了解下PC开机后得一些动作
     1)、PC启动时Intel系列CPU进入实模式设置CS=0xffff,IP=0x0000,所以CPU先执行0xffff0处代码[ROM-BIOS起始位置]。
     2)、BIOS进行一系列自检,然后初始化位于地址0处得中断向量表。
3)、BIOS将启动盘第一个扇区(512B)装入到内存地址0x7c00处并跳到此处执行此处代码。

所以我们所写的程序就应该放在0x7c00处,即使没有操作系统我们的程序也能运行起来。
好吧Coding now,I can't wait...

    所以系统引导程序放在启动盘的第一个扇区。由BIOS加载到内存

下面了解下Linux系统引导程序/boot/Bootsec.s所做的事。
  1)、linux系统启动后将自己装入到绝对地址0x90000处。
  2)、再将其后的2K字节(Setup文件)装入到地址0x90200处
  3)、最后将内核文件装入到0x10000处

当引导程序被BIOS加载内存后,则开始运行/boot/Setup.s
  1)、Setup.s首先设置一些硬件设备,然后将内核文件从0x10000处移到0x00000处,
  2)、此时系统进入保护模式,开始执行0x00000处代码

内核文件头部是在/boot/Head.s文件中
  1)、这个文件会将LDT、GDT的首地址装入到相应得寄存器中,初始化处理器,设置好内存页面
  2)、然后调用/init/main.c中的main函数。
然后启动完成

;----------------------------------------------------------
;此程序是一个测试启动的程序。不依赖于任何操作系统
;nasm start.asm -o start.bin进行汇编生成二进制文件(512B)
;利用bximage命令生成一个软驱boot.img,
;利用dd if=start.bin of=boot.img bs=512 count=1 conv=notrunc
;将start.bin写入软驱boot.img中
;------------------------------------------------------------

	org		0x7c00       ;加载程序到0x7c00处[CS:IP=0000h:7c00h]
	mov		ax,cs        ;
	mov		ds,ax
	mov		es,ax        ;以上三条指令是将数据段和额外段调到代码段一起
	call	DispMessage  ;调用显示字符串的子过程
	jmp $                ;无限循环
DispMessage:
;------------------------------------
;关于显示的BIOS中断10h号 13h号功能
;+=========+================+=======================================+
;|功能号AH  |    功能描述     |                  入口参数              |
;+---------+----------------+---------------------------------------+
;|         |                |BH/BL=显示页/属性(字符串底色及字体颜色)    |
;|         |                |CX=字符串长度                           |
;|         |                |DH/DL字符串显示的行/列                   |
;|         |从指定位置显示    |ES:bp=字符串显示得起始逻辑地址            |
;| 13h     |  字符串         |AL=0  利用BL属性,光标不移动             |
;|         |                |  =1  利用BL属性,光标移动               |
;|         |                |  =2  [字符,属性],光标不移动             |
;|         |                |  =3  [字符,属性],光标移动               |
;+=========+================+=======================================+
;
;  BL作为字符属性:BL共八个位(一个字节),前四个位是底色属性,后四个位是
;                 字符前景属性。属性4位的最高位是高亮属性,为1时则高
;				  亮,后三位是颜色值RGB
; 当字符串不利用BL属性:即AL=2,3时[字符,属性]的意思。
;				    [字符,属性]就是说在显存中有色字符存储需要两个
;                    字节,第一个字节是字符,第二个字节则代表字符的
;				     具体属性。属性意思跟BL解析一样,只是这样更灵活
;----------------------------------------------------------------------
	mov		ax,Message
	mov		bp,ax
	mov		ah,13h
	mov		al,0
	mov		dx,0x0403
	mov		bh,0
	mov		bl,0x4f
	mov		cx,10h
	int		10h
	ret
Message:
	db	"Hello OS World!"
	times 510-($-$$) db 0 ; $代表当前行指令首地址,$$代表程序首地址
	dw  0xaa55	       ;扇区结束标志selector[510]=55h selector[511]=aah

以下就是运行截图。红底白色得Hello,OS World!


  • 大小: 19.8 KB
4
1
分享到:
评论
6 楼 Tveiker 2012-04-04  
bewithme 写道
嗯,顶住,希望有一天看到你写的OS。

谢谢,我会试着坚持得
5 楼 Tveiker 2012-04-04  
沙舟狼客 写道
能不能把你的环境给我说一下,具体怎么配置运行这段代码

Ubuntu10.10+bochs-2.5+nasm2.9
4 楼 沙舟狼客 2012-03-09  
能不能把你的环境给我说一下,具体怎么配置运行这段代码
3 楼 bewithme 2012-03-09  
嗯,顶住,希望有一天看到你写的OS。
2 楼 expone 2012-03-09  
你妹的,又一个搞OS的,希望能坚持下来。
1 楼 shirne 2012-03-09  

哈哈

相关推荐

Global site tag (gtag.js) - Google Analytics