我发现这个网站:http://www.os-forum.com/minix/boot/ 声称记录了Minix的启动顺序.
但是在Minix 3.2的源代码树中我只是从Git获得,上面网站中描述的文件根本不存在.
他们是:
masterboot.s
bootblock.s
boothead.s
boot.c
bootimage.c
rawfs.c
Run Code Online (Sandbox Code Playgroud)
Minix会改变它的启动方式吗?
有没有关于Minix如何启动的文档?
谢谢!
我正在编写小型操作系统 - 用于练习.我从bootloader开始.
我想创建一个以16位实模式运行的小命令系统(现在).
我创建了重置驱动器的bootloader,然后在bootloader之后加载扇区.
问题是因为jmp功能后没有任何实际发生.
我不想尝试在0x7E00加载下一个扇区(我不完全确定如何使用es:bx指向地址,这可能是一个问题,我相信它的地址:偏移),就在引导加载程序之后.
这是代码:
;
; SECTOR 0x0
;
;dl is number of harddrive where is bootloader
org 0x7C00
bits 16
;reset hard drive
xor ah,ah
int 0x13
;read sectors
clc
mov bx,0x7E00
mov es,bx
xor bx,bx
mov ah,0x02 ;function
mov al,0x1 ;sectors to read
mov ch,0x0 ;tracks
mov cl,0x1 ;sector
mov dh,0x0 ;head
int 0x13
;if not readed jmp to error
jc error
;jump to 0x7E00 - executed only if loaded
jmp 0x7E00 …Run Code Online (Sandbox Code Playgroud) 我正在编写自己的操作系统.到目前为止,我的代码超过512字节,这太大了,无法容纳在简单的引导扇区中.
据我所知,我现在必须编写一个读取任意代码的引导加载程序,这些代码可能会也可能不会超过一个512字节的扇区.
引导程序需要:
这也是提出涉及操作系统开发的Stack Overflow问题的一个很好的起点.程序员经常很难创建一个Minimal,Complete和Verifiable示例.一个常见的样板/模板将允许其他Stack Overflow用户希望通过有限的大惊小怪来帮助测试代码.
我将如何构建这样一个可重用的引导程序?
我正在关注本教程,作为使用NASM进行x86的bootloader/OS开发的第一次尝试:
http://joelgompert.com/OS/TableOfContents.htm
我正在第4课,这使我的引导程序打印出"Hello,world"字符串.我不理解org指令的含义(指令?).
据我了解,org定义正在执行的程序加载到内存中的位置.在程序中使用任何类型的标签或相对地址时都需要这样做.
假设我的程序中有一个用这样的标签定义的字符串:
szHello db 'Hello, world!', 0
Run Code Online (Sandbox Code Playgroud)
然后我尝试像这样引用该标签(仅相关的片段):
org 0x7c00
xor ax, ax
mov ds, 0
...
mov si, szHello
lodsb
...
int 0x10 ; Print first character of szHello
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么这不等于这个?:
org 0
mov ds, 0x7c00
...
mov si, szHello
lodsb
...
int 0x10
Run Code Online (Sandbox Code Playgroud)
当我运行第一个示例时,我的字符串正确显示.第二个例子不起作用.
如果问题是我的概念问题,也会非常感谢相关文档的指针.
为什么bios读取分区的启动记录0000:7c00?那个地址有什么特别之处?':'在引用地址时做了什么?
查看android源代码中的reboot命令,我们找到以下行:
__reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, \
LINUX_REBOOT_CMD_RESTART2, argv[optind]);
Run Code Online (Sandbox Code Playgroud)
哪个是使用特定命令重启系统的标准Linux系统调用,请参阅Unix系统调用重新启动.
在Android中,此命令用于告诉引导加载程序在恢复模式下启动内核或在引导加载程序中转到fastboot模式.
我的问题是:引导加载程序如何获取命令?这个功能是在U-Boot中实现的吗?(我无法通过Google或U-Boot源找到它.)
此外,它似乎并非特定于Android,而是Linux执行"使用命令重启"的方式.有关如何在Linux中"正常"处理/使用它的任何信息?
Freedos引导程序似乎存在问题.(在某些情况下,似乎bootcode无法找到内核.)
所以我试图用gdb调试qemu中的bootloader.按照几个维基上的说明和免费提供的在线课程资料,我像这样运行qemu
qemu-system-i386 -fda fdboot.img -boot a -s -S
Run Code Online (Sandbox Code Playgroud)
然后像这样连接gdb
$ gdb
(gdb) target remote localhost:1234
Run Code Online (Sandbox Code Playgroud)
我可以逐步完成前面的10 - 12条指令si,我假设它是SeaBIOS.
但过去,当我尝试进入引导加载程序代码时,它会继续执行而不会中断,一直到FreeDos菜单提示符.这完全跳过了我想在执行时逐步检查的引导加载程序代码.
我需要做什么才能通过引导加载程序?
[如果您想尝试自己,可以从项目网站下载freedos软盘映像.]
下面的代码是用于定义中断向量表的u-boot的第一部分,我的问题是如何使用每一行.我理解前两行是起点和第一条实现的指令:reset,我们在下面定义reset.但我们什么时候会在下面使用这些说明?根据System.map,每条指令都有一个固定的地址,所以_fiq在0x0000001C,当我们想要执行fiq时,我们会将这个地址复制到pc然后执行,对吧?但是我们可以通过哪种方式跳转到这条指令:ldr pc,_fiq?它是通过硬件还是软件实现的?希望我能让自己理解正确.
>.globl _start
>_start:b reset
> ldr pc, _undefined_instruction
> ldr pc, _software_interrupt
> ldr pc, _prefetch_abort
> ldr pc, _data_abort
> ldr pc, _not_used
> ldr pc, _irq
> ldr pc, _fiq
>_undefined_instruction: .word undefined_instruction
>_software_interrupt: .word software_interrupt
>_prefetch_abort: .word prefetch_abort
>_data_abort: .word data_abort
>_not_used: .word not_used
>_irq: .word irq
>_fiq: .word fiq
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 nexus 6P 上刷新 Google 工厂映像文件,但它总是在同一点停止。USB 调试已启用,MTP 模式也已启用。引导加载程序已解锁并与 ADB Fastboot 等通信,我是否遗漏了什么?我已经下载了 zip 文件并解压到平台工具文件夹中。甚至安装了谷歌推荐的驱动程序。如果有人可以并接受比特币或任何其他加密货币,请帮助我将其发送以寻求帮助
(c) 2017 Microsoft Corporation. All rights reserved.
C:\Users\gemma\Desktop\platform-tools_r29.0.6-windows\platform-tools>fastboot reboot-bootloader
Rebooting into bootloader OKAY [ 0.022s]
Finished. Total time: 0.022s
C:\Users\gemma\Desktop\platform-tools_r29.0.6-windows\platform-tools>fastboot flash-all.bat
fastboot: usage: unknown command flash-all.bat
C:\Users\gemma\Desktop\platform-tools_r29.0.6-windows\platform-tools>flash-all.bat
Sending 'bootloader' (3524 KB) OKAY [ 0.116s]
Writing 'bootloader' OKAY [ 0.209s]
Finished. Total time: 0.378s
Rebooting into bootloader OKAY [ 0.107s]
Finished. Total time: 0.107s
Sending 'radio' (48120 KB) OKAY [ 1.065s]
Writing 'radio' OKAY [ …Run Code Online (Sandbox Code Playgroud) 我正在使用mbed的LPC 1768板(带有cortex M3 cpu),我正在尝试在这里实现一些功能,主要是从SD卡升级用户应用程序,我正在编写两个程序,首先是一个bootloader/nano-kernel,以及一个用户应用程序(helloworld将开始):
Sd卡很容易锻炼,我遇到了跳跃部分的问题.这是跳跃函数的代码.
void run(void) {
void (*user_code_entry)(void);
unsigned *p;
SCB->VTOR = (USER_FLASH_START & 0x1FFFFF80);
// Load contents of second word of user flash - the reset handler address
// in the applications vector table
p = (unsigned *)(USER_FLASH_START +4); // USER_FLASH_START is 0x9000
user_code_entry = (void (*)(void))p;
// Jump to user application
user_code_entry();
Run Code Online (Sandbox Code Playgroud)
}
所以我编译了(我使用Keil uvision4)用户应用程序将起始地址更改为0x9000.如果我编程我的电路板(使用flashmagictool),然后手动跳转(仍使用flashmagictool)到0x9004(0x9000 + 4),用户应用程序将运行,所以我相信编译工作正常,因此用户应用程序可以在0x9000运行.
但是,如果我运行bootloader/nano-kernel,这个没有跳转到用户应用程序,不幸的是因为我无法调试,我不知道发生了什么...我也试过不使用SD副本部分,所以我首先编程引导加载程序,基本上只是跳转到0x9004.然后我编写将位于0x9000的用户应用程序.如果我重启电路板,bootloader会运行,但不会跳转到用户应用程序.我检查了内存,似乎两个程序(bootloader + user-app)都是正确的并且位于正确的位置.
我相信我在这里遗漏了一些东西,是否有任何我应该关注的低级代码?我已经在线阅读了文档的音调,从我发现的例子中,他们以与我相同的方式跳转到用户代码...非常感谢任何帮助.