前面已经分析过了boot.asm和loader.asm的代码,有Text版本和VGA版本。
Text版本的Kernel书里有,直接看就可以。
本此学习时VGA版本的Kernel,因为书里没有,在网上没有看到,自己整合了两本书的内容。
由于没有找到支持Windows的支持elf_i386的ld命令。所以本Kernel.bin是在Linux下编译的。
boot.asm
[BITS 32] ; 以32位编译
section .text
jmp start
global start
global io_hlt
global write_mem8
[EXTERN kernel_main] ; 内核入口函数, EXTERN表明此符号在外部定义
start:
cli ; 禁用中断
call kernel_main ; 调用内核入口函数
jmp $ ; 无限循环
io_hlt: ; void io_hlt(void);
HLT
RET
write_mem8: ; void write_mem8(int addr, int data);
MOV ECX,[ESP+4] ; [ESP+4]=> C语言传过来的第一个参数
MOV AL,[ESP+8] ; [ESP+8]=> C语言传过来的第二个参数
MOV [ECX],AL
RET
kernel.c
void io_hlt(void);
void write_mem8(int addr, int data);
int kernel_main()
{
int i;
for (i = 0xa0000; i <= 0xaffff; i++) {
;write_mem8(i, 15); /* MOV BYTE [i],15 */
write_mem8(i, i & 0x0f); /* MOV BYTE [i],15 */
}
for (;;) {
io_hlt();
}
}
link.ld
/***************************
* 文件名: link.ld
***************************/
ENTRY(start)
SECTIONS
{
. = 0x100000;
.text :
{
*(.text)
. = ALIGN(4096);
}
.data :
{
*(.data)
*(.rodata)
. = ALIGN(4096);
}
}
nasm -f elf boot.asm -o boot.o
gcc -m32 -c -o kernel.o kernel.c
ld -Ttext 0x30400 -T link.ld -m elf_i386 -nostdlib boot.o kernel.o -o kernel.bin
制作驱动文件
把boot.bin
loader.bin
kerlen.bin导入到img文件中
并把boot.bin设置为引导文件
执行
学后感:
32位保护模式下的Text或VGA操作都有了,剩下的就是去理解各种的文件格式,解析文件格式,显示到自己的操作系统上。
包括文件系统格式(FAT12,FAT32,NTFS。。。。),应用程序文件格式(Linux下是ELF,Window是PE)、以及其他二进制文件格式(BMG、JPG。。。。)等等等等