标签: bootloader

实模式,中断向量替换崩溃

我正在尝试更多地了解系统如何真正在顶部所有漂亮的图形下工作.所以我现在正在使用BIOS在启动时加载的512字节内存,在我猜的时候真的不能称之为引导加载程序.无论如何,我正在替换一个中断向量,但有问题.更换中断09h(键盘)后,它正常工作,在按键上输出"Memory messing".但没什么.之后的每一个按键都什么都不做.我不知道系统是否崩溃,或者我是否遗漏了我的处理程序中的内容,这里是代码:

jmp start
times 100 db 0 ; Cleared space for stack

start:
xor ax, ax
mov ax, start
sub ax, 80
mov sp, ax 

mov al, 0x09   ; Interupt number
mov bl, 4
mul bl
mov bx, ax
xor ax, ax
mov es, ax
mov [es:bx], word prints ; My interupt handler
add bx, 2
mov [es:bx], word 0x00

bloader:
    jmp bloader

prints:
    cli
    push ax
    push bx
    push si
    mov si, msg       ; Message to print
    mov …
Run Code Online (Sandbox Code Playgroud)

x86 assembly interrupt-handling bootloader

6
推荐指数
1
解决办法
964
查看次数

对内核的争论

内核是否需要从引导加载程序获取内容.通常内核能够从头开始构建系统,那么为什么它需要来自boot-loader的任何内容?我从内核看过这样的启动消息.

"Fetching vars from bootloader... OK"
Run Code Online (Sandbox Code Playgroud)

那么变量到底是什么?如何从引导加载程序传递变量?是通过堆栈?

linux boot bootstrapping linux-kernel bootloader

6
推荐指数
1
解决办法
3000
查看次数

MBR从DOS启动

对于一个项目,我想直接从DOS调用第一个硬盘上的MBR.我编写了一个小的汇编程序,它将MBR加载到内存中0:7c00h,远远超过它.我把我的util放在(DOS)可启动软盘上.我正在尝试启动的磁盘(HD0,0x80)上有一个TrueCrypt启动加载程序.当我在此设置中运行该工具时,它会显示TrueCrypt屏幕,但输入密码后会崩溃系统.当我在普通的WinXP机器上运行我的小功能(w00t.com)时,它似乎立即崩溃.

显然我忘记了BIOS通常会做的一些关键事情,我猜这是微不足道的.有更好的裸机DOS和BIOS经验的人可以帮助我吗?

继承我的代码:

.MODEL tiny
.386
_TEXT SEGMENT USE16

INCLUDE BootDefs.i

ORG 100h

start:
    ; http://vxheavens.com/lib/vbw05.html
    ; Before DOS has booted the BIOS stores the amount of usable lower memory 
    ; in a word located at 0:413h in memory. We going to erase this value because
    ; we have booted dos before loading the bootsector, and dos is fat (and ugly).

    ; fake free memory  
    ;push ds
    ;push   0
    ;pop        ds
    ;mov        ax, TC_BOOT_LOADER_SEGMENT / 1024 * 16 + TC_BOOT_MEMORY_REQUIRED …
Run Code Online (Sandbox Code Playgroud)

assembly bootstrapping truecrypt bare-metal bootloader

6
推荐指数
1
解决办法
1272
查看次数

GRUB的第1阶段引导加载程序如何加载第2阶段引导加载程序?

从过去的一周开始,我很困惑的问题是,当第二阶段处于复杂的文件系统时,grub第一阶段启动加载器(仅446字节)如何能够搜索第二阶段!它如何定位第二阶段?

当windows和linux的复杂分区方案到位,并且linux系统完全在扩展分区中时,第1阶段如何找到第2阶段?即使是1.5阶段?

所有grub教程都浏览了这个重要部分.我通过互联网搜索但找不到任何解释这个的东西.可悲的是,我不是集会程序员.

我想要了解启动过程中硬盘的哪些扇区(以及大致如何)的复杂启动过程.*请指出一个很好的资源或在这里回答.它将极大地帮助我明智地玩grub.*

搜索的一些资源:

  1. Linux如何工作:Brian Ward应该知道每个超级用户应该知道什么
  2. http://www.dedoimedo.com/computers/grub.html
  3. 一些过去的stackoverflow问题.

linux grub bootloader

6
推荐指数
1
解决办法
3930
查看次数

为什么在从实模式切换到保护模式之前需要禁用中断?

我在许多ose(和一些引导程序)中看到,它们cli在从实模式切换到保护模式之前都禁用了interrupt().为什么我们需要这样做?

x86 operating-system real-mode osdev bootloader

6
推荐指数
1
解决办法
1049
查看次数

你怎么理解Hex文件?(扩展地址记录)

我正在尝试为PIC18制作一个引导程序,所以我需要了解如何正确处理hex文件.例如,我理解如何处理以下十六行.

:040C0000E2EFFFF030
Run Code Online (Sandbox Code Playgroud)

04:字节数

0C00 :十六进制数字的地址

00:数据记录

E2EFFFF0:数据序列

30:校验和

所以我会知道如何处理上面的行,但是下面的十六行怎么样.

:020000040001F9
Run Code Online (Sandbox Code Playgroud)

02 :字节数

0000: 地址

04:扩展线性地址记录

0001:数据

F9:校验和

但究竟我该怎么做呢?我是否将这些数据写入该地址?你能把它翻译成机器语言吗?

顺便说一下,我的应用程序从地址开始,0c00bootloader从地址开始,在0020它上面是中断向量.谢谢!

更新

如果hex文件的第三行是以下,地址会FFC0改变吗?

:10FFC000FF00FF00FF00FF00FF00FF000001E9EF5E
Run Code Online (Sandbox Code Playgroud)

我在想,因为hex文件的第二行有04(扩展线性地址记录),那么我应该添加0001到第三行的地址FFC0,所以新地址就是这样的.

$0001 + $FFC0将等于1FFC0,所以第3行的下一组数据字节应写入此地址1FFC0,这是正确的吗?

c embedded microcontroller pic bootloader

6
推荐指数
1
解决办法
2121
查看次数

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

在我的MIT OS课程(686)中,我发现了一些我不理解的代码。我想了解指令inb $0x64, %al启动 / boot.S。我的理解是它正在从数据端口0x64读一个字节到AL,端口0x64是什么?正在测试哪个设备或机制?我对代码忙中的注释感到困惑吗?评论是什么意思,它指的是什么?

# Enable A20:
#   For fascinating historical reasons (related to the fact that
#   the earliest 8086-based PCs could only address 1MB of physical memory
#   and subsequent 80286-based PCs wanted to retain maximum compatibility),
#   physical address line 20 is tied to low when the machine boots.
#   Obviously this a bit of a drag for us, especially when trying to …
Run Code Online (Sandbox Code Playgroud)

x86 assembly real-mode osdev bootloader

6
推荐指数
1
解决办法
1815
查看次数

启用引导加载程序以加载USB的第二个扇区

我正在学习汇编语言.我写了一个简单的bootloader.测试后,它没有用.这是我的代码:

[bits 16]
[org 0x7c00]

jmp start

data:
wolf_wel_msg db 'Welcome to Bootloader!!!',0x0D,0x0A,0
wolf_kernel_load db 'Loading kernel....',0x0D,0x0A,0
wolf_error_msg db 'Kernel.bin not found!',0x0D,0x0A,0
wolf_error_msg1 db 'Press any key to restart..',0

start:
        mov si, wolf_wel_msg
    call wolf_print

    mov si, wolf_kernel_load
    call wolf_print

    pushf
    stc

    mov ah,00
    mov dl,00
    int 13h

    read_sector:
            mov ax, 0x0
        mov es, ax
        xor bx, bx
            mov ah, 02
        mov al, 01
        mov ch, 01
        mov cl, 02
        mov dh, 00
        mov dl, 00
        int 13h

    jc wolf_error …
Run Code Online (Sandbox Code Playgroud)

assembly osdev bootloader bochs x86-16

6
推荐指数
1
解决办法
1404
查看次数

通过无线方式远程更新Raspberry Pi软件

我们使用Raspberry Pi嵌入式计算机将客户网络上的IP摄像机连接到基于云的录制服务.我们使用Raspbian,约50%是Wheezy,50%是Jessie.

我们面临的挑战是如何远程更新这些IFU上运行的软件.

我们当前的方法涉及使用SSH和Ansible.我们有一个复杂的Ansible脚本,它对Raspberry Pi进行了所有更改,我们已经在一定程度上实现了自动化,因此我们可以一次更新大量的Raspberry Pi.

但问题是这是非原子更新.Raspberry Pi不一定总是具有完全相同的软件包版本,具体取决于它们何时更新.它也可能升级到中途失败等.

我知道有几种方法可以通过下载新的"软件映像"进行原子升级,然后使用引导程序交换使用它.我认为OpenWRT可以做到这一点以及swupdate:https://github.com/sbabic/swupdate

有没有人曾经在Raspberry Pi上做过这样的事情?

谢谢

firmware embedded-linux bootloader raspberry-pi raspbian

6
推荐指数
1
解决办法
6502
查看次数

通过USB驱动器启动的自定义引导加载程序在某些计算机上产生错误的输出

我对装配很新,但我正试图深入了解低级计算的世界.我正在尝试学习如何编写将作为引导加载程序代码运行的汇编代码; 所以独立于任何其他操作系统,如Linux或Windows.在阅读了本页和其他几个x86指令集列表之后,我想出了一些汇编代码,它应该在屏幕上打印10 A然后是1 B.

      BITS 16
start: 
    mov ax, 07C0h       ; Set up 4K stack space after this bootloader
    add ax, 288     ; (4096 + 512) / 16 bytes per paragraph
    mov ss, ax
    mov sp, 4096

    mov ax, 07C0h       ; Set data segment to where we're loaded
    mov ds, ax

    mov cl, 10          ; Use this register as our loop counter
    mov ah, 0Eh         ; This register holds our BIOS instruction

.repeat:
    mov al, 41h         ; Put …
Run Code Online (Sandbox Code Playgroud)

x86 assembly usb-drive bios bootloader

6
推荐指数
2
解决办法
758
查看次数