linux内核使用一种ram磁盘在早期启动阶段访问模块.出于好奇,我想了解我有一个问题:在这个阶段,内核必须可以访问包含initramfs/initrd的文件.这意味着内核必须支持适当的文件系统.那么为什么initramfs的内容不能和普通文件在同一个文件系统中呢?
我想将我的引导加载程序复制到自身内部的第一个扇区(512)(我应该使用bios中断13h),我发现这个代码:
mov bx, buffer1 ; set BX to the address (not the value) of BlahBlah
mov ah,03h ;When ah=, int13 reads a disk sector
mov al,5 ;Al is how many sectors to read
mov cl,0 ;Sector Id
mov dh,0 ;Head
mov dl,80h ;Drive (0 is floppy)
mov cx,512 ;One sector /2
mov ah, 0x3 ; set function 2h
int 0x13
Run Code Online (Sandbox Code Playgroud)
不行不通!
我正在为 x86 编写游戏引导程序。有一次,在启动初期,我需要将启动驱动器中的一些扇区加载到内存中。我用中断 0x13 (ah=02) 来做到这一点,当我在我的虚拟机中尝试它时,它就像一个魅力。但是,当我将映像刻录到 USB 驱动器时,机器无法启动,我将其固定到扇区加载指令,显然我的 USB 驱动器不是驱动器 0(软盘 A),因此读取失败。
如何确定用于启动的驱动器?
谢谢!
我目前正在研究Stellaris ARM微控制器板的固件,我正在运行SYS/BIOS RTOS.
当我上传固件时,我想知道主板上是否需要引导加载程序.我可以使用.bin文件覆盖闪存上的引导加载程序,或者我是否需要偏移起始地址以保留引导加载程序.
我是Linux新手并且学习Linux如何了解可用的物理存储器.我知道有一些BIOS系统调用int 0x15,它将为你提供E20内存映射.
现在我找到了一段代码,其中说明了将EFI内存映射转换为E820内存映射的定义.上面的意思是什么?
这是否意味着主板固件是基于EFI的,但由于此代码在x86上运行,我们需要将其转换为E820内存映射
如果是这样,x86是否只知道E820内存映射?
E820和EFI内存映射有什么区别?
期待得到详细的答案.
我有一个小的引导程序文件(512 B),我想测试而不会破坏我的电脑.是否有任何虚拟机程序可以让我这样做?
我是这些设备的新手,即使它们非常便宜,我也不会不必要地想要它们.
我用esptool将NodeMCU固件刷到我的模块上.这样做时,我需要指定文件写入的地址,通常是0x00000.这是否意味着固件实际上包含引导加载程序?或者它位于闪光灯的单独区域?
如果引导加载程序本身包含在固件文件中,那么中断的闪存过程会使模块无效,我想?
谢谢你的澄清!
我正在编写一个简单的操作系统,我在emu8086中编写了bootloader和内核,然后我写入了软盘扇区.当我从emu内部的软盘驱动器启动时,一切正常,但是当我从虚拟机内的软盘启动时 - 它无法进行操作.
例如,以下命令获取系统日期和时间:
infoCommand:
lea si, info_msg
call printString
;Day Part
mov ah, 2Ah ; To get System Date
int 21h
mov al, dl ; Day is in DL
aam
mov bx, ax
call disp
mov dl, '/'
mov ah, 02h ; To Print / in DOS
int 21h
;Month Part
mov ah, 2Ah ; To get System Date
int 21h
mov al, dh ; Month is in DH
aam
mov bx, ax
call disp
mov dl, '/'
mov …Run Code Online (Sandbox Code Playgroud) 我正在学习操作系统开发和课程初学者.我想在实模式环境中构建我的系统,这是一个使用C语言的16位环境.
在C中,我使用函数asm()将代码转换为16位,如下所示:
asm(".code16")
Run Code Online (Sandbox Code Playgroud)
在GCC的语言中生成16位可执行文件(不完全如此).
题:
假设我有两个头文件head1.h和head2.h和main.c文件.main.c文件内容如下:
asm(".code16");
#include<head1.h>
#include<head2.h>
int main(){
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在,自从我开始我的代码的命令生成16位可执行文件,然后包括head1.h和head2.h,我需要做的,我创建的所有头文件一样吗?(或)添加asm(".code16");一次是否足够?
操作系统:Ubuntu
编译器:Gnu CC
我正在编写一个简单的引导程序,并且有一个getch功能。
char getch()
{
uint16_t inchar;
__asm__ __volatile__ ("int $0x16\n\t"
: "=a"(inchar)
: "0"(0x0));
return (char)inchar;
}
Run Code Online (Sandbox Code Playgroud)
我尝试了第一个显而易见的解决方案,即删除inchar变量对char的强制转换,但是当我打印它时,仍然返回char而不是代码。
我的println实现:
void println(char *str)
{
while (*str)
{
// AH=0x0e, AL=char to print, BH=page, BL=fg color
__asm__ __volatile__ ("int $0x10"
:
: "a" ((0x0e<<8) | *str++),
"b" (0x0000));
}
}
Run Code Online (Sandbox Code Playgroud)
链接描述文件:
ENTRY(start);
SECTIONS
{
. = 0x7C00;
.text : {
/* Place the code in hw.o before all other code */
boot.o(.text);
*(.text);
}
/* Place …Run Code Online (Sandbox Code Playgroud)