当前位置:  技术问答>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)
  }
}

|
// 编译命令: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

见谢煜波-操作系统引导探究

|
jmp dword SYSSEG:SYSOFFSET; 跳到内核代码去执行,启动扇区引导程序结束. 
  这个跳转有问题,现在已进入保护模式,应用段选择子
  jmp dword 0x10:SYSOFFSET  (0X10 指 dd 0x0000ffff,0x00cf9a00; 0x10(index=2) kernel 4GB code at 0x00000000 )

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 安装Redhat7.1在分/boot区时,划了16M为/boot区却总是报错:Boot pattiton > 1024 Cylinders
  • WEB前端 iis7站长之家
  • 编译u-boot时出现???libgcc.a uses hardware FP, whereas u-boot uses software FP
  • 要实现多启动,安装时Master Boot Record和First Sector of Boot Partition,到底应该选哪个?
  • UBOOT编译完后生成的u-boot.img(注意不是u-boot.bin)是什么文件?如何解析它?
  • 救命啊::我Redhat7.3重编内核得一个bzImage文件,我把它COPY到了/boot/下,并修改了/etc/lilo.conf文件image=/boot/bzImage,后lilo -v !怎
  • 关于/boot 分区的作用(grub)
  • 100分请教u-boot.lds链接脚本的问题
  • /boot分区作什么用?
  • u-boot 关于makefile的疑问
  • the mode of kernel booting
  • 关于U-boot的调试、、???
  • SCOUNIX启动时如何默认登录(不用在BOOT提示符下回车)
  • grub 安在/boot分区 无法双启动的问题
  • 怎样利用u-boot烧写??
  • 如何设置u-boot变量ip地址?
  • BOOT分区的问题
  • 移植u-boot的问题
  • Spring Boot
  • 请教,刚下载了一个U_boot 1.2.0源码,能直接编译?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3