Seite 1 von 1

Zugriff auf Linker interne "Variablen"..?

Verfasst: Fr Jul 25, 2008 11:38 pm
von Dirty Oerti
Tag! :)

Die Frage hängt mal wieder mit meinem kernel-Projekt zusammen.
Ich weiß nicht, ob ich mit meiner Vermutung, wie ich an die Größe meines Kernels komme richtig liege.
Aber ich hoffe schon.

Was ich machen will:

Ich möchte das Ende (die letzte Position im Speicher) des Kernels ausfindig machen.
Dazu hab ich mir überlegt: Das weiß doch der Linker.

Ich hab das irgendwo schon mal gesehen, ich finds nur leider nicht mehr (zu dumm, dass das Internet so groß ist...).

Ein Linkerskript sieht ja zum Beispiel so aus:

Code: Alles auswählen

ENTRY(start)
OUTPUT_FORMAT(elf32-i386)

SECTIONS
{
    . = 0x100000;
    .text :
{
        *(.text)
}

    .data :
{
        *(.data)
        *(.rodata)
}

    .bss :
{
        *(.bss)
}
    __kernel_end = .;
    end = .;
}
"__kernel_end" bezeichnet hier die letze Speicherpostion, die vom Kernel gebraucht wird.
An diesen Wert muss ich rankommen.

So einfach wie

Code: Alles auswählen

unsigned long k_ende = __kernel_end;
geht's leider nicht.
Da wird mir gemeldet:
Fehler: »__kernel_end« nicht deklariert (erste Benutzung in dieser Funktion)
Ich hab auch schon versucht, "__kernel_end" zu deklarieren.
Zum Beispiel per

Code: Alles auswählen

extern void *__kernel_end;
.
Funtioniert auch nicht.
Dann mekert der Linker, dass er "__kernel_end" nicht finden kann.

Also: Wie mach ich das?
Wie komm ich an diese Variable/Konstante/was-auch-immer "__kernel_end" ran?

MfG
Daniel :)

Re: Zugriff auf Linker interne "Variablen"..?

Verfasst: Fr Jul 25, 2008 11:45 pm
von Dirty Oerti
Hm...
ich scheine das Problem gelöst zu haben.

Bin mehr oder minder zufällig auf diese Seite hier gestoßen:

http://sourceware.org/binutils/docs/ld/ ... -Reference

Es sieht nun so aus:

Linkerskript:

Code: Alles auswählen

ENTRY(start)
OUTPUT_FORMAT(elf32-i386)

SECTIONS
{
    . = 0x100000;
    .text :
{
        *(.text)
}

    .data :
{
        *(.data)
        *(.rodata)
}

    .bss :
{
        *(.bss)
}
    __kernel_end = .;
    end = .;
}
C-Code:

Code: Alles auswählen

extern int end;
//...
unsigned long k_ende = end;
//...
Wie man sieht bin ich auf "end" umgestiegen. Ist das gleiche. Nur bei "__kernel_end" hätte ich nicht gewusst, wie ich mit den doppelten Unterstrichen zu verfahren habe (wahrscheinlich nur einer weg).

Ob das ganze nun auch funktioniert weiß ich nicht.
Muss ich erstmal testen (das dauert immer etwas, da ich keine Zahlen ausgeben kann^^)

MfG
Daniel


*edit*
Hab's jetzt mal getestet.
Ernüchternd.

Code: Alles auswählen

unsigned long Pend = &end;
unsigned long ende = end;
Pend und ende haben danach den Wert 0.
Das bringt mir natürlich wenig...

Ich guck mal, woran das liegt...

*/edit*