几行汇编几行C:实现一个最简单的内核
- PC机的引导流程
- 只要安装了Ubuntu,GRUB引导程序就存在了,可以利用它来实现一个简单的操作系统,Hello OS
- Hello OS的引导过程:
[pc机加电]->[PC机BIOS固件]->{加载可引导设备中的GRUB}->[GRUB引导]->{加载硬盘分区中的Hello OS文件}->[Hello OS]
- BIOS固件是固化在PC主板上的ROM芯片中的,PC上电后的第一条指令就是BIOS固件中的,它负责检测和初始化CPU、内存及主板平台。
- 然后加载引导设备(大概率是硬盘)中的第一个扇区数据(GRUB引导程序),到0x7c00地址开始的内存空间。
- 从0x7c00处开始执行程序。
- Hello OS引导汇编代码
- 为什么不能直接用C
- C作为通用的高级语言,不能直接操作特定的硬件,而且C语言的函数调用、函数传参,都需要用栈。
- 使用汇编来处理好C语言的工作环境:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
;彭东 @ 2021.01.09 MBT_HDR_FLAGS EQU 0x00010003 MBT_HDR_MAGIC EQU 0x1BADB002 ;多引导协议头魔数 MBT_HDR2_MAGIC EQU 0xe85250d6 ;第二版多引导协议头魔数 global _start ;导出_start符号 extern main ;导入外部的main函数符号 [section .start.text] ;定义.start.text代码节 [bits 32] ;汇编成32位代码 _start: jmp _entry ALIGN 8 mbt_hdr: dd MBT_HDR_MAGIC dd MBT_HDR_FLAGS dd -(MBT_HDR_MAGIC+MBT_HDR_FLAGS) dd mbt_hdr dd _start dd 0 dd 0 dd _entry ;以上是GRUB所需要的头 ALIGN 8 mbt2_hdr: DD MBT_HDR2_MAGIC DD 0 DD mbt2_hdr_end - mbt2_hdr DD -(MBT_HDR2_MAGIC + 0 + (mbt2_hdr_end - mbt2_hdr)) DW 2, 0 DD 24 DD mbt2_hdr DD _start DD 0 DD 0 DW 3, 0 DD 12 DD _entry DD 0 DW 0, 0 DD 8 mbt2_hdr_end: ;以上是GRUB2所需要的头 ;包含两个头是为了同时兼容GRUB、GRUB2 ALIGN 8 _entry: ;关中断 cli ;关不可屏蔽中断 in al, 0x70 or al, 0x80 out 0x70,al ;重新加载GDT lgdt [GDT_PTR] jmp dword 0x8 :_32bits_mode _32bits_mode: ;下面初始化C语言可能会用到的寄存器 mov ax, 0x10 mov ds, ax mov ss, ax mov es, ax mov fs, ax mov gs, ax xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx xor edi,edi xor esi,esi xor ebp,ebp xor esp,esp ;初始化栈,C语言需要栈才能工作 mov esp,0x9000 ;调用C语言函数main call main ;让CPU停止执行指令 halt_step: halt jmp halt_step GDT_START: knull_dsc: dq 0 kcode_dsc: dq 0x00cf9e000000ffff kdata_dsc: dq 0x00cf92000000ffff k16cd_dsc: dq 0x00009e000000ffff k16da_dsc: dq 0x000092000000ffff GDT_END: GDT_PTR: GDTLEN dw GDT_END-GDT_START-1 GDTBASE dd GDT_START
- 为什么不能直接用C
- Hello OS的主函数
- 上面的汇编引导程序调用了main函数,而在其代码中并没有看到其函数体,而是从外部引入了一个符号。
- 代码:
- 控制计算机屏幕
- 显卡的分类:
- 集成在主板的叫集显
- 做在CPU芯片内的叫核显
- 独立存在通过PCIE接口连接的叫独显
- 我们要在屏幕上显示字符,就要编程操作显卡
- PC上的显卡,都支持一种叫VESA的标准,这种标准有两种工作模式:字符模式和图形模式。显卡们为了兼容这种标准,不得不自己提供一种叫做VGABIOS的固件程序。
- 显卡的字符模式的工作细节:
- 它把屏幕分成24行,每行80个字符,把这
24*80
个位置映射到以0xb8000地址开始的内存中,每两个字节对应一个字符,其中一个字节是字符的ASCII码,另一个字节为字符的颜色值。
- 它把屏幕分成24行,每行80个字符,把这
- 编码
- C语言字符串是以0结尾的,其字符编码通常是utf8,而utf8编码对ASCII字符是兼容的,即英文字符的ASCII编码和utf8编码是相等的。
- 显卡的分类:
本文发表于 0001-01-01,最后修改于 0001-01-01。
本站永久域名「 jiavvc.top 」,也可搜索「 后浪笔记一零二四 」找到我。