CoolPotOS/include/multiboot.h

88 lines
3.0 KiB
C
Raw Normal View History

2024-04-11 22:53:15 +08:00
#ifndef INCLUDE_MULTIBOOT_H_
#define INCLUDE_MULTIBOOT_H_
#include <stdint.h>
/**
* 32
* 1. CS 0x000000004G 1
* 2. DSSSESFS GS 0x000000004G
* 1
* 3. A20 线
* 4.
* 5.
* 6. EAX = 0x2BADB002
* 7. 线 EBX中
*
*/
typedef struct multiboot_t {
uint32_t flags; // Multiboot 的版本信息
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是相应地址区间的类型1RAM
*/
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_