]> Zhao Yanbai Git Server - kernel.git/commitdiff
upgrade multiboot to multiboot2
authoracevest <zhaoyanbai@126.com>
Sat, 6 Nov 2021 03:56:38 +0000 (11:56 +0800)
committeracevest <zhaoyanbai@126.com>
Sat, 6 Nov 2021 05:40:11 +0000 (13:40 +0800)
boot/boot.c
boot/boot.h
boot/multiboot.S
boot/multiboot.h [deleted file]
boot/multiboot2.h [new file with mode: 0644]
include/string.h
lib/string.c
scripts/docker_copy.sh
scripts/grub.cfg
scripts/link.ld

index e1f491d7424df3a2a93910b0f82b2afd60fac7af..18683ddbe246fcdb8d28021767981e01c3440ddf 100644 (file)
 #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);
@@ -73,6 +106,8 @@ void check_kernel(unsigned long addr, unsigned long magic) {
         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");
@@ -81,6 +116,7 @@ void check_kernel(unsigned long addr, unsigned long magic) {
     }
 
     init_boot_params(mbi);
+#endif
 }
 
 extern void *kernel_begin;
@@ -92,4 +128,11 @@ void init_system_info() {
     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)
+        ;
 }
index ee2a068faa7c0a1d425888b2751358debdcafc79..03e3109bb52e42cafd96e6761107ad48e680c946 100644 (file)
@@ -9,9 +9,9 @@
 
 #pragma once
 
-#include "multiboot.h"
+#include "multiboot2.h"
 
-#define BOOT_INIT_PAGETBL_CNT 2
+#define BOOT_INIT_PAGETBL_CNT 2  // 8MB
 
 #ifndef ASM
 
@@ -35,13 +35,18 @@ struct e820map {
 };
 
 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;
 };
 
index 992b86b65d6d2af5ada44b9e9f8681041926360b..5a914d22d9f6834d31be17dc6c3b6ff88e33aa3c 100644 (file)
 .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
@@ -54,6 +50,10 @@ main:
 
     movl    $(stack + MULTIBOOT_STACK_SIZE - KRNLADDR), %esp
 
+    # Reset EFLAGS
+    pushl   $0
+    popf
+
     # Save Multiboot Infomation...
     pushl   %eax
     addl    $KRNLADDR,%ebx
@@ -69,7 +69,15 @@ main:
     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
@@ -79,6 +87,7 @@ main:
     addl    $0x1000,%eax
     loop    1b
 
+    # 设置内核线性地址空间的页表项
     movl    $kernel_virtual_addr_start,%eax
     shrl    $20,%eax
     addl    %ebx,%eax
@@ -92,7 +101,8 @@ main:
     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
@@ -111,7 +121,6 @@ main:
     orl     $0x80010000,%eax
     movl    %eax,%cr0
 
-
     jmp     4f
 4:
 
@@ -144,14 +153,33 @@ GDTR:
     .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
diff --git a/boot/multiboot.h b/boot/multiboot.h
deleted file mode 100644 (file)
index 0aec03f..0000000
+++ /dev/null
@@ -1,262 +0,0 @@
-/* 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
diff --git a/boot/multiboot2.h b/boot/multiboot2.h
new file mode 100644 (file)
index 0000000..d0f36d3
--- /dev/null
@@ -0,0 +1,380 @@
+/*   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
index 27dfd203b6a99af1657c438e82d4a2ebe01c9143..15d42c88e928f1c5e2cf5f1918edf90feaa9714d 100644 (file)
@@ -20,6 +20,8 @@
 #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);
index 4c538bf3a9a8298368402a41c1b4c3801bb02587..2bccb1f4c0b57e7b1fe5b208573c8ac52c76ce0d 100644 (file)
@@ -12,6 +12,36 @@ char *strcpy(char *dest, const char *src) {
     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++;
index bf6f037deddabf68a4d8dac60025959eba6e173a..15ea2a9a8ec3cfcc67bb926e91970a1146217da1 100755 (executable)
@@ -17,6 +17,7 @@ cp ./KERNEL.BIN /mnt/boot/Kernel
 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/
index fd98c0ff4e4ae3e59d2a0653c58f12a1e82f445c..e65ad22fca0109e6a4aa6f2874d6f67f2f8af566 100644 (file)
@@ -5,7 +5,6 @@ set timeout=1
 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
 }
index 8d8efff528508a4df4151340fdabf01d73a8a932..3a38a78364f89d1c5c73084d2df3685c3682700e 100644 (file)
@@ -27,7 +27,7 @@ SECTIONS
         code = .;
         phys_addr = . - kernel_virtual_addr_start;
         boot/multiboot.S.o(.text)
-        *(.multiboot_header)
+        *(.multiboot2_header)
         *(.text)
        *(.ring3.text);
         *(.sysexit) /* last */