staging.inyokaproject.org

Ubuntu Kernel 2.6.21.1 bearbeiten und verstehen

Status: Ungelöst | Ubuntu-Version: Ubuntu 9.04 (Jaunty Jackalope)
Antworten |

schiggy

Avatar von schiggy

Anmeldungsdatum:
11. August 2007

Beiträge: 107

hallo leute ...

ich stehe vor einem problem! ich habe diese aufgabenstellung erhalten und komme nicht weiter:

Suchen Sie in den Kernelsourcen genau jene Stelle, wo der Kernel nach dem Booten das erste Mal die 
Kontrolle  einem  Benutzerprozess  abgibt.  Woher  weiß  der  Kernel,  welchen  Prozess  er  dort  starten 
muss?  Mit  welcher  Funktion  wird  der  Prozess  gestartet?  Fügen  Sie  dort  entsprechende  Debugging‐
Ausgaben ins Kernel‐Log ein, um zu sehen, welcher Prozess tatsächlich gestartet wird.

wo steigt der kernel überhaupt ein (bei welcher file)?

vielleicht kennt sich von euch jemand damit aus.
hier http://lxr.linux.no/linux+v2.6.21.1/ kann man online in die sourcefiles reinschaun.

thx für eure hilfe
schiggy

glasen

Anmeldungsdatum:
5. November 2004

Beiträge: 2690

Ich kenne mich jetzt nicht so gut aus in den Kernelquellen, aber der erste Prozess den ein Unixsystem nach dem Booten startet, ist normalerweise das Programm "init". Und soviel ich weiß wird in der Datei "linux/init/main.c" genau dieser Init-Start geregelt (Ab Zeile 736).

schiggy

(Themenstarter)
Avatar von schiggy

Anmeldungsdatum:
11. August 2007

Beiträge: 107

hallo glasen

danke für deinen hinweis! das habe ich schon getestet mit einer kernelmeldung! leider kommt es garnicht soweit.
die static void run_init_process(char *init_filename) wird genau einmal aufgerufen.
die ifabfrage if (ramdisk_execute_command) bei zeile 750 ist das letzte, was in dieser funktion gemacht wird.

if (ramdisk_execute_command) {
        run_init_process(ramdisk_execute_command);
        printk(KERN_WARNING "Failed to execute %s\n", ramdisk_execute_command);
}

(das verstehe ich nicht ganz) ich habe schon ein paar debugausgaben gemacht aber bin leider noch nicht weitergekommen.

anscheinend gehen genau diese befehle da rein: http://lxr.linux.no/linux+v2.6.21.1/arch/i386/kernel/sys_i386.c#L258

int kernel_execve(const char *filename, char *const argv[], char *const envp[])
{
        long __res;
        asm volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx"
        : "=a" (__res)
        : "0" (__NR_execve),"ri" (filename),"c" (argv), "d" (envp) : "memory");
        return __res;
}

leider verstehe ich den code nicht (assembler). ich kann mir vorstellen, dass hier der stack durchgegangen wird
und alle init sachen gestartet werden. ich möchte gerne den filename von jeder datei ausgeben (dmesg),
die hier aufgerufen wird.

danke für deine hilfe
schiggy

ps: ich komme auch nicht darauf, was genau dieser code macht

if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
        printk(KERN_WARNING "Warning: unable to open an initial console.\n");

glasen

Anmeldungsdatum:
5. November 2004

Beiträge: 2690

Hi,

Sorry für die späte Antwort. Leider kenne ich mich mit der Kernelprogrammierung kaum aus. Ich hab zwar schon ein wenig an Kernelmodulen rumgespielt, aber mehr auch nicht. Die einzigen Tipps die ich dir noch geben kann sind folgende Bücher :

OpenBook "Linux-Gerätetreiber"

Kapitel 16 aus obigem OpenBook : Der physikalische Aufbau der Kernel-Quellen

Andrew S. Tanenbaum : Operating Systems Design and Implementation ISBN 0-13638-677-6

Letzteres Buch ist quasi die Grundlage für Linux, da Linus Torvalds durch dieses Buch in Kontakt mir Unix kam.

Antworten |