免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2477 | 回复: 13
打印 上一主题 下一主题

请教一个短小的引导程序的原理。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-26 21:30 |只看该作者 |正序浏览
我实在是一个菜鸟麻烦大家了,请教这个短小的引导程序的运行机制和原理解释。
[bits 16]

BOOTSEG   equ 0x0000
SETUPSEG  equ 0x9000
SETUPOFF  equ 0x0000
SETUPSEC  equ  2
BOOTDRIVER equ 0;floppy a
SCREENSIZE equ 0x0fa0
;++++++++++++++++++++++++++++++
start:
mov ax,BOOTSEG
mov ds,ax
sti

;___________________________
;读setup.asm->0x90000
read:
mov ax,SETUPSEG
mov es,ax
mov bx,SETUPOFF
mov ah,2
mov dl,BOOTDRIVER
mov dh,0
mov ch,0
mov cl,2
mov al,SETUPSEC
int 13h
jc read
jmp SETUPSEG:SETUPOFF //冒号后面的是怎么回事啊?


times 510-($-$$) db 0
dw 0aa55h

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
14 [报告]
发表于 2012-03-27 12:15 |只看该作者
0.01的时候有AT&T汇编,bootloader那部份汇编是NASM,后面的汇编用的GCC,记忆中是如此。

论坛徽章:
0
13 [报告]
发表于 2012-03-27 11:31 |只看该作者
我做过ARM Multi-core的bootloader V7架构,很短小,如果LZ有这方面的需要的话,应该可以帮到你,不过话说magicboy兄,如何从U盘启动,什么时候可以show一下啊
=======================================

当时纯粹是好奇就自己操刀写了一个半成品,最早我那个bootsec.bin,setup.bin加上kernel都是我在dos下用int 13h写到软盘去的,然后从软盘加载。我说我当时写坏的软盘不写几十张,有人还以为我在忽悠,其实还真不是,软盘这个东西真不经用,而且也不怎么可靠,所以主楼的代码里要jc read,因为一次没读成功对软盘来说是很正常的。当然这是个很原始阶段的做法了,后来就改用grub来引导,再后来为了demo给别人看,就把grub和kernel全放到u盘里了,插到电脑上从U盘启动就可以了,关于U盘启动的方法,很早前写的一个总结帖子,http://www.embexperts.com/forum.php/forum.php?mod=viewthread&tid=374&extra=page%3D1,现在还能用。。。

论坛徽章:
0
12 [报告]
发表于 2012-03-27 09:38 |只看该作者
MagicBoy2010 发表于 2012-03-26 23:10
是的。就是你悬赏1万要学kernel?!可惜了,要是在北京的话,把我自己写的能直接放到U盘里启动的代码拿 ...


我做过ARM Multi-core的bootloader V7架构,很短小,如果LZ有这方面的需要的话,应该可以帮到你,不过话说magicboy兄,如何从U盘启动,什么时候可以show一下啊

论坛徽章:
0
11 [报告]
发表于 2012-03-26 23:47 |只看该作者
nasm -o a.img a.s

然后用bochs看看就行了,调试输出
(0) [0x0000000000007c00] 0000:7c00 (unk. ctxt): mov ax, 0x0000            ; b80000
<bochs:3> n
Next at t=14041609
(0) [0x0000000000007c03] 0000:7c03 (unk. ctxt): mov ds, ax                ; 8ed8
<bochs:4>
Next at t=14041610
(0) [0x0000000000007c05] 0000:7c05 (unk. ctxt): sti                       ; fb
<bochs:5>
Next at t=14041611
(0) [0x0000000000007c06] 0000:7c06 (unk. ctxt): mov ax, 0x9000            ; b80090
<bochs:6>
Next at t=14041612
(0) [0x0000000000007c09] 0000:7c09 (unk. ctxt): mov es, ax                ; 8ec0
<bochs:7>
Next at t=14041613
(0) [0x0000000000007c0b] 0000:7c0b (unk. ctxt): mov bx, 0x0000            ; bb0000
<bochs:8>
Next at t=14041614
(0) [0x0000000000007c0e] 0000:7c0e (unk. ctxt): mov ah, 0x02              ; b402
<bochs:9>
Next at t=14041615
(0) [0x0000000000007c10] 0000:7c10 (unk. ctxt): mov dl, 0x00              ; b200
<bochs:10>
Next at t=14041616
(0) [0x0000000000007c12] 0000:7c12 (unk. ctxt): mov dh, 0x00              ; b600
<bochs:11>
Next at t=14041617
(0) [0x0000000000007c14] 0000:7c14 (unk. ctxt): mov ch, 0x00              ; b500
<bochs:12>
Next at t=14041618
(0) [0x0000000000007c16] 0000:7c16 (unk. ctxt): mov cl, 0x02              ; b102
<bochs:13>
Next at t=14041619
(0) [0x0000000000007c18] 0000:7c18 (unk. ctxt): mov al, 0x02              ; b002
<bochs:14>
Next at t=14041620
(0) [0x0000000000007c1a] 0000:7c1a (unk. ctxt): int 0x13                  ; cd13
<bochs:15>
00014042384i[FDD  ] read() on floppy image returns 0
00014087339i[FDD  ] read() on floppy image returns 0
Next at t=14132740
(0) [0x0000000000007c1c] 0000:7c1c (unk. ctxt): jb .-24 (0x00007c06)      ; 72e8
<bochs:16>
Next at t=14132741
(0) [0x0000000000007c1e] 0000:7c1e (unk. ctxt): jmp far 9000:0000         ; ea00000090
<bochs:17>
Next at t=14132742
(0) [0x0000000000090000] 9000:0000 (unk. ctxt): add byte ptr ds:[bx+si], al ; 0000

论坛徽章:
0
10 [报告]
发表于 2012-03-26 23:43 |只看该作者
这是国内一个牛人写的brightsky os 中复制下来的。

论坛徽章:
0
9 [报告]
发表于 2012-03-26 23:39 |只看该作者
是不是就是传说中的Linux 0.11中的代码?那时候还没有AT&T语法?

论坛徽章:
0
8 [报告]
发表于 2012-03-26 23:36 |只看该作者
你这用nasm编译的吧

论坛徽章:
0
7 [报告]
发表于 2012-03-26 23:13 |只看该作者
你1楼中的代码是要通过编译,然后形成纯2进制文件(不是什么ELF),这种文件里面直接就是机器指令,可以直接跳转过去运行的。在gcc下,可以通过下面的option来产生纯二进制指令:
LINKFLAG  =         -s --oformat binary -Ttext 0x0

论坛徽章:
0
6 [报告]
发表于 2012-03-26 23:10 |只看该作者
jxj812 发表于 2012-03-26 23:08
回复 4# MagicBoy2010

jmp SETUPSEG:SETUPOFF  SETUPSEG是基地址,冒号后面SETUPOFF是偏移地址对吗?


是的。就是你悬赏1万要学kernel?!可惜了,要是在北京的话,把我自己写的能直接放到U盘里启动的代码拿给你直接现场指导。。。
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP