首页 文章
  • 1 votes
     answers
     views

    如何通过将各自的部分放在不同的位置来链接两个目标文件?

    我有一个bootloader程序“boot.asm”,它必须包含一个特殊字,从一开始就有510字节的偏移量 . 我有一个用C“kernel.c”编写的内核源代码 . 我的计划是通过从引导加载程序加载第二个硬盘扇区并将其放在内存中的0x8000位置来调用内核(它将位于高清的第二个扇区) . 现在我将两个源文件编译成ELF目标文件(单独)到“boot.o”和“kernel.o”,然后通过链接器链接它们...
  • 3 votes
     answers
     views

    如何将部分映射到ELF输出文件中的段?

    好吧,我已经在程序集中编写了一个bootloader并试图从中加载一个C内核 . 这是引导程序: bits 16 xor ax,ax jmp 0x0000:boot extern kernel_main global boot boot: mov ah, 0x02 ; load second stage to memory mov al, 1 ...
  • 1 votes
     answers
     views

    我是否可能意外破坏ESP8266 ESP-12F模块的引导程序?

    我是这些设备的新手,即使它们非常便宜,我也不会不必要地想要它们 . 我已经使用esptool将NodeMCU固件刷新到我的模块上 . 这样做时,我需要指定文件写入的地址,通常是0x00000 . 这是否意味着固件实际上包含引导加载程序?或者它位于闪光灯的单独区域? 如果引导加载程序本身包含在固件文件中,那么中断闪烁过程会使模块无效,我想? 谢谢你的澄清!
  • 3 votes
     answers
     views

    用于ARM U-Boot构建问题的交叉工具链

    我正在尝试为Raspberry-Pi构建自己的工具链 . 我知道有很多预建的工具链 . 这项工作是出于教育原因 . 我从头开始关注嵌入式arm linux . 到目前为止成功构建了gcc和uClib . 我正在为目标arm-unknown-linux-eabi构建 . 现在谈到准备一个可启动的文件系统我正在质疑自己的引导程序构建 . 有关此系统的引导加载程序的部分似乎不完整 . 现在我在质疑自己如...
  • 4 votes
     answers
     views

    当通过qemu运行时,简单的引导加载程序在RAM之外

    我正在尝试使用qemu运行一个简单的引导程序 . start: jmp start times 510 - ($ - $$) db 0 db 55h db 0AAh 我做了什么,我得到了什么: $ nasm -f bin -o boot.bin boot.s $ dd if=/dev/zero of=boot.img bs=1M count=64 64+0 ...
  • 24 votes
     answers
     views

    bootloader - 将处理器切换到保护模式

    我很难理解简单的引导装载程序是如何工作的 . 我正在谈论的引导加载程序是麻省理工学院“操作系统工程”课程中的一个 . 首先,让我向您展示BIOS执行的一段汇编代码: [f000:fec3] 0xffec3: lidtw %cs:0x7908 [f000:fec9] 0xffec9: lgdtw %cs:0x7948 [f000:fecf] 0xffecf: mov %c...
  • 3 votes
     answers
     views

    保护模式寻址

    我正在尝试启动加载程序开发教程 . 我能够使用FAT12约定读取stage2引导加载程序 . 现在我试图在实模式下加载内核,然后将其复制到0x0100000地址 . 我在复制跳转到0x0100000时遇到三重故障 . 基本上我无法弄清楚如何访问或跳转到0x0100000 . 我的代码在我使用时有效 IMAGE_PMODE_BASE equ 0x1000 IMAGE_RMODE_BASE equ 0...
  • 1 votes
     answers
     views

    进入保护模式并执行远jmp后的三重故障[重复]

    这个问题在这里已有答案: Constant reboot after setting up the Global Descriptor Table and protected mode 1回答 我正在写一个业余爱好OS内核 . 每次内核进入保护模式并跳转到其保护模式部分时,Bochs会将故障三重并给我: 00014918914i[BIOS ] Booting from 0000:7c00 0...
  • 0 votes
     answers
     views

    U-Boot如何与Linux内核通信?

    我正在读这本书,它告诉我: 在U-Boot加载Linux内核后,内核将声明U-Boot的所有资源 这是什么意思?是否意味着将丢弃在U-Boot中分配的所有数据结构? 例如:在U-Boot期间,将初始化PCIE和网络设备 . 启动Linux内核后,是否会丢弃PCIE和网络设备数据结构? Linux内核会再次进行PCIE和NEtwork初始化吗?或者U-Boot会将一些数据传输到内核?
  • 4 votes
     answers
     views

    linux内核命令行开关上的三重破折号

    我正在尝试添加一个开关,将Linux内核日志发送到XenServer6上的串行控制台 . 可以在EXTLinux配置文件( /boot/extlinux.conf )上编辑内核命令选项 . 这是一段摘录: serial 1 115200 default xe prompt 1 timeout 50 label xe # XenServer kernel mboot.c32 appen...
  • 3 votes
     answers
     views

    如何将Linux内核Bin转换为ELF格式

    我们有一个没有ELF头的Linux内核二进制文件,我们的引导加载程序将根据来自ELF头的计算加载内核映像(早期的QNX内核映像有ELF头),但由于我们的Linux内核映像没有一个ELF头,我们的引导加载程序拒绝将此内核映像加载到内存中 . 由于某些原因,我们没有更改引导加载程序代码的选项,因此我们唯一的选择是将ELF标头插入具有特定入口点的Linux BIN文件中 . 实现它的方法是什么?
  • 5 votes
     answers
     views

    ARM qemu系统仿真器可以在没有内核参数的情况下从卡映像启动吗?

    我已经看过很多如何运行QEMU ARM板仿真器的例子 . 在每种情况下,除了SD卡图像参数外,QEMU也总是提供内核参数,即: qemu-system-arm -M versatilepb \ -kernel vmlinuz-2.6.18-6-versatile \ #KERNEL PARAM HERE -initrd initrd....
  • 0 votes
     answers
     views

    linux内核如何创建/ dev / root - Initramfs查询

    我需要创建一个initramfs来加载驱动程序以访问包含rootfs的EMMC . 在我当前的内核构建中,EMMC驱动程序是模块化的(抱歉,无法更改此内容) . 内核启动后,它会加载initramfs . 从initramfs,它需要切换到EMMC上的一个分区,该分区包含使用switch_root函数的实际rootfs . 直到这里一切都运作良好 . 我可以创建initramfs,...
  • 0 votes
     answers
     views

    运行我的启动时qemu错误

    我写了一个简短的启动代码并试图用Qemu运行它: qemu-system-arm.exe -M versatilepb -cpu cortex-a9 -kernel boot.bin 我希望代码加载到地址0x8400000,但qemu返回错误 尝试在0x84000000处执行RAM或ROM外部的代码这通常意味着发生以下情况之一:(1)您告诉QEMU为错误的机器类型执行内核,并且在启动时崩溃(...
  • 0 votes
     answers
     views

    从加载的段切换到保护模式

    我正在尝试编写简单的bootloader . 我想在实模式下加载boot0,跳转到boot0并从那里加载完整的内核 . 然后切换到保护模式并执行内核代码 . 到目前为止,我有: ;First segment loaded by BIOS: bits 16 org 0 jmp 0x07c0:start start: mov ax, cs mov ds, ax mov es, ax mov al, ...
  • 1 votes
     answers
     views

    尝试启用保护模式时的引导循环

    我正在编写一个基本的引导加载程序,我只能在某种环境中编写一个简单的C程序,将其写入硬盘(无文件系统)并运行它 . 这就是我想做的一切 . 这是我到目前为止所做的 . 阶段1: 设置堆栈和段寄存器 将视频模式更改为640x480x8 读取下一个扇区到内存 远远跳到它 第二阶段: 再次设置堆栈和段(我是否需要再次执行此操作?) 设置GDT(这部分让我感到困惑 - 我只是复制...
  • 3 votes
     answers
     views

    OS开发 - 在保护模式下执行第一条指令

    我指的是Broken Thorn的操作系统开发教程 . 我目前正处于执行第二阶段引导加载程序以加载GDT并进入保护模式的阶段 . 我了解GDT如何工作以及如何进入保护模式 . 但是,我的困惑是加载 cr0 寄存器后执行的第一条指令: jmp 08h:Stage3 ; far jump to fix CS. Remember that the code selector is 0x8! ...
  • 4 votes
     answers
     views

    跳入保护模式时出现三重故障

    我正在开发一个启动加载程序,它将在切换到保护模式后启动到一个简单的内核 . 我在第四章或第五章的某处使用了this paper作为教程 . 从理论上讲,它应该以16位实模式启动,将内核加载到内存中,切换到32位保护模式并开始执行内核代码 . 但是,当我切换到保护模式并远程跳转或跳转到另一个段时,它会出现三重故障 . 这是主引导扇区代码: [org 0x7c00] KERNEL_OFFSET eq...
  • 1 votes
     answers
     views

    32位保护模式启动加载器光标在没有显示代码的屏幕上竞争?

    我正在使用https://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf作为我的教科书从头开始编写基本内核 . 我已经编写了基本的16位引导加载程序,我只是根据本文编写了切换到保护模式的代码 . 它定义了一个基本的通用描述符表,加载它,并在cr0特殊寄存器中翻转一下 . 但是,当我尝试启动代码时,我会在屏幕底部反复出现...
  • 1 votes
     answers
     views

    x64架构上实模式和保护模式之间的区别

    x64架构上的实模式和保护模式有什么区别?我正在尝试为Linux内核创建自定义引导加载程序 . 如何在程序集中启用保护模式?
  • 0 votes
     answers
     views

    简单的Bootloader进入保护模式

    我试图为x86架构编写一个简单的引导程序,它应该只输出字符'A',进入保护模式,然后停止 . 我的代码和评论如下: BITS 16 ORG 0x7c00 jmp 0:start ;set cs to 0 start: mov ax,0x7c0 add ax,288 mov ss,ax mov sp,4096 mov ax,0x7c0 mov ds,ax ;Sets segment descr...
  • 1 votes
     answers
     views

    无法在磁盘上保存引导扇区并在磁盘上运行OS然后将其加载到内存中

    背景资料 我正在开发一个简单的DOS操作系统 . 所以我不打算很快进入保护模式 . 操作系统将以汇编语言编写;顺便说一句NASM语法 . 引导扇区应该将引导扇区保存在硬盘的第一个扇区上,OS代码保存在第二个扇区上 . 这样它就可以从硬盘启动,而不是从CD映像启动 . 问题 问题是启动扇区似乎可以在硬盘上正确保存所有内容 . 但是当我重新启动VMware Player并弹出虚拟CD-ROM时 . 它...
  • 1 votes
     answers
     views

    Bootloader在仿真器中工作,但在真实硬件上不工作

    我在汇编中编写一个bootloader,它似乎在qemu,bochs和virtualbox上工作正常 . 但是,它并没有在真实硬件上加载内核(似乎) . 引导程序通过将一个字符写入视频内存(用于调试)开始,然后从驱动器读取扇区2并远程跳转到内核 . 然后内核将一些字符写入视频内存 . 在一台真机上,我在屏幕上看到引导加载程序中的字符,然后它挂起(闪烁的插入符号) . 我试图将DS,ES,SI设置为...
  • 1 votes
     answers
     views

    设置全局描述符表和保护模式后不断重新启动

    我必须做错 GDT setup 并切换到 protected mode 因为它不断重启 . 这是我的 kernel.asm 应该设置 GDT 并切换到 protected mode : bits 16 jmp main %include "gdt.inc" main: cli xor ax,ax mov...
  • 3 votes
     answers
     views

    为什么在切换到保护模式之前在引导加载程序中测试端口0x64?

    在我的麻省理工学院OS课程(686)中,我发现了一些代码,我试图理解boot / boot.S中的指令 inb $0x64, %al . 我的理解是它从数据端口0x64读取一个字节到AL,什么是端口0x64?它忙于测试哪种设备或机制?我对代码忙的评论感到困惑?评论意味着什么,它指的是什么? # Enable A20: # For fascinating historical reasons ...
  • 2 votes
     answers
     views

    进入长模式

    我一直在研究引导加载程序,目前正试图让它切换到长模式 . 到目前为止我已经切换到保护模式,我确信它有效,但似乎当我启用分页进入长模式时会导致故障 . 我想这可能是因为我的页面表 . 这是代码: [BITS 16] org 0x2000 Start: jmp main ;Constants %DEFINE TEAL 0x03 %DEFINE RED 0x04 %DEFINE ...
  • 3 votes
     answers
     views

    无法在保护模式下设置GS寄存器

    我正在编写一个基于OSDev Wiki和一些相关书籍的信息的操作系统 . 我发现在跳转到保护模式后,段初始化例程没有正确执行 . 这是我的第二阶段加载器和内核代码: ; stage2 ; still -f bin [org 0xd200] ; calculated by first stage loader ; GDTs are defined here jmp entry GDT_DESC_...
  • 0 votes
     answers
     views

    qemu:致命:尝试在0xd08ec08e的RAM或ROM外部执行代码

    我有一个用C编写的函数,它从键盘读取一个字符,并返回按下的字符 . kmain.c #include <stdint.h> char getch() { uint16_t inchar; __asm__ __volatile__ ("int $0x16\n\t" : "=a"(inc...
  • 1 votes
     answers
     views

    程序集qemu-system-i386:尝试在RAM外部执行代码

    我在玩qemu时遇到了这个错误, "qemu-system-i386: Trying to execute code outside RAM" . 在 gdb 上,我得到了这个,所以它停留在movl上,当我执行一个stepi时,所有崩溃: => 0xf010002c <relocated>: add %al,(%eax) relocated ...
  • 2 votes
     answers
     views

    使用USB Bootloader时如何设置ARM用户应用程序起始地址?

    刚从eBay拿起这些ARM Cortex-M3 LPC1768 mini boards中的一个 . 它基本上是一个突破板 . 但是,根据它附带的小文档,我应该注意 . 这两个文档(应用说明和电路板文档)都表明用户程序的构建应该是他们的 starting address is 0x2000 . 因为USB引导加载程序已经是0x0并占用8K . 这两个文档还显示了如何在Keil uVision中执行...

热门问题