【问题标题】:How do i tell my custom bootloader to run my kernel我如何告诉我的自定义引导加载程序运行我的内核
【发布时间】:2017-12-26 23:49:40
【问题描述】:

我对汇编编码非常陌生,并且一直很难在谷歌上搜索我需要知道的内容,我只想知道

1) 我在哪里以及如何将内核放在引导加载程序旁边的软盘文件 (.flp) 中

2) 我如何告诉我的引导加载程序运行内核

我所有的东西都写好了,但似乎无法附加文件并告诉我的引导加载程序运行内核

编辑:我使用 nasm 制作 .bin 文件,然后将 .bin 文件重命名为 .flp,然后使用 rufus 将我的 .flp 图像加载到带有 DD 选项的 USB 闪存驱动器

【问题讨论】:

  • 为什么要编写 custom 引导加载程序(UEFI 不太容易,而且对于旧版 BIOS 编写代码很无聊)? GRUB 太方便了!请参阅OSDEV wiki。
  • 我知道使用 grub 会容易得多,我只是想了解它是如何工作的,我觉得制作一个非常简单的会帮助我更多
  • 当前的 PC 通常有 UEFI。我建议您研究 GRUB 的源代码,并集中精力编写内核代码。生命短暂,当前的引导加载程序并不那么简单!
  • 学习 grub 的源代码会非常困难,因为我几乎不懂汇编,而且我正在慢慢学习所有 int 命令的用法、条件以及汇编附带的其他所有内容
  • 顺便说一句,您的所有问题都已在 OSDEV 上得到解答,而且您的问题对于 SO 来说太宽泛了。完整地回答它需要一整本书。另请阅读Operating Systems : Three Easy Pieces - 可免费下载的教科书。

标签: assembly kernel bootloader


【解决方案1】:

您可能会认为 Basile 的 cmets 有点不屑一顾,但事实是,即使您的问题非常具体,解决方案的组合和排列也不是。首先要知道的是,您的内核期望什么。就我而言,我的引导加载程序;

  • 在 EBDA 正下方创建一个堆栈帧
  • 读取 E820 地图
  • 启用 A20
  • 在 1000H 和 SS:0 之间读取尽可能多的扇区
  • 进入保护模式

所以引导扇区中编码的最后一件事是

        cli                     ; No more interrupts
        lgdt     [cs:GDTR]      ; Load GDT register
        mov      eax, cr0
         or      al, 0x01       ; Set protected mode bit
        mov      cr0, eax
        jmp      8:0x8060

内核中的第一件事

      mov   ecx, ss     ; Get stack segment
      shl   ecx, 4  
      add   ebp, ecx    ; SS:BP becomes EBP
      add   esp, ecx    ; SS:SP becomes ESP

; Initialize segments to point to data area

      mov   eax, 16
      mov    es, ax
      mov    ds, ax
      mov    ss, ax
      mov    fs, ax
      mov    gs, ax

这个解决方案完全基于我的设计标准,我敢说,你不会找到另一个像这样完成它的编码器。但最终,我已经完全按照您的方式完成了,创建了一个图像并使用dd if=Proto of=/dev/sdc 将其复制到 USB。名为Proto 的文件是Bochs 中使用的二进制图像。

要从任何人那里获得任何有意义的意见,您需要非常具体地了解期望和需求,而这一切都始于了解您的自定义引导加载程序的外观。

【讨论】:

  • ; Convert to absolute value 是一个令人困惑的评论,因为“绝对值”已经具有与您的意思不同的明确含义。也许“绝对地址”会更好? (哦等等,我不在 Code Review 中!)
  • @CodyGray 巧合的是,当我写下那条评论时,我已经想到了这一点,因为 SS:SP 与 ESP 一样绝对。将这四个指令统称为convert the segmented pointers to 32 bit 可能会更好。
猜你喜欢
  • 2018-03-26
  • 2016-02-09
  • 2015-06-02
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
相关资源
最近更新 更多