bochs除錯作業系統,以及可引導img的製作
首先寫這篇文章的目的是自己在用bochs除錯作業系統的時候有很多關鍵的資料網上寫的很亂,所以我根據自己的看書以及實踐成功了,在這裡分享一下某一些關鍵的步驟。
這篇文章假設你已經瞭解了部分知識了
1,你知道利用bximage.exe製作一個img檔案。
2,你知道如何寫彙編程式。
3,你知道如何利用nasw程式編譯你寫的彙編程式(nasw xxx.asm -o xxx.bin)。
4,你知道如何寫bochs的配置檔案(可以將dlxlinux裡面的配置檔案拿過來用)。
5,就是將你的編譯之後的xxx.bin寫入img檔案就可以了。
執行結果截圖:
MBRNew.asm
org 07c00h
mov ax, cs
mov ds, ax
mov es, ax
call DispStr
mov ax,0
mov es,ax
mov bx,8c00h
mov al,1
mov ch,0
mov cl,2
mov dl,0
mov dh,0
mov ah,2
int 13h
jmp 08c00h
DispStr:
mov ax, BootMessage
mov bp, ax
mov cx, 15
mov ax, 01301h
mov bx, 000ch
mov dl, 0
int 10h
ret
BootMessage:
db "Muhong new MBR!"
times 510-($-$$) db 0
dw 0xaa55
MBRSys.asm
org 08c00h
mov ax, cs
mov ds, ax
mov es, ax
call DispStr
jmp $
DispStr:
mov ax, BootMessage
mov bp, ax
mov cx, 18
mov ax, 01301h
mov bx, 000ch
mov dh, 1
mov dl, 0
int 10h
ret
BootMessage:
db "Muhong system MBR!"
MBRCopyToImg.cpp
// OS.cpp : 定義控制檯應用程式的入口點。
//
/************************************************************************/
/*
用於將nasw編譯之後的新的MBR寫入img第一個扇區。
以及將系統的MBR寫入img的第二個扇區。
*/
/************************************************************************/
#include "stdafx.h"
using namespace std;
char OS_IMG[] = "tinyos.img";
char MBR_NEW[] = "MBRNew.bin";
char MBR_SYS[] = "MBRSys.bin";
int write_mbrNew()
{
FILE *OSfp, *Mfp;
char buf[512]={0};
if((OSfp=fopen(OS_IMG,"r+"))==NULL){
cout<<"can not open file"<<endl;
return -1;
}
if((Mfp=fopen(MBR_NEW,"r"))==NULL){
cout<<"can not open file"<<endl;
return -1;
}
fseek(OSfp,0,SEEK_SET);
fseek(Mfp,0,SEEK_SET);
fread(buf,512,1,Mfp);
fwrite(buf,512,1,OSfp);
fclose(Mfp);
fclose(OSfp);
return 0;
}
int write_MBRSys()
{
FILE *OSfp, *Mfp;
int fileLen; //
char buf[512]={0};
if((OSfp=fopen(OS_IMG,"r+"))==NULL){
cout<<"can not open file"<<endl;
return -1;
}
if((Mfp=fopen(MBR_SYS,"r"))==NULL){
cout<<"can not open file"<<endl;
return -1;
}
fseek(OSfp,512,SEEK_SET);
fread(buf,1,512,Mfp);
fseek(Mfp,0, SEEK_END);
fileLen = ftell(Mfp);
fseek(Mfp,0, SEEK_SET);
fwrite(buf, 1, fileLen, OSfp);
system("pause");
fclose(Mfp);
fclose(OSfp);
}
int _tmain(int argc, _TCHAR* argv[])
{
write_mbrNew();
write_MBRSys();
return 0;
}