我在Facebook的源代码中看到过这个主要Bootloader.setResourceMap({"bMxb7":{"name":....是javascript中的引导加载程序是什么?它的用途和用途是什么?
我知道这是一个相当难以回答的问题,主要是因为有很多事情可能是错误的,很难把事情搞得一团糟.但我会尽可能多地提供信息; 希望这会有所帮助.
我开始使用D语言和Digital Mars D编译器编写自己的内核,并且在弄清楚如何生成可以重新定位的平面二进制文件之后遇到了很多麻烦,我终于提出了生成普通PE文件的想法.地址0xC0000000,并用字节0x90(NOP操作码)替换所有标头.这非常好用,我能够在屏幕上编写内容,设置分页,完全进入保护模式等,当然还有16位基于汇编的引导加载程序的帮助.
一切都很顺利,也就是说,我决定将D运行时库移植到我的内核中.我设法提取了库的一个子集并对其进行修改以使其编译到我的应用程序中.然后我运行了我的程序.(注意:我根本没有 使用该库;我的代码是在引导后执行的第一个代码 - 第一件事就是打印"Kernel"到屏幕上,之前没有调用运行时代码.)
AD数组(因此字符串,因为字符串只是一个char[])只不过是一个带有指针和大小成员的结构,因此在32位系统上它将是8字节大.有趣的是,当我运行我的程序时,结构的成员显示为零 - 也就是说,指针和大小都为零.(我通过将指针的值打印到屏幕以及长度成员来验证这一点 - 两者都是零.)一旦我删除了运行时的源代码(从未执行过),它们工作正常.
我把它缩小到两种可能性:
堆栈在某种程度上没有正确设置:我排除了这一点,因为没有运行时库,一切正常,我确认在我的代码之前没有通过反汇编文件执行其他代码.
PE文件部分很有趣:我检查过,并发现在运行时版本中有两个TLS(线程局部)变量.果然,当我让它们共享(而不是线程本地)时,我的代码工作了!但是,当我调用我在不同文件中编写的代码时,我的代码仍然会出现同样的问题 - 只有kernel.d启动文件才能正确处理字符串; 在其他文件中,数组再次为零.
现在,有没有人猜到为什么会发生这种情况?
如果需要更多信息,我很乐意发布.
谢谢!
MS104-SH4上的U-Boot(2009.03)具有如下所示的RAM存储器映射.
0x8c000000不用于(4kB)
0x8c001000用于Linux内核和根文件系统(3MB)
0x8c400000用于Linux进程(28MB)
对我来说,Linux内核和根文件系统的3MB太小,因为Linux内核和ramdisk分别有1MB和3.5MB.所以我想改变上面的内存映射,例如如下所示.
0x8c000000不使用(4KB)
0x8c001000用于Linux内核和根文件系统(16MB)
0x8cf60000用于Linux进程(16MB)
在我的猜测中,我必须修改uboot源代码,但找不到我应该修改的位置.有人告诉我是否可以修改u-boot内存映射?如果是,请告诉我该怎么做.谢谢你的帮助!
我在如何找到设备的内存映射时发现了一个类似的问题?,但我的SH4 iomem是空的(0大小)所以看起来像其他主题.
我正在为x86构建一个小型引导加载程序作为项目.目前我正在编写几个函数来处理屏幕,因为它有点单调乏味.大多数BIOS中断函数都涉及页码参数,我不知道这是为了什么.我认为,维基百科没有什么可说的.
有谁知道页码代表什么?
谢谢
可能重复:
如何将已编译的引导扇区放入USB记忆棒或磁盘?
我正忙着创建一个基本的引导加载程序,它适用于需要在没有操作系统的情况下运行的软件
我还想写一个小型控制台应用程序,将编译的引导加载程序移动到我的SD卡.
我遇到的问题是将特定的引导加载程序写入SD卡上的Sector0.SD卡插入笔记本电脑上的SD卡插槽.
我可以使用C#控制台应用程序完成此操作吗?如果没有,我有什么选择在SD卡上获取启动加载程序?
更新:引导加载程序是用C语言编写的,我希望将引导加载程序转移到C#的控制台应用程序
在Linux源代码树中,文件arch/x86/boot/header.S具有类似于此的x86代码,以便在被调用之前清除BSS部分main:
...
# Zero the bss
movw $__bss_start, %di
movw $_end+3, %cx
xorl %eax, %eax
subw %di, %cx
shrw $2, %cx
rep; stosl
...
Run Code Online (Sandbox Code Playgroud)
为什么_end地址中添加了3个?为什么不movw $_end, %cx代替movw $_end+3, %cx?
我一直在开发一个简单的引导加载程序,并且在某些环境中偶然发现问题,这些环境中的指令不起作用:
mov si, call_tbl ; SI=Call table pointer
call [call_tbl] ; Call print_char using near indirect absolute call
; via memory operand
call [ds:call_tbl] ; Call print_char using near indirect absolute call
; via memory operand w/segment override
call near [si] ; Call print_char using near indirect absolute call
; via register
Run Code Online (Sandbox Code Playgroud)
这些中的每一个碰巧涉及间接接近CALL到绝对存储器偏移.我发现如果我使用类似的JMP表,我会遇到问题.相对的呼叫和跳转似乎没有受到影响.像这样的代码有效:
call print_char
Run Code Online (Sandbox Code Playgroud)
我已经通过海报讨论了Stackoverflow上提出的建议,讨论了编写引导加载程序的注意事项.特别是我看到这个Stackoverflow回答了一般的Bootloader技巧.第一个提示是:
- 当BIOS跳转到您的代码时,您不能依赖具有有效或预期值的CS,DS,ES,SS,SP寄存器.应在引导加载程序启动时正确设置它们.您只能保证将从物理地址0x07c00加载并运行引导加载程序,并将引导驱动器号加载到DL寄存器中. …
根据本教程,创建一个简单的操作系统就足够了,切换到保护模式就像下面的代码一样简单,无需其他众所周知的操作,如启用A20 ...
无论如何,我是这个领域的新手,我写了下面的代码,因为他们提到了这个SO的修改.
代码结构: 这个简单的操作系统应简要加载如下:
但是,模拟器仍在重新启动.请查看随附的整个代码.
bootloader.asm
[bits 16]
[org 0x7C00]
KERNEL_OFFSET equ 0x1000
xor ax, ax
mov ds, ax
mov es, ax
mov [BOOT_DRIVE], dl
mov ax, 0x07E0 ; End of stack
cli
mov ss, ax
mov sp, 0x1200 ; Size of Stack. By this, we assume that stack starts at 9000h
; of size 1200h and ends at 7E00h to avoid being overwritten.
sti
call load_kernel
call switch_to_pm
jmp $ …Run Code Online (Sandbox Code Playgroud) 我正在开发一个简单而小型的64位操作系统。到目前为止,我只使用一个文件,并使用NASM进行编译:
nasm -f bin os.asm -o os.bin
Run Code Online (Sandbox Code Playgroud)
然后.bin用qemu 测试文件。
现在,我需要在文件中使用多个os.bin文件。我插入了这一行:
extern helper_func
Run Code Online (Sandbox Code Playgroud)
然后在代码中调用它。在另一个.asm文件中,我创建了此函数或过程。问题是bin格式不支持extern,因此我尝试使用ELF格式创建.obj文件,然后将它们与gcc链接:
gcc -m32 -nostdlib -nodefaultlibs -lgcc os.obj helper.obj -t linker.ld
Run Code Online (Sandbox Code Playgroud)
与此链接文件:
ENTRY(_start)
SECTIONS
{
. = 0x7C00;
.text :
{
*(.text);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行.bin已创建的时,qemu无法识别该文件。我做错了什么?
(我使用过gcc是因为我计划将来使用C代码)
实际上,我什至不知道gcc中所有标志的作用。我已经从Internet XD复制了它们。
到目前为止,这是我所做的:
nasm -f elf os.asm -o os.obj
nasm -f elf helper.asm -o helper.obj
gcc -m32 -nostdlib -nodefaultlibs -lgcc os.obj helper.obj -t linker.ld -o myos.bin
objcopy --input-target=elf32-little --output-target=binary myos.bin myos.bin.new
qemu-system-x86_64 myos.bin.new …Run Code Online (Sandbox Code Playgroud) 我闪烁着Sparkfun边缘板与SparkFun串行基本突围- CH340G使用一些的例子是,IDE中提供了公报教程。
尽管它已经正常运行了很多次,主要是针对具有TensorFlow Lite和SparkFun Edge的微控制器上的示例example1_edge_test和AI,有时在闪烁时会收到此消息:
Connecting with Corvette over serial port /dev/ttyUSB0...
Sending Hello.
Received response for Hello
Received Unknown Message
msgType = 0x131
Length = 0x5800
['0x80', '0x6', '0xf0', '0xa5', '0x31', '0x1', '0x0', '0x58', '0x0', '0x3', '0x0', '0x0', '0x0', '0xa0', '0xff', '0x4', '0x0', '0x2', '0x0', '0x0', '0x0', '0x7', '0x0', '0x0', '0x0', '0x1', '0x0', '0x0', '0x0', '0xff', '0xa3', '0x2d', '0xff', '0xff', '0x5f', '0x5', '0x0', '0x1', '0x0', '0x0', '0x0', …Run Code Online (Sandbox Code Playgroud)