อันแรกต้องติดตั้ง NASM
sudo apt-get install nasm
loader.asm
==========
global loader
extern dmain
MODULEALIGN equ 1<<0
MEMINFO equ 1<<1
FLAGS equ MODULEALIGN | MEMINFO
MAGIC equ 0x1BADB002
CHECKSUM equ -(MAGIC + FLAGS)
section .text
align 4
MultiBootHeader:
dd MAGIC
dd FLAGS
dd CHECKSUM
STACKSIZE equ 0x4000
loader:
mov esp, stack+STACKSIZE
push eax
push ebx
call dmain
cli
hang:
hlt
jmp hang
section .bss
align 4
stack:
resb STACKSIZE
===============
จะนั้นใช้เทอร์มินัล มาโพรเดอร์ที่เก็บไฟล์
nasm -f elf -o loader.o loader.asm
สร้างไฟล์ kernel.c
โค้ด
==============
void dmain(void*mbd,unsigned int magic)
{
if(magic != 0x2BADB002)
{
clearscreen();
print("Error: Invalid magic number!",0x04);
}
else
{
clearscreen();
print("Hello World!",0x07);//04,07คือรหัสสีบนDOS
}
}
void print(char*message,int color)
{
char* mem = (char*)(0xb8000);
while(*message != 0)
{
*mem = *message;
mem++;
message++;
*mem = (char*)color;
mem++;
}
}
void clearscreen(void)
{
char* mem = (char*)(0xb8000);
while(*mem != 0)
{
*mem = 0;
mem++;
}
}
=================
จะนั้นใช้เทอร์มินัล มาโพรเดอร์ที่เก็บไฟล์
gcc -o kernel.o -c kernel.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
**
gcc -o kernel.o -c kernel.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs -m32
ต่อมาสร้างไฟล์ linker.ld
โคัด:
=================
ENTRY(loader)
SECTIONS{
. =0x00100000;
.text : {
*(.text)
}
.rodata ALIGN(0x1000):{
*(.data)
}
.bss : {
sbss = .;
*(COMMON)
*(.bss)
ebss = .;
}
}
===================
จะนั้นใช้เทอร์มินัล มาโพรเดอร์ที่เก็บไฟล์
ld -T linker.ld -o kernel.bin loader.o kernel.o
กรณีใช้ amd64
ld -m elf_i386 -T linker.ld -o kernel.bin loader.o kernel.o
จากนั้นติดตั้ง qemu
sudo apt-get install qemu
หลังจากนั้นลองรันด้วยคำสั่ง
qemu -kernel kernel.bin
sudo apt-get install nasm
loader.asm
==========
global loader
extern dmain
MODULEALIGN equ 1<<0
MEMINFO equ 1<<1
FLAGS equ MODULEALIGN | MEMINFO
MAGIC equ 0x1BADB002
CHECKSUM equ -(MAGIC + FLAGS)
section .text
align 4
MultiBootHeader:
dd MAGIC
dd FLAGS
dd CHECKSUM
STACKSIZE equ 0x4000
loader:
mov esp, stack+STACKSIZE
push eax
push ebx
call dmain
cli
hang:
hlt
jmp hang
section .bss
align 4
stack:
resb STACKSIZE
===============
จะนั้นใช้เทอร์มินัล มาโพรเดอร์ที่เก็บไฟล์
nasm -f elf -o loader.o loader.asm
สร้างไฟล์ kernel.c
โค้ด
==============
void dmain(void*mbd,unsigned int magic)
{
if(magic != 0x2BADB002)
{
clearscreen();
print("Error: Invalid magic number!",0x04);
}
else
{
clearscreen();
print("Hello World!",0x07);//04,07คือรหัสสีบนDOS
}
}
void print(char*message,int color)
{
char* mem = (char*)(0xb8000);
while(*message != 0)
{
*mem = *message;
mem++;
message++;
*mem = (char*)color;
mem++;
}
}
void clearscreen(void)
{
char* mem = (char*)(0xb8000);
while(*mem != 0)
{
*mem = 0;
mem++;
}
}
=================
จะนั้นใช้เทอร์มินัล มาโพรเดอร์ที่เก็บไฟล์
gcc -o kernel.o -c kernel.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs
**
gcc -o kernel.o -c kernel.c -Wall -Wextra -nostdlib -nostartfiles -nodefaultlibs -m32
ต่อมาสร้างไฟล์ linker.ld
โคัด:
=================
ENTRY(loader)
SECTIONS{
. =0x00100000;
.text : {
*(.text)
}
.rodata ALIGN(0x1000):{
*(.data)
}
.bss : {
sbss = .;
*(COMMON)
*(.bss)
ebss = .;
}
}
===================
จะนั้นใช้เทอร์มินัล มาโพรเดอร์ที่เก็บไฟล์
ld -T linker.ld -o kernel.bin loader.o kernel.o
กรณีใช้ amd64
ld -m elf_i386 -T linker.ld -o kernel.bin loader.o kernel.o
จากนั้นติดตั้ง qemu
sudo apt-get install qemu
หลังจากนั้นลองรันด้วยคำสั่ง
qemu -kernel kernel.bin
ความคิดเห็น
แสดงความคิดเห็น