push word 0b800h
pop es
xor di, di
mov [es:di], word 441h
jmp $
times 510 - ($-$$) db 0
db 55h
db 0AAh
Run Code Online (Sandbox Code Playgroud) 虽然标题是我的问题的一部分,但第二部分不会那么简单.第一部分:假设我想创建自己的操作系统.我怎么去做呢?我知道我必须创建一个bootloader.但是我从哪里去?我必须将它发送到另一个程序,但要做到这一点,该程序已经必须在那里,我必须确切知道它在内存空间的位置.任何提示/教程?
第二个问题.我目前正在研究内存管理,我认为我有一个更好的实现放置算法的理论,但除了理论上我无法真正测试它.一旦我可以创建操作系统(所以这是为了将来参考),我如何实际搞乱主内存,并移动进程?
PS:另外,我是否必须编写自己的文件系统?
编辑:在阅读了当前的评论后,我想修改我所说的内容.当我说"第二部分不会那么简单"时,这似乎是一个不好的选择.我知道两者都是非常艰难的努力,但这对我来说无关紧要.我喜欢学习新事物.而且我并不是说有人为我写一个教程,只是为了指出我正确的方向.
filesystems algorithm operating-system memory-management bootloader
用汇编语言编写可以减少代码大小和执行时间.但是假设我有足够的记忆和足够的时间.我可以只使用C代码并启动设备吗?我的意思是,从开机,直接运行C代码.我对ARM处理器特别感兴趣.
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目标.这是因为输出文件是二进制的?
谢谢你的回答.
我正在尝试添加一个开关,将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个启动文件?
我正在使用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移动01301h到AX寄存器.但我不明白为什么,或者有多01301h重要.我猜他们有点像格式化字符串的参数,但这只是猜测.任何和所有的帮助将不胜感激.
我们有一个没有ELF头的Linux内核二进制文件,我们的引导加载程序将根据来自ELF头的计算加载内核映像(早期的QNX内核映像有ELF头),但由于我们的Linux内核映像没有一个ELF头,我们的引导加载程序拒绝将此内核映像加载到内存中.
由于某些原因,我们没有更改引导加载程序代码的选项,因此我们唯一的选择是将ELF标头插入具有特定入口点的Linux BIN文件中.
实现它的方法是什么?
我指的是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的值执行一些垃圾代码?还是我缺少什么?
我知道第一阶段的引导加载程序将进行基本的硬件初始化,并像u-boot一样调用第二阶段的引导加载程序。但是我仍然不明白为什么我们需要多个阶段的引导加载程序。
为什么我们不能只有一个引导加载程序,我们在其中刷新单个映像来初始化硬件?仅一步引导加载程序直接加载内核映像会有什么不利之处?为了更清楚地说明,我将ARM CORTEX A8用于beagle骨黑,我将MLO,U引导和内核映像放置在引导部分中,据我所知,第一阶段引导加载程序会初始化您的外部RAM,复制U引导,这初始化了更多的外围设备,为什么我不能直接选择内核映像而不是第二阶段的引导加载程序
我刚刚为我的操作系统完成了一个非常简单的引导加载程序,现在我正在尝试切换到保护模式并跳转到内核.
内核存在于第二个扇区(在引导加载程序之后)并且打开.
任何人都可以帮我解决我的代码吗?我添加了评论,以显示我的困惑在哪里.
谢谢.
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)