CoolPotOS/include/multiboot.h
2024-04-11 22:53:15 +08:00

96 lines
3.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef INCLUDE_MULTIBOOT_H_
#define INCLUDE_MULTIBOOT_H_
#include <stdint.h>
/**
* 启动后在32位内核进入点机器状态如下
* 1. CS 指向基地址为 0x00000000限长为4G 1的代码段描述符。
* 2. DSSSESFS 和 GS 指向基地址为0x00000000限长为4G
* 1的数据段描述符。
* 3. A20 地址线已经打开。
* 4. 页机制被禁止。
* 5. 中断被禁止。
* 6. EAX = 0x2BADB002
* 7. 系统信息和启动信息块的线性地址保存在 EBX中相当于一个指针
* 以下即为这个信息块的结构
*/
typedef struct multiboot_t {
uint32_t flags; // Multiboot 的版本信息
/**
* 从 BIOS 获知的可用内存
*
* mem_lower和mem_upper分别指出了低端和高端内存的大小单位是K。
* 低端内存的首地址是0高端内存的首地址是1M。
* 低端内存的最大可能值是640K。
* 高端内存的最大可能值是最大值减去1M。但并不保证是这个值。
*/
uint32_t mem_lower;
uint32_t mem_upper;
uint32_t boot_device; // 指出引导程序从哪个BIOS磁盘设备载入的OS映像
uint32_t cmdline; // 内核命令行
uint32_t mods_count; // boot 模块列表
uint32_t mods_addr;
/**
* ELF 格式内核映像的section头表。
* 包括每项的大小、一共有几项以及作为名字索引的字符串表。
*/
uint32_t num;
uint32_t size;
uint32_t addr;
uint32_t shndx;
/**
* 以下两项指出保存由BIOS提供的内存分布的缓冲区的地址和长度
* mmap_addr是缓冲区的地址mmap_length是缓冲区的总大小
* 缓冲区由一个或者多个下面的大小/结构对 mmap_entry_t 组成
*/
uint32_t mmap_length;
uint32_t mmap_addr;
uint32_t drives_length; // 指出第一个驱动器结构的物理地址
uint32_t drives_addr; // 指出第一个驱动器这个结构的大小
uint32_t config_table; // ROM 配置表
uint32_t boot_loader_name; // boot loader 的名字
uint32_t apm_table; // APM 表
uint32_t vbe_control_info;
uint32_t vbe_mode_info;
uint16_t vbe_mode;
uint16_t vbe_interface_seg;
uint16_t vbe_interface_off;
uint16_t vbe_interface_len;
unsigned long long framebuffer_addr;
uint32_t framebuffer_pitch;
uint32_t framebuffer_width;
uint32_t framebuffer_height;
char framebuffer_bpp;
} __attribute__((packed)) multiboot_t;
/**
* size是相关结构的大小单位是字节它可能大于最小值20
* base_addr_low是启动地址的低32位base_addr_high是高32位启动地址总共有64位
* length_low是内存区域大小的低32位length_high是内存区域大小的高32位总共是64位
* type是相应地址区间的类型1代表可用RAM所有其它的值代表保留区域
*/
typedef struct mmap_entry_t {
uint32_t size; // 留意 size 是不含 size 自身变量的大小
uint32_t base_addr_low;
uint32_t base_addr_high;
uint32_t length_low;
uint32_t length_high;
uint32_t type;
} __attribute__((packed)) mmap_entry_t;
// 声明全局的 multiboot_t * 指针
// 内核未建立分页机制前暂存的指针
extern multiboot_t *mboot_ptr_tmp;
// 内核页表建立后的指针
extern multiboot_t *glb_mboot_ptr;
#endif // INCLUDE_MULTIBOOT_H_