Autor Thema: Größe des Kernels  (Gelesen 5139 mal)

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« am: 02. November 2009, 19:23 »
Hallo Leute,
ich bin seit einiger Zeit dabei, mein Projekt aufzuräumen, bzw. neu zu schreiben, und habe nun alles schön in Unterordner gepackt, damit eine spätere Portierung leichter fällt. Das ist zumindest das Ziel...
 
Nun hat der Kernel nur eine GDT, IDT, ISRs und ein paar zusätzliche Funktionen, wie z.B. outb oder video_puts. Da das ja nicht sonderlich viel ist, verwundert es mich, dass der Kernel doch bereits jetzt eine Größe von 38 KB hat.
Könnte das an den vielen Unterordnern liegen? Der alte Kernel war nämlich nur ein bissel größer, wenn nicht sogar gleich groß, und konnte wesentlich mehr (Multitasking, System Calls).
 
Muss ich da noch Optimierungsoptionen setzen, oder kann ich auch Optionen weglassen? Die Optionen, die gcc mitgegeben werden, sehen momentan wie folgt aus: -m32 -Wall -Wextra -O3 -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -fno-stack-protector -fno-builtin -I./src/kernel/include -I./src/kernel/include/arch/$(ARCH) -D PAE=$(PAE) -D APIC=$(APIC) -c -o

DaCodaaa

  • Gast
Gespeichert
« Antwort #1 am: 02. November 2009, 19:43 »
ein Programm in dem Sinne besteht ja nich nur aus dem Code, sondern auch aus ELF Sectionen wie Data und Bss. Vielleicht hast du die unwissentlich im Linkerscript verändert.

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #2 am: 02. November 2009, 19:50 »
Nicht wirklich...
Das einzige, was dazu gekommen ist, ist die Sektion für die read-only daten, wie z.B. Strings.
Wenn ich das weglasse, bzw. in den Code-Part mit hinein packe, wird der Kernel nur 4 KB kleiner, was für den Inhalt des Kernels allerdings (in meinen Augen) immer noch zu groß ist.
« Letzte Änderung: 02. November 2009, 19:53 von ChristianF »

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 02. November 2009, 20:02 »
objdump kann dir anzeigen, was wie groß ist.
Dieser Text wird unter jedem Beitrag angezeigt.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 02. November 2009, 21:29 »
Und strip kann es unter Umständen kleiner machen. Du scheinst -g nicht aktiviert zu haben, also wird es nicht ganz so extrem sein, aber ein bisschen was dürfte damit schon zu gewinnen sein. Für Debugging sind die die dabei entstehenden Binaries natürlich größtenteils unbrauchbar, aber zum Ausführen mehr als genug.

Edit: Ich war mal so frei, den Thread zu verschieben. Das ist wesentlich weniger Off Topic als manch andere allgemeine Programmierfrage in Lowlevel-Coding. ;)
« Letzte Änderung: 02. November 2009, 21:30 von taljeth »
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #5 am: 03. November 2009, 16:47 »
Nun ja, ich war mir dabei nicht sicher, deshalb der Thread im Offtopic.
 
Anscheinend ist der Kernel so groß, weil ich 255 Assembler-Stubs für die Interrupts habe. Vorher waren das nur 48... ;)
 
So eine Linkermap ist eben doch zu was nützlich. :roll: Nun tauchen immer wieder Einträge folgender Art auf:
*fill*         0x000000000010001e        0x2 00
.....
 *fill*         0x0000000000100041        0xf 00
.....
 *fill*         0x000000000010105e        0x2 00
Könnte es sein, dass dadurch der Kernel nochmals größer wird, sprich ich was im Linkerscript falsch gemacht habe? Oder ist das normal?
 
Hier ein etwas längerer Auszug:
Linker script and memory map

                0x0000000000100000                KERNEL_VMA = 0x100000
                0x0000000000100000                KERNEL_LMA = 0x100000
                0x0000000000000000                KERNEL_VOFFSET = (KERNEL_VMA - KERNEL_LMA)
                0x0000000000100000                . = KERNEL_VMA
                0x0000000000100000                kernel_start_address = .

.text           0x0000000000100000     0x46ee
 *(.text)
 .text          0x0000000000100000       0x1e src/kernel/src/arch/i386/cpu.s.o
                0x0000000000100000                check_cpuid
 *fill*         0x000000000010001e        0x2 00
 .text          0x0000000000100020       0x21 src/kernel/src/arch/i386/start.s.o
                0x0000000000100020                _start
 *fill*         0x0000000000100041        0xf 00
 .text          0x0000000000100050     0x100e src/kernel/src/arch/i386/interrupts.s.o

.... Hier kommen die 255 Stubs ....

 *fill*         0x000000000010105e        0x2 00
 .text          0x0000000000101060       0x10 src/kernel/src/arch/i386/init.c.o
                0x0000000000101060                arch_system_initialise
 .text          0x0000000000101070       0x39 src/kernel/src/arch/i386/apic.c.o
                0x0000000000101070                apic_install
 *fill*         0x00000000001010a9        0x7 00
 .text          0x00000000001010b0        0x6 src/kernel/src/arch/i386/pic.c.o
                0x00000000001010b0                pic_install
 *fill*         0x00000000001010b6        0xa 00


 

Einloggen