1 2 3 4 5 6 7 8 9 10 11 | ;;kernel.asm,内核汇编代码 bits 32 ;nasm伪指令 section .text ;代码段 global start ;全局变量 extern kmain ;kmain定义在C文件中 start: cli ;禁止中断 call kmain ;调用kmain函数 hlt ;终止CPU运行 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | //kernel.c文件 void kmain(void) { char *str = "Hello World!"; char *vidptr = (char*)0xb8000; //显存开始地址 unsigned int i = 0; unsigned int j = 0; //清空屏幕,共25行,每行80个字符,每个字符2字节 while(j < 80 * 25 * 2) { //空白字符 vidptr[j] = ' '; //属性字节:黑色背景,灰色前景 vidptr[j+1] = 0x07; j = j + 2; } j = 0; while(str[j] != '') { vidptr = str[j]; vidptr[i+1] = 0x07; ++j; i = i + 2; } return; } |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
Black | Blue | Green | Cyan | Red | Magenta | Brown | Light Grey |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Dark Grey | Light Blue | Light Green | Light Cyan | Light Red | Light Magenta | Light Brown | White |
1 2 3 4 5 6 7 8 9 10 | //link.ld文件 OUTPUT_FORMAT(elf32-i386) ENTRY(start) SECTIONS { . = 0x100000; .text : { *(.text) } .data : { *(.data) } .bss : { *(.bss) } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ;;kernel.asm,内核汇编代码 bits 32 ;nasm伪指令 section .text ;代码段 ;多重引导规范 align 4 dd 0x1BADB002 ;魔数 dd 0x00 ;标志 dd - (0x1BADB002 + 0x00) ;校验和 global start ;全局变量 extern kmain ;kmain定义在C文件中 start: cli ;禁止中断 call kmain ;调用kmain函数 hlt ;终止CPU运行 |
1 | nasm -f elf32 kernel.asm -o kasm.o |
1 | gcc -m32 -c kernel.c -o kc.o |
1 | ld -m elf_i386 -T link.ld -o kernel kasm.o kc.o |
1 2 3 | title myKernel root (hd0,0) kernel /boot/kernel-701 ro |
1 2 3 4 | menuentry 'kernel 701' { set root='hd0,msdos1' multiboot /boot/kernel-701 ro } |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |