标签: bootloader

MikeOS引导加载程序中的堆栈段

我不明白这段代码:

mov ax, 07C0h   ; Set up 4K of stack space above buffer
add ax, 544     ; 8k buffer = 512 paragraphs + 32 paragraphs (loader)
cli             ; Disable interrupts while changing stack
mov ss, ax
mov sp, 4096
sti             ; Restore interrupts
Run Code Online (Sandbox Code Playgroud)
  • mov ax,07C0h - 这里BIOS加载我们的代码.但什么是'4K'?千字节?我没弄明白:)
  • 添加斧头,544 - 为什么再次'8K'?为什么我们加544?为什么不是512?
  • mov sp,4096 - 这里我们设置堆栈指针.

在设置堆栈指针之前,我们要做什么操作呢?

assembly bootloader

9
推荐指数
1
解决办法
2081
查看次数

如何编写引导程序来加载ac内核?

我正在学习NASM,因为我编写了bootloaders.到目前为止,我有一个hello world bootloader.我想知道如何将ac程序链接到它并让bootloader将其加载到内存中并开始执行它的入口点函数.我需要NASM代码,因为我是NASM n00b.非常感谢你的帮助.

编辑:基本上我需要知道如何链接c程序,我需要NASM代码tsrat它的入口点功能.我应该知道的任何陷阱?

c assembly kernel nasm bootloader

9
推荐指数
1
解决办法
4933
查看次数

GCC,ARMboot - 创建没有任何库和任何操作系统的独立应用程序

我有一个嵌入式硬件系统,其中包含一个基于ARMboot的引导加载程序(与Uboot和PPCboot非常相似).

此引导加载程序通常用于从闪存加载uClinux映像.但是,现在我正在尝试使用此引导加载程序来运行独立的helloworld应用程序,它不需要任何链接库.实际上,它只包含while(1){}main函数中的代码.

我的问题是我无法找出我应该使用哪些GCC设置来构建一个独立的格式正确的二进制文件.

我使用以下构建命令:

cr16-elf-gcc -o helloworld helloworld.c -nostdlib
Run Code Online (Sandbox Code Playgroud)

产生警告信息:
警告:找不到条目符号_start; 默认为00000004

此后,在引导加载程序中,我上传生成的应用程序并在某个地址启动它:

tftpboot 0xa00000 helloworld
go 0xa00004
Run Code Online (Sandbox Code Playgroud)

但它不起作用:(系统重新启动.

通常它应该挂起(因为while(1)).

c embedded gcc arm bootloader

8
推荐指数
1
解决办法
2731
查看次数

自定义引导加载程序问题

我正在尝试为Hobby OS编写一个引导加载程序并让它运行良好.没什么特别的,只打印一行文字:

BITS 16
ORG 0

start: jmp main


OEM         db "Test OS "           
BytesPerSector:     DW 512
SectorsPerCluster:  DB 1
ReservedSectors:    DW 1
NumberOfFATs:   DB 2
RootEntries:    DW 224
TotalSectors:   DW 2880
Media:      DB 0xf8  
SectorsPerFAT:  DW 9
SectorsPerTrack:    DW 18
HeadsPerCylinder:   DW 2
HiddenSectors:  DD 0
TotalSectorsBig:    DD 0
DriveNumber:        DB 0
Unused:         DB 0
ExtBootSignature:   DB 0x29
SerialNumber:   DD 0xa0a1a2a3
VolumeLabel:    DB "HOBBY  OS  "
FileSystem:         DB "FAT12   "



main:
    ;Adjust code Seg.
    cli
    mov ax, 0x07c0
    mov …
Run Code Online (Sandbox Code Playgroud)

x86 assembly disk utility bootloader

8
推荐指数
1
解决办法
422
查看次数

为什么55 AA用作IBM PC上的启动签名?

为什么IBM PC体系结构55 AA引导签名的最后两个字节中使用幻数来进行引导签名

我怀疑它与它们的位模式有关:01010101 10101010但是不知道是什么.

我的猜测是:

  1. BIOS正在对这些字节一些位和/或/ XOR操作来将它们一起进行比较,如果它,例如,结果0,它可以很容易地检测和跳跃的地方.
  2. 它可能是一些平价/完整性的保障,如果其中的某些位被打破,它可以检测或东西,仍然被认为是一种有效的签名,以正确引导,即使在磁盘上这个特殊的位已经被打破或东西的系统.

也许你们中的某个人可以帮助我回答这个唠叨的问题?

我记得我曾经读过一些有关这些位模式的内容,但不记得在哪里.而且它会出现在一些纸质书中,因为我在网上找不到任何关于它的东西.

boot bootstrapping signature bootloader

8
推荐指数
1
解决办法
6935
查看次数

系统启动时哪个核心首先初始化?

我想知道多核处理器的哪个核心在cpu启动时首先初始化?(我的意思是在引导程序级别)是第一个核心?还是随机核心?

cpu bootloader

8
推荐指数
1
解决办法
4339
查看次数

在bootloader中远程跳转gdt

flush_gdt:
    lgdt [gdtr]
    jmp 0x08:complete_flush

complete_flush:
    mov ax, 0x10
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    mov ss, ax
    ret
Run Code Online (Sandbox Code Playgroud)

我无法理解这段代码的作用.flush_gdt是一个标签好,然后lgdt [gdtr]48-bit指针加载到gdtr寄存器中,然后从中加载jmp 0x08:complet_flush.

jmp指令有什么作用?然后我们为什么要将0x10移动到ax,然后移动到其他寄存器

x86 assembly bootloader gdt

8
推荐指数
1
解决办法
3092
查看次数

如何将bin文件(512字节)写入软盘的第一个扇区(扇区0)?

如何将.bin文件写入软盘/虚拟软盘/软盘映像的第一个扇区?

我正在尝试启动一个简单的512字节引导加载程序.各地的大小都说"512字节",所以我应该已经很好了.

附加信息:

引导程序只显示一个字符串,我正在学习简单的汇编.一些工作是在Windows中完成的,一些是在Ubuntu 14.04(Trusty Tahr)中完成的(如果这很重要).

即使它具有引导加载程序标志,它也无法启动.

assembly floppy bios osdev bootloader

8
推荐指数
2
解决办法
5992
查看次数

如何为我的bootloader制作内核?

我正在尝试制作自己的自定义操作系统,我需要一些代码帮助.这是我的bootloader.asm:

[ORG 0x7c00]

start:
    cli
    xor ax, ax
    mov ds, ax
    mov ss, ax
    mov es, ax
    mov [BOOT_DRIVE], dl
    mov bp, 0x8000
    mov sp, bp
    mov bx, 0x9000
    mov dh, 5
    mov dl, [BOOT_DRIVE]
    call load_kernel
    call enable_A20
    call graphics_mode
    lgdt [gdtr]
    mov eax, cr0
    or al, 1
    mov cr0, eax
    jmp CODE_SEG:init_pm

[bits 32]
init_pm:
    mov ax, DATA_SEG
    mov ds, ax
    mov ss, ax
    mov es, ax
    mov fs, ax
    mov gs, ax

    mov ebp, 0x90000 …
Run Code Online (Sandbox Code Playgroud)

x86 assembly kernel osdev bootloader

8
推荐指数
1
解决办法
1866
查看次数

如何用C语言编写linux启动代码?

我是学习OS开发的新手.从我读过的书中,它说启动加载器会将第一个MBR复制到0x7c00,然后从实模式开始.

并且,示例从16位汇编代码开始.但是,当我查看今天的linux内核时,arch/x86/boot有'header.S'和'boot.h',但实际代码是在main.c中实现的.

这似乎对"不编写汇编"很有用.但是,这是如何在Linux中专门完成的?我可以粗略地想象可能有特殊gcc选项和链接策略,但我看不到细节.

c assembly linux-kernel bootloader x86-16

8
推荐指数
1
解决办法
805
查看次数

标签 统计

bootloader ×10

assembly ×7

c ×3

x86 ×3

kernel ×2

osdev ×2

arm ×1

bios ×1

boot ×1

bootstrapping ×1

cpu ×1

disk ×1

embedded ×1

floppy ×1

gcc ×1

gdt ×1

linux-kernel ×1

nasm ×1

signature ×1

utility ×1

x86-16 ×1