我已经开始学习装配.我遇到过这些问题.
;*************************************************;
; OEM Parameter block / BIOS Parameter Block
;*************************************************;
TIMES 0Bh-$+start DB 0
bpbBytesPerSector: DW 512
bpbSectorsPerCluster: DB 1
bpbReservedSectors: DW 1
Run Code Online (Sandbox Code Playgroud)
我对第一行声明"bpbBytesPerSector:DW 512"感到困惑.在这里我认为DW是定义单词.因此DW 512意味着定义512个字意味着1024个字节.现在标签是"bpbBytesPerSector".每个扇区的字节数应为512(这是我的想法).同样,我无法理解接下来的两行.我对这完全感到困惑.任何人都可以解释一下.谢谢.
有没有关于在Linux中运行某些可执行文件时会发生什么的良好文档.例如:我开始./a.out,所以可能运行一些引导加载程序程序集(带有c运行时?),它在程序中找到起始符号,进行动态重定位,最后调用main.
我知道上面的内容不正确,但是要查找有关此过程如何发生的详细文档.你能解释一下,还是指出那些链接或书籍?
我在网上冲浪时发现了512字节的os竞赛.
一切都安装在bootsector中.
在阅读了一些源文件后,
我发现cli在开始例程之前总会有指令.(在组装中)
use16
org 7c00h
jmp 0:start
start:
cli
do something here..(this section sometimes include int 10h)
Run Code Online (Sandbox Code Playgroud)
我想知道的是
为什么cli在开始常规之前是必要的
之后cli,有时候,他们会使用中断!就像int 10h我想知道为什么他们cli会在正常情况下使用中断?
这可能是操作系统特定的我不确定(我在Linux上工作).当BIOS将引导加载程序带入内存并且CPU开始执行它时,它如何定位操作系统?它是存储在特殊的磁盘分区/知名扇区等吗?如果它存储在文件系统上,则引导加载程序需要与存储在OS中的文件系统代码交互.这个鸡蛋问题怎么解决了?
我想知道Ubuntu 13.04中存在哪些库允许与Grub2集成以及它的更多细节(即语言,开发阶段,开发人员等),或者如果不能这样做,为什么?
我还认为可以在Surface Pro架构中使用本机设备代码,但是没有如何开始的经验.如果有可能请告诉我!
编辑: 2013年3月14日@太平洋标准时间下午5:40
我一直在努力寻找并在Ubuntu 13.04下找到以下软件包:
根据一些教程,我们将在bootlaoder的开头禁用MMU和I/D-Caches.如果我理解正确,它的目的是直接在程序中使用物理地址,所以如果我错了请纠正我.谢谢!
其次,我们这样做是为了禁用MMU和缓存:
mrc P15,0,R0,C1,C0,0
bic R0,R0,#0x00002300 @ clear bits 13,9:8
bic R0,R0,#0x00000087 @清除位7,2:0
orr R0,R0,#0x00000002 @ set bit 2(A)对齐
orr R0,R0,#0x00001000 @设置位12(I)I-Cache
mcr P15,0,R0,C1,C0,0
D-Cache,MMU和数据地址对齐故障检查已被清除位2:0禁用,但为什么我们在下列仪器中立即启用位2?要确保此操作有效?
最后一个问题是为什么D-cache被禁用但是I-caches能够?加快仪器加工?
我正在制作一个bootloader.在向该块中的那些寄存器写入任何内容之前,我必须擦除1024字节的内存.即使我想写2个字节,我也不得不擦除1024个字节.我的问题是我不知道每个块的起始位置.例如,假设我想将以下字节写入此地址.
地址: 0x198F0
字节:C80E00010001616FDFECD6F08C8C92EC
当我尝试从地址开始擦除1024个字节时,0x198F0我注意到它开始从中删除0x19800.
我怎么知道每个块从哪里开始,所以我可以在软件中计算它?
我想知道这个的原因是我可以在擦除它之前将整个块复制到ram中,然后修改它,然后将它写回到同一个块中.我正在使用PIC18f87J11和MPLAB XC8编译器.我希望清楚我想要做什么,否则请在评论中告诉我.
谢谢!
我有一些关于ATMEL和ATMEL引导程序的背景知识,我们正在转向ARM进行一个新项目.特别是我们将使用STM32F303RET6.这基本上是具有更多模拟输入引脚的Cortex M4.
我一直在阅读有关引导程序的文档,我非常困惑:
在" 入门文档"的第19页上,它说明了以下内容:
"嵌入式引导加载程序位于系统内存中,由ST在生产期间编程 "
此外,应用笔记AN2606,第81页提到这种内置的引导加载程序不支持通过USB编程.(仅限UART,I2C或CAN)
但是在Internet上的其他地方(例如这个,虽然对于F103)我已经读到了使用ST-link V2(ISP)编程引导加载程序的必要性.
在这一切中我很困惑所以这里是我的问题:
我知道我很困惑,我真的很感谢你的帮助.
谢谢佩德罗
我有一个简单的操作系统(实模式),用NASM(只有bootloader)编写,大多数用C编写.
我想打印这个字符:ñ,我使用这个函数使用int 10h将字符打印到屏幕:
void putch(char chr)
{
__asm__ __volatile__ ("int $0x10"
:
: "a" ((0x0e<<8) | chr),
"b" (0x0000));
}
void println(char *str)
{
while (*str)
putch(*str++);
}
Run Code Online (Sandbox Code Playgroud)
现在,我尝试打印ñ:
println("ñ\r\n");
Run Code Online (Sandbox Code Playgroud)
但是当我编译并执行时(在qemu和VB框中),字符"ñ"被忽略.我用CP-437编码保存了源代码,但问题仍然存在.这也会影响所有扩展的ASCII字符.
这是由UEFI固件还是由GRUB grubx64.efi引导加载程序处理?
我看着https://wiki.osdev.org/UEFI声称:
UEFI固件...还准备了具有平面分段的保护模式环境,并为x86-64 CPU准备了具有身份映射分页的长模式环境。A20门也被启用。
但找不到任何官方资源来备份此信息。UEFI规范没有提及这一点。
linux内核提供了一个efi-stub,可以用作引导加载程序,但是在检查了其源之后,我看不到它是否启用了A20。因此,我仍然不知道它是UEFI固件的工作还是Bootloader的工作。
(我想为UEFI编写自己的引导程序,并想了解UEFI固件提供了“开箱即用”的设置以及我必须实现的部分)