当前位置: 技术问答>linux和unix
boot程序切换到保护模式也不正确,导致了bochs虚拟机重新启动
来源: 互联网 发布时间:2015-11-09
本文导语: 我的boot程序切换到保护模式也不正确,导致了bochs虚拟机重新启动 我把代码贴出来,各位高手帮忙看看,谢谢! ; boot.asm 代码如下 ; 编译命令:nasm -d _FLOPPY_ -f bin boot.asm -o BOOT BOOTSEG EQU 0x07c0 ; boot...
我的boot程序切换到保护模式也不正确,导致了bochs虚拟机重新启动
我把代码贴出来,各位高手帮忙看看,谢谢!
; boot.asm 代码如下
; 编译命令:nasm -d _FLOPPY_ -f bin boot.asm -o BOOT
BOOTSEG EQU 0x07c0 ; boot segment.
INITSEG EQU 0x9000 ; new position of boot segment.
SYSSEG EQU 0x1000 ; OS image system segment.
SYSOFFSET EQU 0x0000 ; kernel偏移地址
%macro EnableA20 0
push ax
in al,92h
or al,00000010b
out 92h,al
pop ax
%endmacro
bits 16 ;仅使用16位指令,不涉及32位指令
org 0h ;可以生成.com文件
%ifdef _FLOPPY_
jmp short start ;跳转到真正的指令处
nop ;保证3字节
;-----------------软驱BPB---------------------------------------------
.....(软驱参数代码,省略)
%endif ; %ifdef _FLOPPY_
start:
cli
....(省略,搬移自身到段INITSEG(0x9000:0000))
JMP INITSEG:go ; jump to new position and continue.
go:
mov ax, INITSEG
mov ds, ax
mov es, ax
; create stack
mov ss, ax
mov sp, 0x400 ; arbitrary value >>512
sti
...(从第二扇区装入内核映像到段SYSSEG(0x1000:0000))
; 向保护模式切换,导致了重新启动
mov ax,cs ; right, forgot this at first. didn't work :-)
mov ds,ax
lidt [idt_48] ; load idt with 0,0
lgdt [gdt_48] ; load gdt with whatever appropriate
; that was painless, now we enable A20
cli ; 关中断
EnableA20
mov eax, cr0 ; set bit PE
or eax, 1
mov cr0, eax
jmp dword SYSSEG:SYSOFFSET; 跳到内核代码去执行,启动扇区引导程序结束.
....(其他函数代码,省略)
;----------------------数据区-------------------------------------------
...(其他数据定义,略)
retries db 3 ;重复读盘次数
_gdt:
dd 0x00000000,0x00000000 ;/* NULL descriptor */
dd 0x00000000,0x00000000 ;/* not used */
dd 0x0000ffff,0x00cf9a00 ;/* 0x10(index=2) kernel 4GB code at 0x00000000 */
dd 0x0000ffff,0x00cf9200 ;/* 0x18(index=3) kernel 4GB data at 0x00000000 */
idt_48:
dw 0 ; idt limit=0
dw 0,0 ; idt base= 0x0000,0000
gdt_48:
_gdt_l:
dw 0x0020 ; gdt limit = 0x20 = 4 * 8 ( 4 个描述符 )
_gdt_a:
_gdt_a_lw:
dw _gdt ; gdt base = 0x0009,xxxx = 0x9000:_gdt (INITSEG:_gdt)
_gdt_a_hw:
dw 0x9
loadmsg DB 'Loading system ...', 0
times 510-($-$$) db 0 ;保证boot区有512个字节
dw 0AA55h ;boot区标记
;---------------------------------End------------------------------
// Entry.asm 内核映像入口函数代码, 后面列出了 kernel.ld 文件内容
// 编译命令:nasmw -f aout -o Entry.o Entry.asm
// 链接命令:ld -T kernel.ld Entry.o -o Kernel
[BITS 32]
[global start]
[extern _dispstr]
[extern _putchar]
[extern _Test]
__KERNEL_CS EQU 0x10 ;
__KERNEL_DS EQU 0x18 ;
[SECTION .text]
start:
; stop using bootloader GDT, and load new GDT
lgdt [gdt_ptr]
xor eax,eax
mov eax,__KERNEL_DS
mov ds,eax
mov es,eax
mov ss,eax
mov fs,eax
mov gs,eax
mov sp, 0x400 ;
sti ; 开中断
mov ax, 'X'
push ax
call _putchar
;call _Test
hang: jmp hang
;-----------------------------------------------;
_gdt:
dd 0x00000000,0x00000000 ; NULL descriptor
dd 0x00000000,0x00000000 ; not used
dd 0x0000ffff,0x00cf9a00 ; 0x10(index=2) kernel 4GB code at 0x00000000
dd 0x0000ffff,0x00cf9200 ; 0x18(index=3) kernel 4GB data at 0x00000000
_gdt_end:
gdt_ptr:
dw _gdt_end - _gdt - 1
dd _gdt ; gdt base address
startsys DB 'Starting system ...', 0
OKmsg DB '[Ok]', 13, 10, 0
FAILmsg DB '[Fail]', 13, 10, 0
// Kernel.ld 文件内容
OUTPUT_FORMAT("binary")
ENTRY(start)
SECTIONS
{
.text 0x10000000: {
*(.text)
}
.data : {
*(.data)
}
.bss :
{
*(.bss)
}
}
我把代码贴出来,各位高手帮忙看看,谢谢!
; boot.asm 代码如下
; 编译命令:nasm -d _FLOPPY_ -f bin boot.asm -o BOOT
BOOTSEG EQU 0x07c0 ; boot segment.
INITSEG EQU 0x9000 ; new position of boot segment.
SYSSEG EQU 0x1000 ; OS image system segment.
SYSOFFSET EQU 0x0000 ; kernel偏移地址
%macro EnableA20 0
push ax
in al,92h
or al,00000010b
out 92h,al
pop ax
%endmacro
bits 16 ;仅使用16位指令,不涉及32位指令
org 0h ;可以生成.com文件
%ifdef _FLOPPY_
jmp short start ;跳转到真正的指令处
nop ;保证3字节
;-----------------软驱BPB---------------------------------------------
.....(软驱参数代码,省略)
%endif ; %ifdef _FLOPPY_
start:
cli
....(省略,搬移自身到段INITSEG(0x9000:0000))
JMP INITSEG:go ; jump to new position and continue.
go:
mov ax, INITSEG
mov ds, ax
mov es, ax
; create stack
mov ss, ax
mov sp, 0x400 ; arbitrary value >>512
sti
...(从第二扇区装入内核映像到段SYSSEG(0x1000:0000))
; 向保护模式切换,导致了重新启动
mov ax,cs ; right, forgot this at first. didn't work :-)
mov ds,ax
lidt [idt_48] ; load idt with 0,0
lgdt [gdt_48] ; load gdt with whatever appropriate
; that was painless, now we enable A20
cli ; 关中断
EnableA20
mov eax, cr0 ; set bit PE
or eax, 1
mov cr0, eax
jmp dword SYSSEG:SYSOFFSET; 跳到内核代码去执行,启动扇区引导程序结束.
....(其他函数代码,省略)
;----------------------数据区-------------------------------------------
...(其他数据定义,略)
retries db 3 ;重复读盘次数
_gdt:
dd 0x00000000,0x00000000 ;/* NULL descriptor */
dd 0x00000000,0x00000000 ;/* not used */
dd 0x0000ffff,0x00cf9a00 ;/* 0x10(index=2) kernel 4GB code at 0x00000000 */
dd 0x0000ffff,0x00cf9200 ;/* 0x18(index=3) kernel 4GB data at 0x00000000 */
idt_48:
dw 0 ; idt limit=0
dw 0,0 ; idt base= 0x0000,0000
gdt_48:
_gdt_l:
dw 0x0020 ; gdt limit = 0x20 = 4 * 8 ( 4 个描述符 )
_gdt_a:
_gdt_a_lw:
dw _gdt ; gdt base = 0x0009,xxxx = 0x9000:_gdt (INITSEG:_gdt)
_gdt_a_hw:
dw 0x9
loadmsg DB 'Loading system ...', 0
times 510-($-$$) db 0 ;保证boot区有512个字节
dw 0AA55h ;boot区标记
;---------------------------------End------------------------------
// Entry.asm 内核映像入口函数代码, 后面列出了 kernel.ld 文件内容
// 编译命令:nasmw -f aout -o Entry.o Entry.asm
// 链接命令:ld -T kernel.ld Entry.o -o Kernel
[BITS 32]
[global start]
[extern _dispstr]
[extern _putchar]
[extern _Test]
__KERNEL_CS EQU 0x10 ;
__KERNEL_DS EQU 0x18 ;
[SECTION .text]
start:
; stop using bootloader GDT, and load new GDT
lgdt [gdt_ptr]
xor eax,eax
mov eax,__KERNEL_DS
mov ds,eax
mov es,eax
mov ss,eax
mov fs,eax
mov gs,eax
mov sp, 0x400 ;
sti ; 开中断
mov ax, 'X'
push ax
call _putchar
;call _Test
hang: jmp hang
;-----------------------------------------------;
_gdt:
dd 0x00000000,0x00000000 ; NULL descriptor
dd 0x00000000,0x00000000 ; not used
dd 0x0000ffff,0x00cf9a00 ; 0x10(index=2) kernel 4GB code at 0x00000000
dd 0x0000ffff,0x00cf9200 ; 0x18(index=3) kernel 4GB data at 0x00000000
_gdt_end:
gdt_ptr:
dw _gdt_end - _gdt - 1
dd _gdt ; gdt base address
startsys DB 'Starting system ...', 0
OKmsg DB '[Ok]', 13, 10, 0
FAILmsg DB '[Fail]', 13, 10, 0
// Kernel.ld 文件内容
OUTPUT_FORMAT("binary")
ENTRY(start)
SECTIONS
{
.text 0x10000000: {
*(.text)
}
.data : {
*(.data)
}
.bss :
{
*(.bss)
}
}
|
// 编译命令:nasmw -f aout -o Entry.o Entry.asm
// 链接命令:ld -T kernel.ld Entry.o -o Kernel
nasmw -f elf -o Entry.o Entry.asm
ld -o Kernel -Ttext 0x0 -e start Entry.o
objcopy -R .note -R .comment -S -O binary Kernel
见谢煜波-操作系统引导探究
// 链接命令:ld -T kernel.ld Entry.o -o Kernel
nasmw -f elf -o Entry.o Entry.asm
ld -o Kernel -Ttext 0x0 -e start Entry.o
objcopy -R .note -R .comment -S -O binary Kernel
见谢煜波-操作系统引导探究
|
jmp dword SYSSEG:SYSOFFSET; 跳到内核代码去执行,启动扇区引导程序结束.
这个跳转有问题,现在已进入保护模式,应用段选择子
jmp dword 0x10:SYSOFFSET (0X10 指 dd 0x0000ffff,0x00cf9a00; 0x10(index=2) kernel 4GB code at 0x00000000 )
这个跳转有问题,现在已进入保护模式,应用段选择子
jmp dword 0x10:SYSOFFSET (0X10 指 dd 0x0000ffff,0x00cf9a00; 0x10(index=2) kernel 4GB code at 0x00000000 )
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。