#include <bits.h>
#include <boot.h>
#include <page.h>
+#include <string.h>
#include <system.h>
struct boot_params boot_params __attribute__((aligned(32)));
void parse_cmdline(const char *cmdline);
-void init_boot_params(multiboot_info_t *p) {
- boot_params.cmdline = (char *)p->cmdline;
-
- parse_cmdline(boot_params.cmdline);
-
- // KB to Bytes
- // no need to concern about 64bit
- boot_params.mem_lower = p->mem_lower << 10;
- boot_params.mem_upper = p->mem_upper << 10;
-
- boot_params.boot_device = p->boot_device;
-
- multiboot_memory_map_t *mmap = (multiboot_memory_map_t *)pa2va(p->mmap_addr);
-
- unsigned int i;
- boot_params.e820map.map_cnt = p->mmap_length / sizeof(multiboot_memory_map_t);
- for (i = 0; i < boot_params.e820map.map_cnt; ++i, ++mmap) {
- boot_params.e820map.map[i].addr = mmap->addr;
- boot_params.e820map.map[i].size = mmap->len;
- boot_params.e820map.map[i].type = mmap->type;
- }
-}
-
void check_kernel(unsigned long addr, unsigned long magic) {
- if (magic != MULTIBOOT_BOOTLOADER_MAGIC) {
+ if (magic != MULTIBOOT2_BOOTLOADER_MAGIC) {
printk("Your boot loader does not support multiboot.\n");
- while (1)
- ;
+ while (1) {
+ }
}
+ unsigned long total_size = *((unsigned long *)addr);
+ struct multiboot_tag *tag = (struct multiboot_tag *)(addr + 8); // 跳过中间的 reserved 字段
+
+ printk("total size: %d tags: %x\n", total_size, tag);
+
+ struct multiboot_tag_basic_meminfo *mminfo = 0;
+ multiboot_memory_map_t *mmap = 0;
+ struct multiboot_tag_mmap *mmap_tag = 0;
+ struct multiboot_tag_bootdev *bootdev = 0;
+
+ boot_params.e820map.map_cnt = 0;
+
+ while (tag->type != MULTIBOOT_TAG_TYPE_END) {
+ switch (tag->type) {
+ case MULTIBOOT_TAG_TYPE_CMDLINE:
+ strlcpy(boot_params.cmdline, ((struct multiboot_tag_string *)tag)->string, sizeof(boot_params.cmdline));
+ parse_cmdline(boot_params.cmdline);
+ break;
+ case MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME:
+ strlcpy(boot_params.bootloader, ((struct multiboot_tag_string *)tag)->string,
+ sizeof(boot_params.bootloader));
+ break;
+ case MULTIBOOT_TAG_TYPE_BASIC_MEMINFO:
+ mminfo = (struct multiboot_tag_basic_meminfo *)tag;
+ // KB to Bytes
+ // no need to concern about 64bit
+ boot_params.mem_lower = mminfo->mem_lower << 10;
+ boot_params.mem_upper = mminfo->mem_upper << 10;
+ break;
+ case MULTIBOOT_TAG_TYPE_BOOTDEV:
+ bootdev = (struct multiboot_tag_bootdev *)tag;
+ boot_params.biosdev = bootdev->biosdev;
+ boot_params.partition = bootdev->slice;
+ boot_params.sub_partition = bootdev->part;
+ break;
+ case MULTIBOOT_TAG_TYPE_MMAP:
+ mmap_tag = (struct multiboot_tag_mmap *)tag;
+ mmap = mmap_tag->entries;
+ while (((multiboot_uint32_t)mmap) < (((multiboot_uint32_t)mmap_tag) + mmap_tag->size)) {
+ boot_params.e820map.map[boot_params.e820map.map_cnt].addr = mmap->addr;
+ boot_params.e820map.map[boot_params.e820map.map_cnt].size = mmap->len;
+ boot_params.e820map.map[boot_params.e820map.map_cnt].type = mmap->type;
+ boot_params.e820map.map_cnt++;
+ mmap = (multiboot_memory_map_t *)(((unsigned long)mmap) + mmap_tag->entry_size);
+ }
+ break;
+ default:
+ printk("tag %x size %x\n", tag->type, tag->size);
+ break;
+ }
+ // next tag
+ unsigned long size = (tag->size + 7) & (~7UL);
+ tag = (struct multiboot_tag *)(((unsigned long)tag) + size);
+ }
+#if 0
multiboot_info_t *mbi = (multiboot_info_t *)addr;
printk("multiboot info flag: %x\n", mbi->flags);
printk("frame buffer pitch %x bpp %x type %x\n", mbi->framebuffer_pitch, mbi->framebuffer_bpp,
mbi->framebuffer_type);
}
+ while (1)
+ ;
if ((mbi->flags & 0x47) != 0x47) {
printk("KERNEL NEED MORE INFORMATION\n");
}
init_boot_params(mbi);
+#endif
}
extern void *kernel_begin;
system.bootmem_bitmap_begin = &bootmem_bitmap_begin;
printk("kernel [%x, %x] bootmem bitmap: %x\n", system.kernel_begin, system.kernel_end, system.bootmem_bitmap_begin);
+
+ printk("bootloader: %s\n", boot_params.bootloader);
+ printk("boot device: bios dev %x partition %x sub partition %x\n", boot_params.biosdev, boot_params.partition,
+ boot_params.sub_partition);
+ printk("mem lower %uKB upper %uKB\n", boot_params.mem_lower >> 10, boot_params.mem_upper >> 10);
+ while (1)
+ ;
}
#pragma once
-#include "multiboot.h"
+#include "multiboot2.h"
-#define BOOT_INIT_PAGETBL_CNT 2
+#define BOOT_INIT_PAGETBL_CNT 2 // 8MB
#ifndef ASM
};
struct boot_params {
- char *cmdline;
- unsigned long boot_device;
- unsigned long root_device;
+ char cmdline[256];
+ char bootloader[64];
+
+ unsigned long root_device; // 从cmdline里解析出来的
unsigned long mem_lower; // in bytes
unsigned long mem_upper;
+ unsigned long biosdev;
+ unsigned long partition;
+ unsigned long sub_partition;
+
struct e820map e820map;
};
.extern root_task_entry
#define MULTIBOOT_STACK_SIZE 0x4000
-//#define MULTIBOOT_HEADER_FLAGS MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_VIDEO_MODE
-#define MULTIBOOT_HEADER_FLAGS MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO
.text
.code32
.align 32
kernel_entry:
main:
- # Reset EFLAGS
- pushl $0
- popf
+ cli
# Load GDT's Information To GDTR
lgdt GDTR-KRNLADDR
movl $(stack + MULTIBOOT_STACK_SIZE - KRNLADDR), %esp
+ # Reset EFLAGS
+ pushl $0
+ popf
+
# Save Multiboot Infomation...
pushl %eax
addl $KRNLADDR,%ebx
rep
stosl
- # Init Page Directory
+
+ # Length = BOOT_INIT_PAGETBL_CNT*4M
+ # [0x00000000, 0x00000000 + Length)
+ # [0xC0000000, 0xC0000000 + Length)
+ # 这两个线性地址空间都映射到同一片物理内存空间: [0x00000000, 0x00000000 + Length)
+
+
+ # 初始化页目录
+ # 设置低端线性地址空间的页表项
movl %ebx,%edi
movl $init_pgt-KRNLADDR,%eax
addl $3,%eax
addl $0x1000,%eax
loop 1b
+ # 设置内核线性地址空间的页表项
movl $kernel_virtual_addr_start,%eax
shrl $20,%eax
addl %ebx,%eax
addl $0x1000,%eax
loop 2b
- # Init Page Table
+ # 初始化页表
+ # 直接线性映射BOOT_INIT_PAGETBL_CNT*4M物理内存
movl $init_pgt-KRNLADDR,%ebx
movl %ebx,%edi
movl $(BOOT_INIT_PAGETBL_CNT*1024),%ecx
orl $0x80010000,%eax
movl %eax,%cr0
-
jmp 4f
4:
.comm stack, MULTIBOOT_STACK_SIZE
-.section .multiboot_header
-.align 32
- # Multiboot Header
- # Align 32 bits boundary
- .align 4
- # Magic
- .long MULTIBOOT_HEADER_MAGIC
- # Flags
- .long MULTIBOOT_HEADER_FLAGS
- # Checksum
- .long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
+
+.section .multiboot2_header
+# section align 64 bits boundary
+.align 64
+multiboot2_header_bgn:
+ # magic
+ .long MULTIBOOT2_HEADER_MAGIC
+ # ISA: i386
+ .long MULTIBOOT_ARCHITECTURE_I386
+ # header length
+ .long multiboot2_header_end - multiboot2_header_bgn
+ # checksum
+ .long -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_I386 + (multiboot2_header_end - multiboot2_header_bgn))
+
+ // .align 8
+ // .framebuffer_tag_bgn:
+ // .short MULTIBOOT_HEADER_TAG_FRAMEBUFFER
+ // .short MULTIBOOT_HEADER_TAG_OPTIONAL
+ // .long .framebuffer_tag_end - .framebuffer_tag_bgn
+ // .long 1280
+ // .long 800
+ // .long 32
+ // .framebuffer_tag_end:
+
+ .align 8
+ .multiboot2_tag_end:
+ .short MULTIBOOT_HEADER_TAG_END
+ .short 0
+ .long 8
+multiboot2_header_end:
\ No newline at end of file
+++ /dev/null
-/* multiboot.h - Multiboot header file. */
-/* Copyright (C) 1999,2003,2007,2008,2009,2010 Free Software Foundation, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ANY
- * DEVELOPER OR DISTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
- * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#ifndef MULTIBOOT_HEADER
-#define MULTIBOOT_HEADER 1
-
-/* How many bytes from the start of the file we search for the header. */
-#define MULTIBOOT_SEARCH 8192
-#define MULTIBOOT_HEADER_ALIGN 4
-
-/* The magic field should contain this. */
-#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
-
-/* This should be in %eax. */
-#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002
-
-/* Alignment of multiboot modules. */
-#define MULTIBOOT_MOD_ALIGN 0x00001000
-
-/* Alignment of the multiboot info structure. */
-#define MULTIBOOT_INFO_ALIGN 0x00000004
-
-/* Flags set in the ’flags’ member of the multiboot header. */
-
-/* Align all boot modules on i386 page (4KB) boundaries. */
-#define MULTIBOOT_PAGE_ALIGN 0x00000001
-
-/* Must pass memory information to OS. */
-#define MULTIBOOT_MEMORY_INFO 0x00000002
-
-/* Must pass video information to OS. */
-#define MULTIBOOT_VIDEO_MODE 0x00000004
-
-/* This flag indicates the use of the address fields in the header. */
-#define MULTIBOOT_AOUT_KLUDGE 0x00010000
-
-/* Flags to be set in the ’flags’ member of the multiboot info structure. */
-
-/* is there basic lower/upper memory information? */
-#define MULTIBOOT_INFO_MEMORY 0x00000001
-/* is there a boot device set? */
-#define MULTIBOOT_INFO_BOOTDEV 0x00000002
-/* is the command-line defined? */
-#define MULTIBOOT_INFO_CMDLINE 0x00000004
-/* are there modules to do something with? */
-#define MULTIBOOT_INFO_MODS 0x00000008
-
-/* These next two are mutually exclusive */
-
-/* is there a symbol table loaded? */
-#define MULTIBOOT_INFO_AOUT_SYMS 0x00000010
-/* is there an ELF section header table? */
-#define MULTIBOOT_INFO_ELF_SHDR 0X00000020
-
-/* is there a full memory map? */
-#define MULTIBOOT_INFO_MEM_MAP 0x00000040
-
-/* Is there drive info? */
-#define MULTIBOOT_INFO_DRIVE_INFO 0x00000080
-
-/* Is there a config table? */
-#define MULTIBOOT_INFO_CONFIG_TABLE 0x00000100
-
-/* Is there a boot loader name? */
-#define MULTIBOOT_INFO_BOOT_LOADER_NAME 0x00000200
-
-/* Is there a APM table? */
-#define MULTIBOOT_INFO_APM_TABLE 0x00000400
-
-/* Is there video information? */
-#define MULTIBOOT_INFO_VBE_INFO 0x00000800
-#define MULTIBOOT_INFO_FRAMEBUFFER_INFO 0x00001000
-
-#ifndef ASM_FILE
-
-typedef unsigned char multiboot_uint8_t;
-typedef unsigned short multiboot_uint16_t;
-typedef unsigned int multiboot_uint32_t;
-typedef unsigned long long multiboot_uint64_t;
-
-struct multiboot_header {
- /* Must be MULTIBOOT_MAGIC - see above. */
- multiboot_uint32_t magic;
-
- /* Feature flags. */
- multiboot_uint32_t flags;
-
- /* The above fields plus this one must equal 0 mod 2^32. */
- multiboot_uint32_t checksum;
-
- /* These are only valid if MULTIBOOT_AOUT_KLUDGE is set. */
- multiboot_uint32_t header_addr;
- multiboot_uint32_t load_addr;
- multiboot_uint32_t load_end_addr;
- multiboot_uint32_t bss_end_addr;
- multiboot_uint32_t entry_addr;
-
- /* These are only valid if MULTIBOOT_VIDEO_MODE is set. */
- multiboot_uint32_t mode_type;
- multiboot_uint32_t width;
- multiboot_uint32_t height;
- multiboot_uint32_t depth;
-};
-
-/* The symbol table for a.out. */
-struct multiboot_aout_symbol_table {
- multiboot_uint32_t tabsize;
- multiboot_uint32_t strsize;
- multiboot_uint32_t addr;
- multiboot_uint32_t reserved;
-};
-typedef struct multiboot_aout_symbol_table multiboot_aout_symbol_table_t;
-
-/* The section header table for ELF. */
-struct multiboot_elf_section_header_table {
- multiboot_uint32_t num;
- multiboot_uint32_t size;
- multiboot_uint32_t addr;
- multiboot_uint32_t shndx;
-};
-typedef struct multiboot_elf_section_header_table multiboot_elf_section_header_table_t;
-
-struct multiboot_info {
- /* Multiboot info version number */
- multiboot_uint32_t flags;
-
- /* Available memory from BIOS */
- multiboot_uint32_t mem_lower;
- multiboot_uint32_t mem_upper;
-
- /* "root" partition */
- multiboot_uint32_t boot_device;
-
- /* Kernel command line */
- multiboot_uint32_t cmdline;
-
- /* Boot-Module list */
- multiboot_uint32_t mods_count;
- multiboot_uint32_t mods_addr;
-
- union {
- multiboot_aout_symbol_table_t aout_sym;
- multiboot_elf_section_header_table_t elf_sec;
- } u;
-
- /* Memory Mapping buffer */
- multiboot_uint32_t mmap_length;
- multiboot_uint32_t mmap_addr;
-
- /* Drive Info buffer */
- multiboot_uint32_t drives_length;
- multiboot_uint32_t drives_addr;
-
- /* ROM configuration table */
- multiboot_uint32_t config_table;
-
- /* Boot Loader Name */
- multiboot_uint32_t boot_loader_name;
-
- /* APM table */
- multiboot_uint32_t apm_table;
-
- /* Video */
- multiboot_uint32_t vbe_control_info;
- multiboot_uint32_t vbe_mode_info;
- multiboot_uint16_t vbe_mode;
- multiboot_uint16_t vbe_interface_seg;
- multiboot_uint16_t vbe_interface_off;
- multiboot_uint16_t vbe_interface_len;
-
- multiboot_uint64_t framebuffer_addr;
- multiboot_uint32_t framebuffer_pitch;
- multiboot_uint32_t framebuffer_width;
- multiboot_uint32_t framebuffer_height;
- multiboot_uint8_t framebuffer_bpp;
-#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0
-#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1
-#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2
- multiboot_uint8_t framebuffer_type;
- union {
- struct {
- multiboot_uint32_t framebuffer_palette_addr;
- multiboot_uint16_t framebuffer_palette_num_colors;
- };
- struct {
- multiboot_uint8_t framebuffer_red_field_position;
- multiboot_uint8_t framebuffer_red_mask_size;
- multiboot_uint8_t framebuffer_green_field_position;
- multiboot_uint8_t framebuffer_green_mask_size;
- multiboot_uint8_t framebuffer_blue_field_position;
- multiboot_uint8_t framebuffer_blue_mask_size;
- };
- };
-};
-typedef struct multiboot_info multiboot_info_t;
-
-struct multiboot_color {
- multiboot_uint8_t red;
- multiboot_uint8_t green;
- multiboot_uint8_t blue;
-};
-
-struct multiboot_mmap_entry {
- multiboot_uint32_t size;
- multiboot_uint64_t addr;
- multiboot_uint64_t len;
-#define MULTIBOOT_MEMORY_AVAILABLE 1
-#define MULTIBOOT_MEMORY_RESERVED 2
-#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3
-#define MULTIBOOT_MEMORY_NVS 4
-#define MULTIBOOT_MEMORY_BADRAM 5
- multiboot_uint32_t type;
-} __attribute__((packed));
-typedef struct multiboot_mmap_entry multiboot_memory_map_t;
-
-struct multiboot_mod_list {
- /* the memory used goes from bytes ’mod_start’ to ’mod_end-1’ inclusive */
- multiboot_uint32_t mod_start;
- multiboot_uint32_t mod_end;
-
- /* Module command line */
- multiboot_uint32_t cmdline;
-
- /* padding to take it to 16 bytes (must be zero) */
- multiboot_uint32_t pad;
-};
-typedef struct multiboot_mod_list multiboot_module_t;
-
-/* APM BIOS info. */
-struct multiboot_apm_info {
- multiboot_uint16_t version;
- multiboot_uint16_t cseg;
- multiboot_uint32_t offset;
- multiboot_uint16_t cseg_16;
- multiboot_uint16_t dseg;
- multiboot_uint16_t flags;
- multiboot_uint16_t cseg_len;
- multiboot_uint16_t cseg_16_len;
- multiboot_uint16_t dseg_len;
-};
-
-#endif /* ! ASM_FILE */
-
-#endif /* ! MULTIBOOT_HEADER */
\ No newline at end of file
--- /dev/null
+/* multiboot2.h - Multiboot 2 header file. */
+/* Copyright (C) 1999,2003,2007,2008,2009,2010 Free Software Foundation, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ANY
+ * DEVELOPER OR DISTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+ * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef MULTIBOOT_HEADER
+#define MULTIBOOT_HEADER 1
+
+/* How many bytes from the start of the file we search for the header. */
+#define MULTIBOOT_SEARCH 32768
+#define MULTIBOOT_HEADER_ALIGN 8
+
+/* The magic field should contain this. */
+#define MULTIBOOT2_HEADER_MAGIC 0xe85250d6
+
+/* This should be in %eax. */
+#define MULTIBOOT2_BOOTLOADER_MAGIC 0x36d76289
+
+/* Alignment of multiboot modules. */
+#define MULTIBOOT_MOD_ALIGN 0x00001000
+
+/* Alignment of the multiboot info structure. */
+#define MULTIBOOT_INFO_ALIGN 0x00000008
+
+/* Flags set in the ’flags’ member of the multiboot header. */
+
+#define MULTIBOOT_TAG_ALIGN 8
+#define MULTIBOOT_TAG_TYPE_END 0
+#define MULTIBOOT_TAG_TYPE_CMDLINE 1
+#define MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME 2
+#define MULTIBOOT_TAG_TYPE_MODULE 3
+#define MULTIBOOT_TAG_TYPE_BASIC_MEMINFO 4
+#define MULTIBOOT_TAG_TYPE_BOOTDEV 5
+#define MULTIBOOT_TAG_TYPE_MMAP 6
+#define MULTIBOOT_TAG_TYPE_VBE 7
+#define MULTIBOOT_TAG_TYPE_FRAMEBUFFER 8
+#define MULTIBOOT_TAG_TYPE_ELF_SECTIONS 9
+#define MULTIBOOT_TAG_TYPE_APM 10
+#define MULTIBOOT_TAG_TYPE_EFI32 11
+#define MULTIBOOT_TAG_TYPE_EFI64 12
+#define MULTIBOOT_TAG_TYPE_SMBIOS 13
+#define MULTIBOOT_TAG_TYPE_ACPI_OLD 14
+#define MULTIBOOT_TAG_TYPE_ACPI_NEW 15
+#define MULTIBOOT_TAG_TYPE_NETWORK 16
+#define MULTIBOOT_TAG_TYPE_EFI_MMAP 17
+#define MULTIBOOT_TAG_TYPE_EFI_BS 18
+#define MULTIBOOT_TAG_TYPE_EFI32_IH 19
+#define MULTIBOOT_TAG_TYPE_EFI64_IH 20
+#define MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR 21
+
+#define MULTIBOOT_HEADER_TAG_END 0
+#define MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST 1
+#define MULTIBOOT_HEADER_TAG_ADDRESS 2
+#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS 3
+#define MULTIBOOT_HEADER_TAG_CONSOLE_FLAGS 4
+#define MULTIBOOT_HEADER_TAG_FRAMEBUFFER 5
+#define MULTIBOOT_HEADER_TAG_MODULE_ALIGN 6
+#define MULTIBOOT_HEADER_TAG_EFI_BS 7
+#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI32 8
+#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI64 9
+#define MULTIBOOT_HEADER_TAG_RELOCATABLE 10
+
+#define MULTIBOOT_ARCHITECTURE_I386 0
+#define MULTIBOOT_ARCHITECTURE_MIPS32 4
+#define MULTIBOOT_HEADER_TAG_OPTIONAL 1
+
+#define MULTIBOOT_LOAD_PREFERENCE_NONE 0
+#define MULTIBOOT_LOAD_PREFERENCE_LOW 1
+#define MULTIBOOT_LOAD_PREFERENCE_HIGH 2
+
+#define MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED 1
+#define MULTIBOOT_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED 2
+
+#ifndef ASM_FILE
+
+typedef unsigned char multiboot_uint8_t;
+typedef unsigned short multiboot_uint16_t;
+typedef unsigned int multiboot_uint32_t;
+typedef unsigned long long multiboot_uint64_t;
+
+struct multiboot_header {
+ /* Must be MULTIBOOT_MAGIC - see above. */
+ multiboot_uint32_t magic;
+
+ /* ISA */
+ multiboot_uint32_t architecture;
+
+ /* Total header length. */
+ multiboot_uint32_t header_length;
+
+ /* The above fields plus this one must equal 0 mod 2^32. */
+ multiboot_uint32_t checksum;
+};
+
+struct multiboot_header_tag {
+ multiboot_uint16_t type;
+ multiboot_uint16_t flags;
+ multiboot_uint32_t size;
+};
+
+struct multiboot_header_tag_information_request {
+ multiboot_uint16_t type;
+ multiboot_uint16_t flags;
+ multiboot_uint32_t size;
+ multiboot_uint32_t requests[0];
+};
+
+struct multiboot_header_tag_address {
+ multiboot_uint16_t type;
+ multiboot_uint16_t flags;
+ multiboot_uint32_t size;
+ multiboot_uint32_t header_addr;
+ multiboot_uint32_t load_addr;
+ multiboot_uint32_t load_end_addr;
+ multiboot_uint32_t bss_end_addr;
+};
+
+struct multiboot_header_tag_entry_address {
+ multiboot_uint16_t type;
+ multiboot_uint16_t flags;
+ multiboot_uint32_t size;
+ multiboot_uint32_t entry_addr;
+};
+
+struct multiboot_header_tag_console_flags {
+ multiboot_uint16_t type;
+ multiboot_uint16_t flags;
+ multiboot_uint32_t size;
+ multiboot_uint32_t console_flags;
+};
+
+struct multiboot_header_tag_framebuffer {
+ multiboot_uint16_t type;
+ multiboot_uint16_t flags;
+ multiboot_uint32_t size;
+ multiboot_uint32_t width;
+ multiboot_uint32_t height;
+ multiboot_uint32_t depth;
+};
+
+struct multiboot_header_tag_module_align {
+ multiboot_uint16_t type;
+ multiboot_uint16_t flags;
+ multiboot_uint32_t size;
+};
+
+struct multiboot_header_tag_relocatable {
+ multiboot_uint16_t type;
+ multiboot_uint16_t flags;
+ multiboot_uint32_t size;
+ multiboot_uint32_t min_addr;
+ multiboot_uint32_t max_addr;
+ multiboot_uint32_t align;
+ multiboot_uint32_t preference;
+};
+
+struct multiboot_color {
+ multiboot_uint8_t red;
+ multiboot_uint8_t green;
+ multiboot_uint8_t blue;
+};
+
+struct multiboot_mmap_entry {
+ multiboot_uint64_t addr;
+ multiboot_uint64_t len;
+#define MULTIBOOT_MEMORY_AVAILABLE 1
+#define MULTIBOOT_MEMORY_RESERVED 2
+#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3
+#define MULTIBOOT_MEMORY_NVS 4
+#define MULTIBOOT_MEMORY_BADRAM 5
+ multiboot_uint32_t type;
+ multiboot_uint32_t zero;
+};
+typedef struct multiboot_mmap_entry multiboot_memory_map_t;
+
+struct multiboot_tag {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+};
+
+struct multiboot_tag_string {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+ char string[0];
+};
+
+struct multiboot_tag_module {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+ multiboot_uint32_t mod_start;
+ multiboot_uint32_t mod_end;
+ char cmdline[0];
+};
+
+struct multiboot_tag_basic_meminfo {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+ multiboot_uint32_t mem_lower;
+ multiboot_uint32_t mem_upper;
+};
+
+struct multiboot_tag_bootdev {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+ multiboot_uint32_t biosdev;
+ multiboot_uint32_t slice;
+ multiboot_uint32_t part;
+};
+
+struct multiboot_tag_mmap {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+ multiboot_uint32_t entry_size;
+ multiboot_uint32_t entry_version;
+ struct multiboot_mmap_entry entries[0];
+};
+
+struct multiboot_vbe_info_block {
+ multiboot_uint8_t external_specification[512];
+};
+
+struct multiboot_vbe_mode_info_block {
+ multiboot_uint8_t external_specification[256];
+};
+
+struct multiboot_tag_vbe {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+
+ multiboot_uint16_t vbe_mode;
+ multiboot_uint16_t vbe_interface_seg;
+ multiboot_uint16_t vbe_interface_off;
+ multiboot_uint16_t vbe_interface_len;
+
+ struct multiboot_vbe_info_block vbe_control_info;
+ struct multiboot_vbe_mode_info_block vbe_mode_info;
+};
+
+struct multiboot_tag_framebuffer_common {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+
+ multiboot_uint64_t framebuffer_addr;
+ multiboot_uint32_t framebuffer_pitch;
+ multiboot_uint32_t framebuffer_width;
+ multiboot_uint32_t framebuffer_height;
+ multiboot_uint8_t framebuffer_bpp;
+#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0
+#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1
+#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2
+ multiboot_uint8_t framebuffer_type;
+ multiboot_uint16_t reserved;
+};
+
+struct multiboot_tag_framebuffer {
+ struct multiboot_tag_framebuffer_common common;
+
+ union {
+ struct {
+ multiboot_uint16_t framebuffer_palette_num_colors;
+ struct multiboot_color framebuffer_palette[0];
+ };
+ struct {
+ multiboot_uint8_t framebuffer_red_field_position;
+ multiboot_uint8_t framebuffer_red_mask_size;
+ multiboot_uint8_t framebuffer_green_field_position;
+ multiboot_uint8_t framebuffer_green_mask_size;
+ multiboot_uint8_t framebuffer_blue_field_position;
+ multiboot_uint8_t framebuffer_blue_mask_size;
+ };
+ };
+};
+
+struct multiboot_tag_elf_sections {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+ multiboot_uint32_t num;
+ multiboot_uint32_t entsize;
+ multiboot_uint32_t shndx;
+ char sections[0];
+};
+
+struct multiboot_tag_apm {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+ multiboot_uint16_t version;
+ multiboot_uint16_t cseg;
+ multiboot_uint32_t offset;
+ multiboot_uint16_t cseg_16;
+ multiboot_uint16_t dseg;
+ multiboot_uint16_t flags;
+ multiboot_uint16_t cseg_len;
+ multiboot_uint16_t cseg_16_len;
+ multiboot_uint16_t dseg_len;
+};
+
+struct multiboot_tag_efi32 {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+ multiboot_uint32_t pointer;
+};
+
+struct multiboot_tag_efi64 {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+ multiboot_uint64_t pointer;
+};
+
+struct multiboot_tag_smbios {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+ multiboot_uint8_t major;
+ multiboot_uint8_t minor;
+ multiboot_uint8_t reserved[6];
+ multiboot_uint8_t tables[0];
+};
+
+struct multiboot_tag_old_acpi {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+ multiboot_uint8_t rsdp[0];
+};
+
+struct multiboot_tag_new_acpi {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+ multiboot_uint8_t rsdp[0];
+};
+
+struct multiboot_tag_network {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+ multiboot_uint8_t dhcpack[0];
+};
+
+struct multiboot_tag_efi_mmap {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+ multiboot_uint32_t descr_size;
+ multiboot_uint32_t descr_vers;
+ multiboot_uint8_t efi_mmap[0];
+};
+
+struct multiboot_tag_efi32_ih {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+ multiboot_uint32_t pointer;
+};
+
+struct multiboot_tag_efi64_ih {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+ multiboot_uint64_t pointer;
+};
+
+struct multiboot_tag_load_base_addr {
+ multiboot_uint32_t type;
+ multiboot_uint32_t size;
+ multiboot_uint32_t load_base_addr;
+};
+
+#endif /* ! ASM_FILE */
+
+#endif /* ! MULTIBOOT_HEADER */
\ No newline at end of file
#include "types.h"
char *strcpy(char *dest, const char *src);
+char *strncpy(char *dst, const char *src, size_t len);
+size_t strlcpy(char *dst, const char *src, size_t size);
size_t strlen(const char *str);
int strcmp(const char *a, const char *b);
int strncmp(const char *a, const char *b, size_t count);
return p;
}
+char *strncpy(char *dst, const char *src, size_t len) {
+ for (size_t i = 0; i < len; i++) {
+ dst[i] = src[i];
+ if (src[i] == 0) {
+ break;
+ }
+ }
+
+ return dst;
+}
+
+size_t strlcpy(char *dst, const char *src, size_t size) {
+ size_t i = 0;
+
+ if (size == 0) {
+ return 0;
+ }
+
+ for (i = 0; i < size - 1; i++) {
+ dst[i] = src[i];
+ if (src[i] == 0) {
+ break;
+ }
+ }
+
+ dst[i] = 0;
+
+ return i;
+}
+
size_t strlen(const char *str) {
int i = 0;
while (*str++) i++;
cp scripts/grub.cfg /mnt/boot/grub2/
md5sum /mnt/boot/Kernel
+md5sum /mnt/boot/grub2/grub.cfg
mkdir -p /mnt/bin/
cp ./bin/shell /mnt/bin/
menuentry 'Kernel' --class os {
#insmod ext2
set root='(hd0,msdos1)'
- multiboot /boot/Kernel root=hda0 delay=2
- #multiboot2 /boot/Kernel root=hda0 delay=2
+ multiboot2 /boot/Kernel root=hda0 delay=2
boot
}
code = .;
phys_addr = . - kernel_virtual_addr_start;
boot/multiboot.S.o(.text)
- *(.multiboot_header)
+ *(.multiboot2_header)
*(.text)
*(.ring3.text);
*(.sysexit) /* last */