16位内核有错误

时间:2015-01-04 16:50:59

标签: c windows gcc operating-system kernel

现在已经有一段时间了,我正在处理操作系统和开发。所以我开始在Windows中使用MinGW编译器(GCC)进行项目。我想在跳转到保护模式之前先创建一个16位操作系统和一个迷你DOS。我开始为它的发展。一切顺利,但当我第一次在博世编译并执行操作系统时,发生了一件非常令人惊讶的事情。我试图将欢迎打印到我的操作系统并使用shell样式从用户那里获取一些输入,但是在屏幕上没有文字出来,只有光标闪烁。我很困惑,为什么它发生了,我看了下代码,有错误,我修复它们并重新尝试,但它失败了。最后我需要帮助!

我在使用什么

  1. C编译器(GCC)(CodeBlocks MinGW)。
  2. NASM Assembler。
  3. 链接器和objcopy等(随CodeBlocks MinGW提供)。
  4. Boschs Emulator。
  5. 有什么错误

    1. 屏幕上没有任何内容。
    2. Boschs有时会发出'virutal_read_byte_32:段数限制违规'错误。
    3. 我需要什么帮助

      1. 修复程序中的任何错误并解释您的解决方案。
      2. 代码

        Kernel.c

        asm(".code16 \n");
        
        int strlen(const char *str)
        {
            int cnt = 0;
        
            while(str[cnt] != 0)
            {
              cnt++;
            }  
        
            return cnt;
        }
        
        void printChar(char ch)
        {
           asm volatile ("mov ah , 0x0e");
           asm volatile ("mov al , %0" : : "r" (ch));
           asm volatile ("int 0x10"); 
        }
        
        void printf(const char *str)
        {
          int len = strlen(str);
          int cnt = 0;
        
          while(cnt < len)
          {
            printChar(str[cnt]); 
          }
        }
        
        void kmain( )
        {
            printf("Welcome to My Operating System!");
            jmp:
              // Hang.
            goto jmp; 
        }
        

        Boot.asm

        [org 0x7c00] ;
        [bits 16] ;
        
          mov [boot_drive] , dl ;
          mov bp , 0x9000 ;
          mov sp , bp ;
        
          mov bx , miniOS_booting ;
          call print_string ;
        
          call delay ;
          call newline ;
        
          mov bx , miniOS_bootdone ;
          call print_string ;
        
          call delay ;
        
          mov bx , 0x1000 ;
          mov dh , 1 ;
          mov dl , [boot_drive] ;
          call disk_load ;
        
          mov ah , 0x0 ;
          mov al , 0x2 ;
          int 0x10 ;
        
          jmp 0000:0x1000 ;
          jmp $ ;
        
        disk_load:
              mov ah , 2 ; Read Sector Function
              mov al , dh  ; Number of sectors to read
              mov dh , 0 ; Head
              mov ch , 0 ; Track / Cylinder
              mov cl , 2 ; Start From 
        
              int 0x13 ;
        
              jc disk_error ;  
           ret ;
        
        disk_error:
               call newline ;
               mov bx , miniOS_boot_error ;
               call print_string ;
               jmp $ ;
        
        newline:
              pusha;
              mov ah , 0x0e ;
              mov al , 10 ;
              int 0x10 ;
              mov al , 13 ;
              int 0x10 ;
              popa ;
              ret ;
        
        print_string:
            pusha;
                mov ah, 0x0e ;
                pnt:
                 mov al , [bx] ;
                 cmp al , 0 ;
                 je done ;
                 int 0x10 ;
                 add bx , 1;
                 jmp pnt ;
            done:
            popa;
            ret;
        
        delay:
        MOV     CX, 0FH
        MOV     DX, 4240H
        MOV     AH, 86H
        INT     15H    
        ret ;
        
        miniOS_booting:
           db 'Booting Mini OS .' , 0 ;
        
        miniOS_bootdone:
           db 'Booting Done .' , 0 ;
        
        miniOS_boot_error:
           db 'Error Booting.' , 0 ;
        
        boot_drive:
             db 0 ; 
        
        times 510 - ($ - $$) db 0;   
        dw 0xaa55 ;
        

        Entry.asm

        [bits 16]
        [extern _kmain]
        
        ___main:
        call _kmain ;
        
        jmp $ ;
        

        命令

        nasm -f bin Boot.asm -o Boot.bin
        nasm -f elf Entry.asm -o Entry.o
        gcc -ffreestanding -c Kernel.c -o Kernel.o -masm=intel
        ld -T NUL -Ttext 0x1000 -o Kernel.tmp Entry.o Kernel.o
        objcopy -O binary -j .text Kernel.tmp Kernel.bin
        copy /b Boot.bin+Kernel.bin OS
        

        Boschs

        floppya : 1_44 = OS , status = inserted
        boot : a
        

        感谢所有用户帮助我解决这个问题。

0 个答案:

没有答案