Page 1 of 1
GRUB Error 28
Posted: Tue Apr 03, 2007 10:16 pm
by pcmattman
What is the limit on the size of the kernel. Mine has just gone over 64K and now GRUB keeps telling me that it's too big to fit into memory... Do I need to build my kernel then distribute the not-as-necessary parts into external programs?
Wait... even less than 64K gives me trouble
...
Posted: Wed Apr 04, 2007 1:58 am
by AJ
What binary format are you using?
Posted: Wed Apr 04, 2007 2:58 am
by pcmattman
ELF, multiboot header hasn't changed at all since the last time it worked
Re: GRUB Error 28
Posted: Wed Apr 04, 2007 3:31 am
by urxae
pcmattman wrote:What is the limit on the size of the kernel. Mine has just gone over 64K and now GRUB keeps telling me that it's too big to fit into memory... Do I need to build my kernel then distribute the not-as-necessary parts into external programs?
Wait... even less than 64K gives me trouble
...
GRUB can handle kernels > 64K just fine. Mine is currently 342 K (including debug symbols) and GRUB loads it just fine. (Despite the fact that it seems to insist on crashing after a while on real machines -- I'm sure that's just my own stupid fault
)
What GRUB
can't handle however is a load address that doesn't fit into physical memory. (and IIRC the error message is similar to what you reworded above. Next time, please post the exact error message).
If you have a higher-half kernel, you need to tell GRUB to load it at a different address than it was linked for.
Could you post your linker script and the output of "objdump --headers <yourkernel>"?
Posted: Wed Apr 04, 2007 3:50 am
by pcmattman
Hmmm... the old kernel (ie. the one that works) is 63K. I just did a massive refactor and that may have messed up the symbols a bit. ATM I'm doing a massive render in 3DS Max and can't use my main development PC.
Once I get control back
I'll post my linker script and the linker map.
Edit: It crashed
. Anyway, here's the linker map and script... one note I have to make is that I think the problem originates from my memory manager, which has an array (not a linked list) of 20 million entries (20MB). I think if I change that to a linked list it should work.
Linker script:
Code: Select all
ENTRY (_loader)
SECTIONS
{
. = 0x00100000;
.text :
{
*(.text)
}
.rodata ALIGN (0x1000) :
{
*(.rodata)
}
.data ALIGN (0x1000) :
{
start_ctors = .;
*(.ctor*)
end_ctors = .;
start_dtors = .;
*(.dtor*)
end_dtors = .;
*(.data)
}
.bss :
{
_sbss = .;
*(COMMON)
*(.bss)
_ebss = .;
}
}
Linker map:
Code: Select all
Archive member included because of file (symbol)
libmattise.a(kernel_lib.o) file_io_main.o (_find)
libmattise.a(gdt_lib.o) libmattise.a(kernel_lib.o) (_gdt_install)
libmattise.a(idt_lib.o) UserMain_main.o (_idt_install)
libmattise.a(isr_lib.o) libmattise.a(kernel_lib.o) (_isrs_install)
libmattise.a(irq_lib.o) libmattise.a(kernel_lib.o) (_irq_install)
libmattise.a(acc_lib.o) UserMain_main.o (_strcpy)
libmattise.a(scrn_lib.o) UserMain_main.o (_kpOffX)
libmattise.a(conio_lib.o) UserMain_main.o (_printf)
libmattise.a(timer_lib.o) libmattise.a(kernel_lib.o) (_timer_install)
libmattise.a(mt_lib.o) libmattise.a(timer_lib.o) (_CheckList)
libmattise.a(kb_lib.o) libmattise.a(kernel_lib.o) (_keyboard_install)
libmattise.a(floppy_lib.o) UserMain_main.o (_DetectFloppyDrives)
libmattise.a(num_lib.o) libmattise.a(isr_lib.o) (_itoa_10)
libmattise.a(simplemem_lib.o)
UserMain_main.o (_simpleMalloc)
libmattise.a(fdc_lib.o) libmattise.a(timer_lib.o) (_motor)
libmattise.a(vfs_lib.o) libmattise.a(kernel_lib.o) (_InitFileMan)
libmattise.a(dma_lib.o) libmattise.a(fdc_lib.o) (_dma_xfer)
Allocating common symbols
Common symbol size file
_kpOffY 0x10 libmattise.a(scrn_lib.o)
_idt 0x800 libmattise.a(idt_lib.o)
_fatDrives 0x4c0 file_io_main.o
_gdt 0x80 libmattise.a(gdt_lib.o)
_gp 0x10 libmattise.a(gdt_lib.o)
_guiMouseX 0x10 gui_main.o
_myFloppy 0x40 fio_main.o
_VirtualDrive 0x203a0 libmattise.a(vfs_lib.o)
_lockedfiles 0x8000 fio_main.o
_vgaBuff2_Info 0x20 gui_main.o
_PrevEnts 0x6400 UserMain_main.o
_vgaBuff2 0x10 gui_main.o
_ProcessList 0x59e0 libmattise.a(mt_lib.o)
_winHandles 0xd50 gui_main.o
_numWindows 0x10 gui_main.o
_kpOffX 0x10 libmattise.a(scrn_lib.o)
_guiMouseY 0x10 gui_main.o
_stdout 0x20 UserMain_main.o
_nextfree 0x10 libmattise.a(vfs_lib.o)
_heap 0x19000000 libmattise.a(acc_lib.o)
_myDrives 0x340 hdd_main.o
_idtp 0x10 libmattise.a(idt_lib.o)
Memory Configuration
Name Origin Length Attributes
*default* 0x00000000 0xffffffff
Linker script and memory map
0x00100000 .=0x100000
.text 0x00100000 0xb1e8
*(.text)
.text 0x00100000 0x305 loader.o
0x00100131 _isr20
0x001001ea _irq2
0x00100163 _isr25
0x001002b4 _rem
0x0010004d _pause
0x001000ff _isr15
0x001000d7 _isr10
0x001002d6 _WriteCR0
0x0010000c _loader
0x0010011d _isr18
0x0010014f _isr23
0x001002f0 _KeyContWaitReady
0x001000b1 _isr6
0x0010021c _irq7
0x00100075 _isr0
0x001001d6 _irq0
0x00100208 _irq5
0x0010013b _isr21
0x00100262 _irq14
0x00100226 _irq8
0x001000cd _isr9
0x00100181 _isr28
0x001002e5 _WriteCR3
0x001000a7 _isr5
0x0010016d _isr26
0x0010018b _isr29
0x0010019f _isr31
0x0010007f _isr1
0x001000df _isr11
0x00100109 _isr16
0x001002a2 _GetEAX
0x00100089 _isr2
0x001000ef _isr13
0x00100159 _isr24
0x001002b1 _GetEDX
0x0010009d _isr4
0x00100212 _irq6
0x00100244 _irq11
0x001002ac _GetECX
0x001002a7 _GetEBX
0x001001fe _irq4
0x00100258 _irq13
0x00100093 _isr3
0x001000bb _isr7
0x001002e1 _ReadCR3
0x00100177 _isr27
0x001002f7 _EnableMouseIRQ
0x00100195 _isr30
0x00100127 _isr19
0x001000f7 _isr14
0x0010006d _idt_load
0x00100230 _irq9
0x00100113 _isr17
0x0010023a _irq10
0x001002d2 _ReadCR0
0x0010026c _irq15
0x001000e7 _isr12
0x001000c5 _isr8
0x001001e0 _irq1
0x00100145 _isr22
0x0010024e _irq12
0x001001f4 _irq3
0x00100050 _gdt_flush
*fill* 0x00100305 0x3
.text 0x00100308 0x1880 UserMain_main.o
0x001007ad _PrintAddr
0x00100308 _GetRegisters
0x001007c9 _FillStr
0x00100582 _gets
0x00100d21 _UserMain
0x00100391 _Int21ISR
0x001004b2 _getp
.text 0x00101b88 0x100 devio_main.o
0x00101be6 _putchar
0x00101bb3 _putc
0x00101b88 _getc
0x00101c06 _puts
0x00101c55 _seek
.text 0x00101c88 0x1790 file_io_main.o
0x001020d0 _InitHardDrive
0x00101d60 _hConvertFilename
0x00102df3 _FindInDir
0x00101fa2 _GetClusterEntry
0x00102b67 _FindInRoot
0x00102fbc _hopen
0x00103392 _hwrite
0x001027e5 _ReadCluster
0x00101c88 _GetBPB
0x00101ceb _FirstSectorOfCluster
0x00101ed4 _WhereInFat
0x0010330e _hread
0x0010290f _EnumFolderEnts
0x0010270c _hdd_ParseDirStr
0x00102057 _NumClusters
.text 0x00103418 0x1a40 fio_main.o
0x00103d79 _unlockfile
0x00103779 _toupper
0x00103b5c _ParseDirStr
0x00104421 _open
0x001039eb _ConvertFilename
0x001037c7 _FindDir
0x001037a0 _tolower
0x00103e12 _FindFreeCluster
0x00104b51 _RootDir
0x001036ec _numsectors
0x0010469f _write
0x00103e57 _CreateNewFile
0x00103441 _SetClusterData
0x001044e2 _read
0x001035d9 _GetClusterData
0x00103dc4 _islocked
0x00104164 _InitDrive
0x00104b97 _ListEnts
0x00103d21 _lockfile
.text 0x00104e58 0x920 gui_main.o
0x001051dc _DesktopPainter
0x00104ec1 _DefPaint
0x001056a6 _InitGUI
0x00105000 _BorderBmp
0x00104fa8 _SetPixel
0x0010569c _CursorPainter
0x0010556b _BlitFont
0x00104eec _InitWinList
0x0010538b _DrawBitmapFile
0x0010564e _SetMousePos
0x00105508 _DrawCursor
0x00104e58 _GetWindow
0x001056a1 _hellopainter
0x00105207 _CreateWindow
0x00104f53 _UpdateScreen
0x001052c1 _CreateWindow_Index
0x00105618 _MoveWindow
0x00104fd4 _DSetPixel
0x001056fd _RunGUI
0x001050c1 _CreateRect
0x00104e89 _FillBmp
0x00104f7b _BmpSetPixel
0x0010500e _BlitBmp
0x00104f34 _InitSecondBuffer
0x001050ff _PaintWindows
0x00105099 _FillRect
.text 0x00105778 0x13f0 hdd_main.o
0x001057a0 _getcnull
0x00105778 _GetLastError
0x0010578d _WriteSectorNull
0x00105d46 _EnumDrives
0x00106b03 _lba28seek
0x001057af _DriveInfo
0x001067dc _ReadSectorLBA28
0x00105801 _IdentifyDevice
0x001068d0 _lba28PutC
0x00105782 _ReadSectorNull
0x001065c6 _startreadLBA28
0x00106422 _prologCHS
0x00106155 _conSeek
0x00106652 _lba28GetC
0x00106a42 _WriteSectorLBA28
0x001062bc _prologLBA28
0x00106137 _conPutC
0x00105792 _putcnull
0x00106127 _conGetC
0x001057aa _seeknull
0x0010615a _InitDiskAccess
0x0010660c _startwriteLBA28
.text 0x00106b68 0x150 libmattise.a(kernel_lib.o)
0x00106b68 _find
0x00106bdf _NullProc
0x00106c22 _main
.text 0x00106cb8 0x100 libmattise.a(gdt_lib.o)
0x00106d4c _gdt_install
0x00106cb8 _gdt_set_gate
.text 0x00106db8 0xb0 libmattise.a(idt_lib.o)
0x00106e31 _idt_install
0x00106db8 _idt_set_gate
.text 0x00106e68 0x660 libmattise.a(isr_lib.o)
0x00107387 _fault_handler
0x00106e68 _isrs_install
0x001072a1 _RemISR
0x0010728c _SetISR
.text 0x001074c8 0x2b0 libmattise.a(irq_lib.o)
0x001074ed _irq_remap
0x00107717 _irq_handler
0x001074da _irq_uninstall_handler
0x0010759a _irq_install
0x001074c8 _irq_install_handler
.text 0x00107778 0x650 libmattise.a(acc_lib.o)
0x00107b6c _free
0x0010791a _strcmp
0x00107cc4 _memset_c
0x00107b53 _salloc
0x00107bfd _freend
0x00107c52 _memcpy
0x00107c8e _memset
0x00107a29 _malloc_count
0x00107d6c _inportw
0x0010779c _substr
0x00107d8d _outportb
0x00107cfb _memsetw
0x00107877 _init_memman
0x00107da9 _outportw
0x0010796b _malloc
0x0010777c _strcpy
0x00107778 _HeapCount
0x00107d2b _strlen
0x00107d4e _inportb
.text 0x00107dc8 0x3b0 libmattise.a(scrn_lib.o)
0x00107e93 _kputc_at
0x0010810d _cls
0x00107e0e _MoveCursor
0x00107f9e _kputc
0x0010806e _kputs
0x00107f4c _kputc_loc
0x00107e84 _ResAttrib
0x00107dc8 _ScrollScreen
0x00107e77 _SetAttrib
.text 0x00108178 0x5b0 libmattise.a(conio_lib.o)
0x00108694 _sprintf
0x0010863d _vsprintf_help
0x00108667 _vsprintf
0x001086e1 _vprintf
0x001086c0 _vprintf_help
0x00108178 _do_printf
0x001086fe _printf
.text 0x00108728 0x1a0 libmattise.a(timer_lib.o)
0x00108875 _sleep
0x0010884e _timer_install
0x00108892 _Clock
0x0010889c _ResetTimeslice
0x0010877e _timer_handler
0x00108728 _SetClockRate
0x001088ab _delay
.text 0x001088c8 0x7b0 libmattise.a(mt_lib.o)
0x001089e0 _InitMT
0x001088c8 _CheckList
0x00108c5f _disablemt
0x00108c7d _mtenabled
0x00108a82 _CreateProcess
0x00108f78 _currpid
0x00108cbe _resched
0x00108c6e _enablemt
0x0010891d _Yield
0x00108f82 _GetProcessCount
0x00108937 _ListProcesses
0x00108fcc _kill
.text 0x00109078 0x150 libmattise.a(kb_lib.o)
0x00109132 _wait_kbhit
0x00109078 _keyboard_handler
0x00109141 _kbhit
0x00109166 _getch
0x00109118 _keyboard_install
.text 0x001091c8 0x140 libmattise.a(floppy_lib.o)
0x00109254 _DetectFloppyDrives
.text 0x00109308 0x800 libmattise.a(num_lib.o)
0x0010963e _fabs
0x0010930d _rand
0x00109371 _ftoa
0x0010961b _abs
0x00109a20 _itoa_16
0x00109364 _srand
0x001095c0 _ConvRadians
0x001096ee _atoi
0x001095e7 _sine
0x001097aa _itoa_10
0x0010985f _ltoa_10
0x0010999a _ltoa_18
0x00109571 _factorial
0x00109a8f _ltoa_16
0x001096b6 _sqrt
0x00109687 _pow
0x00109308 _imath
0x0010991b _itoa_8
.text 0x00109b08 0x1a0 libmattise.a(simplemem_lib.o)
0x00109b08 _simpleMalloc
0x00109bb7 _simpleFree
.text 0x00109ca8 0xdb0 libmattise.a(fdc_lib.o)
0x00109f55 _block2hts
0x0010a128 _motoron
0x0010a187 _recalibrate
0x0010a75f _format_track
0x0010a1b6 _flseek
0x00109cfc _init_floppy
0x00109e4e _waitfdc
0x0010a330 _read_block
0x0010a3f7 _write_block
0x0010a16f _motoroff
0x0010a05b _reset
0x0010a261 _log_disk
0x00109d6b _sendbyte
0x0010a11e _diskchange
0x0010a48d _fdc_rw
0x00109f34 _FloppyIRQ
0x00109dd7 _getbyte
0x00109fe5 _ResetFloppy
.text 0x0010aa58 0x570 libmattise.a(vfs_lib.o)
0x0010af47 _ListFiles
0x0010af22 _FileExists
0x0010ad27 _GetIndex
0x0010ac36 _CreateFile
0x0010ae9f _ReadBytes
0x0010aa6f _InitFileMan
0x0010ab6d _DeleteFile
0x0010adf4 _WriteBytes
.text 0x0010afc8 0x220 libmattise.a(dma_lib.o)
0x0010b044 __dma_xfer
0x0010afc8 _dma_xfer
.rodata
*(.rodata)
.data 0x0010c000 0x1170
0x0010c000 start_ctors=.
*(.ctor*)
0x0010c000 end_ctors=.
0x0010c000 start_dtors=.
*(.dtor*)
0x0010c000 end_dtors=.
*(.data)
.data 0x0010c000 0xd20 UserMain_main.o
0x0010c000 _ManualPages
0x0010cd00 _manCount
.data 0x0010cd20 0x20 file_io_main.o
0x0010cd20 _NullFile
.data 0x0010cd40 0x1a0 gui_main.o
0x0010ce20 _Font_D
0x0010cd60 _Font_A
0x0010cda0 _Font_B
0x0010cea0 _Cursor_Normal
0x0010cd40 _vgaBuff
0x0010ce60 _Font_E
0x0010cde0 _Font_C
.data 0x0010cee0 0x40 hdd_main.o
0x0010cee0 _NullDrive
.data 0x0010cf20 0x80 libmattise.a(isr_lib.o)
0x0010cf20 _exception_messages
.data 0x0010cfa0 0x10 libmattise.a(irq_lib.o)
0x0010cfa0 _myvga
.data 0x0010cfb0 0x10 libmattise.a(acc_lib.o)
0x0010cfb4 _heap_top
0x0010cfb0 _heap_loc
.data 0x0010cfc0 0x10 libmattise.a(scrn_lib.o)
0x0010cfc0 _attrib
.data 0x0010cfd0 0x10 libmattise.a(timer_lib.o)
0x0010cfd0 _timeslice
.data 0x0010cfe0 0x120 libmattise.a(kb_lib.o)
0x0010cfe0 _keyBuff
0x0010d000 _kbdus
0x0010d080 _kbdus_shift
.data 0x0010d100 0x20 libmattise.a(floppy_lib.o)
0x0010d100 _drive_types
.data 0x0010d120 0x10 libmattise.a(num_lib.o)
0x0010d120 _randseed
.data 0x0010d130 0x10 libmattise.a(fdc_lib.o)
0x0010d134 _tbaddr
.data 0x0010d140 0x30 libmattise.a(dma_lib.o)
0x0010d148 _ModeReg
0x0010d150 _ClearReg
0x0010d168 _CountPort
0x0010d158 _PagePort
0x0010d140 _MaskReg
0x0010d160 _AddrPort
.bss 0x0010d170 0x1903a1c0
0x0010d170 _sbss=.
*(COMMON)
COMMON 0x0010d170 0x6420 UserMain_main.o
0x0010d170 _PrevEnts
0x00113570 _stdout
COMMON 0x00113590 0x4c0 file_io_main.o
0x00113590 _fatDrives
COMMON 0x00113a50 0x8040 fio_main.o
0x00113a50 _myFloppy
0x00113a90 _lockedfiles
COMMON 0x0011ba90 0xdb0 gui_main.o
0x0011ba90 _guiMouseX
0x0011baa0 _vgaBuff2_Info
0x0011bac0 _vgaBuff2
0x0011bad0 _winHandles
0x0011c820 _numWindows
0x0011c830 _guiMouseY
COMMON 0x0011c840 0x340 hdd_main.o
0x0011c840 _myDrives
COMMON 0x0011cb80 0x90 libmattise.a(gdt_lib.o)
0x0011cb80 _gdt
0x0011cc00 _gp
COMMON 0x0011cc10 0x810 libmattise.a(idt_lib.o)
0x0011cc10 _idt
0x0011d410 _idtp
COMMON 0x0011d420 0x19000000 libmattise.a(acc_lib.o)
0x0011d420 _heap
COMMON 0x1911d420 0x20 libmattise.a(scrn_lib.o)
0x1911d420 _kpOffY
0x1911d430 _kpOffX
COMMON 0x1911d440 0x59e0 libmattise.a(mt_lib.o)
0x1911d440 _ProcessList
COMMON 0x19122e20 0x203b0 libmattise.a(vfs_lib.o)
0x19122e20 _VirtualDrive
0x191431c0 _nextfree
*(.bss)
.bss 0x191431d0 0x4000 loader.o
.bss 0x191471d0 0x18 UserMain_main.o
0x191471d0 _entNum
.bss 0x191471e8 0x4 fio_main.o
0x191471e8 _lastfree
.bss 0x191471ec 0x40 gui_main.o
0x191471ec _Font_None
.bss 0x1914722c 0x4 hdd_main.o
0x1914722c _lasterr
.bss 0x19147230 0x40 libmattise.a(isr_lib.o)
0x19147230 _ISRHandlers
.bss 0x19147270 0x40 libmattise.a(irq_lib.o)
0x19147270 _irq_routines
.bss 0x191472b0 0x4 libmattise.a(scrn_lib.o)
0x191472b0 _noInc
.bss 0x191472b4 0x8 libmattise.a(timer_lib.o)
0x191472b4 _timer_ticks
0x191472b8 _sc
.bss 0x191472bc 0x10 libmattise.a(mt_lib.o)
0x191472c8 _isEnabled
0x191472bc _ProcessCount
0x191472c0 _pid
0x191472c4 _hasinit
.bss 0x191472cc 0x4 libmattise.a(kb_lib.o)
0x191472cc _keyShift
.bss 0x191472d0 0x60 libmattise.a(fdc_lib.o)
0x191472d4 _mtick
0x191472d8 _tmout
0x191472d0 _motor
0x19147330 _ebss=.
LOAD loader.o
LOAD UserMain_main.o
LOAD devio_main.o
LOAD file_io_main.o
LOAD fio_main.o
LOAD gui_main.o
LOAD hdd_main.o
LOAD libmattise.a
OUTPUT(kernel.bin elf32-i386)
.comment 0x19147330 0x1ec
.comment 0x19147330 0x1f loader.o
*fill* 0x1914734f 0x1
.comment 0x19147350 0x14 UserMain_main.o
.comment 0x19147364 0x14 devio_main.o
.comment 0x19147378 0x14 file_io_main.o
.comment 0x1914738c 0x14 fio_main.o
.comment 0x191473a0 0x14 gui_main.o
.comment 0x191473b4 0x14 hdd_main.o
.comment 0x191473c8 0x14 libmattise.a(kernel_lib.o)
.comment 0x191473dc 0x14 libmattise.a(gdt_lib.o)
.comment 0x191473f0 0x14 libmattise.a(idt_lib.o)
.comment 0x19147404 0x14 libmattise.a(isr_lib.o)
.comment 0x19147418 0x14 libmattise.a(irq_lib.o)
.comment 0x1914742c 0x14 libmattise.a(acc_lib.o)
.comment 0x19147440 0x14 libmattise.a(scrn_lib.o)
.comment 0x19147454 0x14 libmattise.a(conio_lib.o)
.comment 0x19147468 0x14 libmattise.a(timer_lib.o)
.comment 0x1914747c 0x14 libmattise.a(mt_lib.o)
.comment 0x19147490 0x14 libmattise.a(kb_lib.o)
.comment 0x191474a4 0x14 libmattise.a(floppy_lib.o)
.comment 0x191474b8 0x14 libmattise.a(num_lib.o)
.comment 0x191474cc 0x14 libmattise.a(simplemem_lib.o)
.comment 0x191474e0 0x14 libmattise.a(fdc_lib.o)
.comment 0x191474f4 0x14 libmattise.a(vfs_lib.o)
.comment 0x19147508 0x14 libmattise.a(dma_lib.o)
0x19147508 = 420,771,080 bytes... 420 MB??? Maybe I should look into moving into a linked list system instead of a predefined array?