Page 1 of 1

how does the grub load the kernel at 1mb?

Posted: Sun Apr 30, 2006 11:56 am
by asmboozer
if in the link script file, 1mb address is specified. the grub will load the kernel at 1mb.

my question is:

is it done after entering PMODE?(I have not read the intel doc thoroughly,there may be other modes can access it i don't know).

otherwise i don't know how to access the address above 1Mb.

Re:how does the grub load the kernel at 1mb?

Posted: Sun Apr 30, 2006 12:34 pm
by n3Ro
Yes, as far as i know GRUB is entirely running in 32bit protected mode and only switches to 16bit real mode for bios calls.
But another way to access addresses above 1mb would be the "unreal" mode, where you switch to protected mode, load a segment register with a 4gig segment, and switch back to real mode. With this segment you would be a able to address to whole 4G address space from real mode ;)

Re:how does the grub load the kernel at 1mb?

Posted: Sun Apr 30, 2006 1:06 pm
by hendric
Hmm,I've never read about the source of GRUB. But as my thought, GRUB may access hard disk via PIO or return to real mode when reading data and switch 32 bit protected mode when moving data.
That's what I 've done for my simple kernel.

Re:how does the grub load the kernel at 1mb?

Posted: Sun Apr 30, 2006 2:56 pm
by n3Ro

Code: Select all

/*
 *   int biosdisk_int13_extensions (int ax, int drive, void *dap)
 *
 *   Call IBM/MS INT13 Extensions (int 13 %ax=AX) for DRIVE. DAP
 *   is passed for disk address packet. If an error occurs, return
 *   non-zero, otherwise zero.
 */

ENTRY(biosdisk_int13_extensions)
   pushl   %ebp
   movl   %esp, %ebp

   pushl   %esi
   pushl   %ebx

   /* compute the address of disk_address_packet */
   movl   0x10(%ebp), %eax
   movw   %ax, %si
   xorw   %ax, %ax
   shrl   $4, %eax
   movw   %ax, %cx   /* save the segment to cx */

   /* drive */
   movb   0xc(%ebp), %dl
   /* ax */
   movw   0x8(%ebp), %bx
   /* enter real mode */
   call   EXT_C(prot_to_real)
   
   .code16
   movw   %bx, %ax
   movw   %cx, %ds
   int   $0x13      /* do the operation */
   movb   %ah, %dl   /* save return value */
   /* clear the data segment */
   xorw   %ax, %ax
   movw   %ax, %ds
   /* back to protected mode */
   DATA32   call   EXT_C(real_to_prot)
   .code32

   movb   %dl, %al   /* return value in %eax */

   popl   %ebx
   popl   %esi
   popl   %ebp

   ret
This is an example from the file asm.S of the grub source code. The "real_to_prot" and "prot_to_real" routines are also defined in this file. ;)

I think using PIO / own drivers would be too complicated for a boot loader, because there would have to be more drivers available than space on a 1,44" disk (look at the linux kernel^^)