标签: bootloader

4
推荐指数
1
解决办法
1457
查看次数

来自Scratch的操作系统

虽然标题是我的问题的一部分,但第二部分不会那么简单.第一部分:假设我想创建自己的操作系统.我怎么去做呢?我知道我必须创建一个bootloader.但是我从哪里去?我必须将它发送到另一个程序,但要做到这一点,该程序已经必须在那里,我必须确切知道它在内存空间的位置.任何提示/教程?

第二个问题.我目前正在研究内存管理,我认为我有一个更好的实现放置算法的理论,但除了理论上我无法真正测试它.一旦我可以创建操作系统(所以这是为了将来参考),我如何实际搞乱主内存,并移动进程?

PS:另外,我是否必须编写自己的文件系统?

编辑:在阅读了当前的评论后,我想修改我所说的内容.当我说"第二部分不会那么简单"时,这似乎是一个不好的选择.我知道两者都是非常艰难的努力,但这对我来说无关紧要.我喜欢学习新事物.而且我并不是说有人为我写一个教程,只是为了指出我正确的方向.

filesystems algorithm operating-system memory-management bootloader

4
推荐指数
1
解决办法
883
查看次数

为什么所有ARM引导加载程序都有汇编代码?

用汇编语言编写可以减少代码大小和执行时间.但是假设我有足够的记忆和足够的时间.我可以只使用C代码并启动设备吗?我的意思是,从开机,直接运行C代码.我对ARM处理器特别感兴趣.

assembly arm bootloader

4
推荐指数
1
解决办法
3064
查看次数

设置起始地址以执行原始二进制文件

Bootloader分为两个阶段.第一阶段用汇编语言编写,只加载第二阶段,第二阶段在C阶段.阶段1加载C中的代码到地址0x0500:0,并跳转到那里.Stage2必须写"hello message"并停止.

我尝试了不同的方法将起始地址设置为原始二进制文件:(但没有任何效果)

cc -nostartfiles -nostdlib -c stage2.c
ld -s -T scrptfile.ld stage2.o /* I'm using ld just to set starting address of executable */
objcopy -O binary stage2 stage2.bin /* delete all unuseful data  */
Run Code Online (Sandbox Code Playgroud)

链接器脚本

SECTIONS
{
    . = 0x0500;
    .text : { *(.text)}
    .data : { *(.data)}
    .bss : { *(.bss)}
}
Run Code Online (Sandbox Code Playgroud)

也许我删除objcopy somethnig应删除.

那我怎么能执行这个stage2.bin呢?

据我所知,使用32位长度指令编写C代码,当原始二进制只允许16?

PS参数-set-start(objcopy)返回错误:无效的bfd目标.这是因为输出文件是二进制的?


谢谢你的回答.

x86 linker gcc osdev bootloader

4
推荐指数
1
解决办法
1415
查看次数

linux内核命令行开关上的三重破折号

我正在尝试添加一个开关,将Linux内核日志发送到XenServer6上的串行控制台.

可以在EXTLinux配置文件(/boot/extlinux.conf)上编辑内核命令选项.

这是一段摘录:

serial 1 115200
default xe
prompt 1
timeout 50

label xe
  # XenServer
  kernel mboot.c32
  append /boot/xen.gz mem=1024G dom0_max_vcpus=4 dom0_mem=752M lowmem_emergency_pool=1M crashkernel=64M@32M console= vga=mode-0x0311 --- /boot/vmlinuz-2.6-xen root=LABEL=root-tfnnfzfp ro xencons=hvc com2=115200,8n1 console=com2 console=hvc0 console=tty0 quiet vga=785 splash --- /boot/initrd-2.6-xen.img

label xe-serial
  # XenServer (Serial)
  kernel mboot.c32
  append /boot/xen.gz com1=115200,8n1 console=com1,vga mem=1024G dom0_max_vcpus=4 dom0_mem=752M lowmem_emergency_pool=1M crashkernel=64M@32M --- /boot/vmlinuz-2.6-xen root=LABEL=root-tfnnfzfp ro console=tty0 xencons=hvc console=hvc0 --- /boot/initrd-2.6-xen.img
Run Code Online (Sandbox Code Playgroud)

---命令行上的三个破折号()是什么意思?

是加载3个启动文件?

xen linux-kernel bootloader

4
推荐指数
1
解决办法
2152
查看次数

第一个OS,一些流水线解释

我正在使用NASM编写我的第一个OS引导扇区.我有它的工作,它只显示"Hello OS world!" 用红色字母.很简单.我已将boot.asm转换为boot.bin,并将其转换为boot.img.我正在使用VMWare播放器,我将boot.img作为软盘驱动器安装并从那里启动它工作得很好.但是这个汇编代码有几行是我不明白的目的.

       org  07c00h                         
       mov  ax, cs
       mov  ds, ax
       mov  es, ax
       call DispStr         
       jmp  $           
   DispStr:
       mov  ax, BootMessage
       mov  bp, ax 
       mov  cx, 16  
       mov  ax, 01301h      ; 
       mov  bx, 000ch       ;
       mov  dl, 0           ;
       int  10h             ;
       ret
   BootMessage:     db  "Hello, OS world!"
       times    510-($-$$)  db  0   
       dw   0xaa55              ; 
Run Code Online (Sandbox Code Playgroud)

以分号结尾的行是我不理解的行.我做了很多谷歌搜索,并能够弄清楚其他的东西.我很擅长写作大会.因此,例如,我知道mov ax,01301h移动01301hAX寄存器.但我不明白为什么,或者有多01301h重要.我猜他们有点像格式化字符串的参数,但这只是猜测.任何和所有的帮助将不胜感激.

x86 assembly bios bootloader

4
推荐指数
1
解决办法
353
查看次数

如何将Linux内核Bin转换为ELF格式

我们有一个没有ELF头的Linux内核二进制文件,我们的引导加载程序将根据来自ELF头的计算加载内核映像(早期的QNX内核映像有ELF头),但由于我们的Linux内核映像没有一个ELF头,我们的引导加载程序拒绝将此内核映像加载到内存中.

由于某些原因,我们没有更改引导加载程序代码的选项,因此我们唯一的选择是将ELF标头插入具有特定入口点的Linux BIN文件中.

实现它的方法是什么?

elf linux-kernel bootloader

4
推荐指数
1
解决办法
1万
查看次数

操作系统开发-在保护模式下执行第一条指令

我指的是Broken Thorn的OS开发教程。我目前处于执行第二阶段引导加载程序以加载GDT并进入保护模式的阶段。

我了解了GDT的工作原理以及如何进入保护模式。但是,我对加载cr0寄存器后执行的第一条指令感到困惑:

jmp 08h:Stage3      ; far jump to fix CS. Remember that the code selector is 0x8!
Run Code Online (Sandbox Code Playgroud)

此时,CS尚未加载指向代码描述符的选择器值,并且我们已经处于保护模式。此CS值可能与用于执行实模式指令的值不同,因此,增加IP的值也将导致地址不同于的地址jmp。那么这是否会导致基于CS的值执行一些垃圾代码?还是我缺少什么?

assembly operating-system protected-mode osdev bootloader

4
推荐指数
1
解决办法
316
查看次数

第二阶段引导加载程序有什么需求?为什么会有不同的引导程序,例如第一阶段和第二阶段?

我知道第一阶段的引导加载程序将进行基本的硬件初始化,并像u-boot一样调用第二阶段的引导加载程序。但是我仍然不明白为什么我们需要多个阶段的引导加载程序。

为什么我们不能只有一个引导加载程序,我们在其中刷新单个映像来初始化硬件?仅一步引导加载程序直接加载内核映像会有什么不利之处?为了更清楚地说明,我将ARM CORTEX A8用于beagle骨黑,我将MLO,U引导和内核映像放置在引导部分中,据我所知,第一阶段引导加载程序会初始化您的外部RAM,复制U引导,这初始化了更多的外围设备,为什么我不能直接选择内核映像而不是第二阶段的引导加载程序

linux android linux-kernel embedded-linux bootloader

4
推荐指数
2
解决办法
5132
查看次数

引导加载程序后如何从实模式切换到保护模式?

我刚刚为我的操作系统完成了一个非常简单的引导加载程序,现在我正在尝试切换到保护模式并跳转到内核.

内核存在于第二个扇区(在引导加载程序之后)并且打开.

任何人都可以帮我解决我的代码吗?我添加了评论,以显示我的困惑在哪里.

谢谢.

BITS 16 

global start
start:
    ; initialize bootloader and stack
    mov     ax, 0x07C0
    add     ax, 288
    mov     ss, ax
    mov     sp, 4096
    mov     ax, 0x07C0
    mov     ds, ax

    call    kernel_load
    hlt

kernel_load:
    mov     si, k_load
    call    print

    mov     ax, 0x7C0
    mov     ds, ax
    mov     ah, 2
    mov     al, 1
    push    word 0x1000
    pop     es
    xor     bx, bx
    mov     cx, 2
    mov     dx, 0
    int     0x13

    jnc     .kjump
    mov     si, k_fail
    call    print
    ret

.kjump:
    mov     si, …
Run Code Online (Sandbox Code Playgroud)

x86 operating-system real-mode protected-mode bootloader

4
推荐指数
1
解决办法
5533
查看次数