OSDev.org
https://forum.osdev.org/

Questions about Higher Half Kernel
https://forum.osdev.org/viewtopic.php?f=1&t=32539
Page 1 of 1

Author:  AwfulMint [ Sat Nov 04, 2017 7:37 pm ]
Post subject:  Questions about Higher Half Kernel

1. How I implement the code of http://wiki.osdev.org/Higher_Half_x86_Bare_Bones to the old one?

2. I have a error when compiling, all ASM methods seens wrong, but the old file works fine, what's happen?

Code:
kernel/loader.s: Assembler messages:
kernel/loader.s: Warning: end of file not at end of a line; newline inserted
kernel/loader.s:1: Error: no such instruction: `global _loader'
kernel/loader.s:2: Error: no such instruction: `extern kernel_main'
kernel/loader.s:4: Error: no such instruction: `modulealign equ 1<<0'
kernel/loader.s:5: Error: no such instruction: `meminfo equ 1<<1'
kernel/loader.s:6: Error: no such instruction: `flags equ MODULEALIGN|MEMINFO'
kernel/loader.s:7: Error: no such instruction: `magic equ 0x1B4DB002'
kernel/loader.s:8: Error: no such instruction: `checksum equ -(MAGIC+FLAGS)'
kernel/loader.s:10: Error: no such instruction: `kernel_virtual_base equ 0xC0000000'
kernel/loader.s:11: Error: no such instruction: `kernel_page_number equ (KERNEL_VIRTUAL_BASE>>22)'
kernel/loader.s:13: Error: no such instruction: `section .data'
kernel/loader.s:14: Error: no such instruction: `align 0x1000'
kernel/loader.s:16: Error: no such instruction: `dd 0x00000083'
kernel/loader.s:17: Error: no such instruction: `times (KERNEL_PAGE_NUMBER - 1)dd 0'
kernel/loader.s:18: Error: no such instruction: `dd 0x00000083'
kernel/loader.s:19: Error: no such instruction: `times (1024 - KERNEL_PAGE_NUMBER - 1)dd 0'
kernel/loader.s:21: Error: no such instruction: `section .text'
kernel/loader.s:22: Error: no such instruction: `align 4'
kernel/loader.s:24: Error: no such instruction: `dd MAGIC'
kernel/loader.s:25: Error: no such instruction: `dd FLAGS'
kernel/loader.s:26: Error: no such instruction: `dd CHECKSUM'
kernel/loader.s:28: Error: no such instruction: `stack_size equ 0x4000'
kernel/loader.s:29: Error: no such instruction: `loader equ (_loader - 0xC0000000'
kernel/loader.s:30: Error: no such instruction: `global loader'
kernel/loader.s:33: Error: too many memory references for `mov'
kernel/loader.s:34: Error: too many memory references for `mov'
kernel/loader.s:36: Error: too many memory references for `mov'
kernel/loader.s:37: Error: too many memory references for `or'
kernel/loader.s:38: Error: too many memory references for `mov'
kernel/loader.s:40: Error: too many memory references for `mov'
kernel/loader.s:41: Error: too many memory references for `or'
kernel/loader.s:42: Error: too many memory references for `mov'
kernel/loader.s:44: Error: invalid char '[' beginning operand 2 `[StartInHH]'
kernel/loader.s:48: Error: junk `[BootPageDirectory]' after expression
kernel/loader.s:48: Error: too many memory references for `mov'
kernel/loader.s:49: Error: no such instruction: `invpg [0]'
kernel/loader.s:50: Error: too many memory references for `mov'
kernel/loader.s:57: Error: no such instruction: `section .bss'
kernel/loader.s:58: Error: no such instruction: `align 32'
kernel/loader.s:60: Error: no such instruction: `resb STACK_SIZE'



3. For the last, I need a direction to go, I don't know where I start but I'm learning using the "Diff metter" in wiki.

Author:  AwfulMint [ Sat Nov 04, 2017 7:38 pm ]
Post subject:  Re: Questions about Higher Half Kernel

here's the code of loader.s

Code:
global _loader
extern kernel_main

MODULEALIGN equ 1<<0
MEMINFO    equ 1<<1
FLAGS      equ MODULEALIGN | MEMINFO
MAGIC      equ 0x1B4DB002
CHECKSUM   equ -(MAGIC+FLAGS)

KERNEL_VIRTUAL_BASE   equ 0xC0000000
KERNEL_PAGE_NUMBER   equ (KERNEL_VIRTUAL_BASE >> 22)

section .data
   align 0x1000
   BootPageDirectory:
      dd 0x00000083
      times (KERNEL_PAGE_NUMBER - 1) dd 0
      dd 0x00000083
      times (1024 - KERNEL_PAGE_NUMBER - 1) dd 0

section .text
   align 4
   MultiBootHeader:
      dd MAGIC
      dd FLAGS
      dd CHECKSUM
   
   STACK_SIZE   equ 0x4000
   loader equ (_loader - 0xC0000000
   global loader
   
_loader:
   mov ecx, (BootPageDirectory - KERNEL_VIRTUAL_BASE)
   mov cr3, ecx
   
   mov ecx, cr4
   or ecx, 0x00000010
   mov cr4, ecx
   
   mov ecx, cr0
   or ecx, 0x80000000
   mov cr0, ecx
   
   lea ecx, [StartInHH]
   jmp ecx
   
StartInHH:
   mov dword [BootPageDirectory], 0
   invpg [0]
   mov esp, stack+STACK_SIZE
   push eax
   push ebx
   
   call kernel_main
   hlt
   
section .bss
   align 32
   stack:
      resb STACK_SIZE

Author:  AwfulMint [ Sat Nov 04, 2017 7:39 pm ]
Post subject:  Re: Questions about Higher Half Kernel

the old boot.s file:

Code:
.extern kernel_main
.global start

.set MB_MAGIC, 0x1BADB002
.set MB_FLAGS, (1 << 0) | (1 << 1)
.set MB_CHECKSUM, (0 - (MB_MAGIC + MB_FLAGS))

.section .multiboot
   .align 4
   .long MB_MAGIC
   .long MB_FLAGS
   .long MB_CHECKSUM

.section .bss
   .align 16
   stack_bottom:
      .skip 4096
   stack_top:

.section .text
   start:
      mov $stack_top, %esp
      call kernel_main

      hang:
         cli
         hlt
         jmp hang

Author:  MichaelPetch [ Sat Nov 04, 2017 8:49 pm ]
Post subject:  Re: Questions about Higher Half Kernel

Your old boot.s is written for GNU Assembler (you assemble with as). Your new loader.s is written in NASM assembly syntax so you will need to assemble it with the nasm assembler. If you want to use as to assemble your loader.s you'd have to convert the assembly code by hand.

Author:  Schol-R-LEA [ Sun Nov 05, 2017 12:47 pm ]
Post subject:  Re: Questions about Higher Half Kernel

For further flavor on what @MichaelPetch said, see the wiki pages Assembly and Opcode syntax, as well as the pages specifically about GAS and NASM.

Basically, even when they are targeting the same ISA, each different assembler can have its own syntax for things such as opcode names, order of operands, representations of different numeric bases and string formats, labels, and directives such as equates and origins.

While most x86 assemblers more or less follow the opcode syntax and argument ordering defined by Intel, the Gnu Assembler, GAS, uses an older opcode format going back to the original as assembler for AT&T Unix. There are a number of differences in the AT&T syntax from the Intel syntax, most notably that while Intel defines the argument order as 'destination, source', the AT&T syntax follows what I assume was the PDP-11 syntax of 'source, destination', meaning that for the Intel syntax, "eax += 3" (that is, add 3 to EAX and save the result in EAX) would be

Code:
    add eax, DWORD 3


but for the AT&T/Gnu syntax, it would be:

Code:
    addl $3, %eax


Where the '$' prefix indicates an immediate operand, the '%' prefix means a register argument, and the 'l' suffix means a long (32-bit double-word) operation.

Author:  AwfulMint [ Sun Nov 05, 2017 3:11 pm ]
Post subject:  Re: Questions about Higher Half Kernel

Thanks m8s! I'm new at osdev so I have a lot of questions, van someone teach me the art of osdeving :3

Page 1 of 1 All times are UTC - 6 hours
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/