我想自己开发一个操作系统,在MBR部分由BUILDER来合成,
jmp部分我直接往盘里写jmp short 0x5a nop的机器玛:0xeb,0x5a,0x90
然后跳过信息部分
填充(420-64)字节的启动代码,由mbr_boot.bin直接提供.
最后填充0x55,0xaa.
但是启动不起来.
我的思路有问题吗,还是代码问题
mbr_boot.asm
%define BIOS_LOAD_MBR_ADR 0x07c0
;BIOS加载MBR的位置
%define REAL_LOAD_MBR_ADR 0x9000
;MBR实际执行的地址
entry:
;复制MBR
mov ax,BIOS_LOAD_MBR_ADR
mov ds,ax
sub si,si
mov ax,REAL_LOAD_MBR_ADR
mov es,ax
sub di,di
mov cx,0x200
rep movsb
jmp REAL_LOAD_MBR_ADR:(real_start-entry)
;跳转执行
real_start:
;初始化寄存器
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov dx,0xfef4
mov sp,dx
;卷屏
mov ah,0x03
xor bh,bh
int 0x10
mov ax,0x0600
mov bx,0x0700
mov cx,0
mov dx,0x184f
int 0x10
mov ah,0x02
mov bh,0
mov dx,0
int 0x10
;打印启动信息
mov bp,boot_msg
mov cx,21
call print_str
jmp $
;读取磁盘信息
.load_partions
;寻找分区
mov bp,0x07c0+0x1be ;分区表的开始地址
mov cx,0 ;分区表的表项序号(0-4)
.search_active_partion
;寻找活动分区
jmp $
boot_msg: db 13,10
dd "CandleOS early boot"
print_str:
;打印字符串,参数:bp字符串首地址,cx:字符串总长度
push ax
push bx
mov ah,0x13
mov al,0x01
mov bx,0x0007
int 0x10
pop ax
pop bx
ret
build.c
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
int main(int argc,char **argv)
{
char file_boot[32];
char file_disk[32];
if(argc!=5)
{
fprintf(stderr,"Build:Build Failed,missing or too many argments!\n");
return 1;
}
FILE *fp_disk,*fp_boot;
int i;
for(i=1;i<argc;i++)
{
if(!strcmp(argv[i-1],"-d"))
{
fp_disk = fopen(argv[i],"rb+");
sprintf(file_disk,"%s",argv[i]);
}
else if(!strcmp(argv[i-1],"-b"))
{
fp_boot = fopen(argv[i],"rb+");
sprintf(file_boot,"%s",argv[i]);
}
else{
continue;}
}
if(fp_disk==NULL)
{
fprintf(stderr,"Build:Build Failed,no such a disk file!\n");
return 1;
}
if(fp_boot==NULL)
{
fprintf(stderr,"Build:Build Failed,no such a boot file!\n");
return 1;
}
struct stat statbuf_boot;
stat(file_boot,&statbuf_boot);
if(statbuf_boot.st_size>420-64)
{
fprintf(stderr,"Build:Build Failed,the boot file is too large(more than 356 bytes)!\n");
return 1;
}
char buf[420-64];
int j;
for(j=0;j<420-64;j++)
{
buf[j]=(char)0;
}
fseek(fp_boot,0,SEEK_SET);
fread(buf,420-64,1,fp_boot);
static char jmp_prog[3] = { 0xeb,0x5a,0x90};
static char boot_flag[2] = { 0x55,0xaa};
fseek(fp_disk,0,SEEK_SET);
fwrite(jmp_prog,3,1,fp_disk);
fseek(fp_disk,0x5a,SEEK_SET);
fwrite(buf,420-64,1,fp_disk);
fseek(fp_disk,0x1fe,SEEK_SET);
fwrite(boot_flag,2,1,fp_disk);
fclose(fp_disk);
fclose(fp_boot);
printf("Build:Build finished!\n");
return 0;
}