QEMU auf dem RPI


43 posts   Page 1 of 2   1, 2
by meigrafd » Fri Aug 03, 2012 11:02 am
Hallo

Ich suche schon länger nach einer Anleitung um auf dem Raspberry QEMU benutzen zu können - leider bisher ohne Erfolg :(
Finde leider nur Anleitungen um den RPI auf einem PC zu emulieren aber ich würde gerne genau den anderen Weg nutzen: Auf dem RPI QEMU laufen lassen um andere Systeme wie zum Beispiel x86 zu emulieren.
Es müsste nicht mals ein komplettes System sein es würde auch schon User-Space/Mode reichen um nur bestimmte x86 Programme laufen lassen zu können...

Weiss hier jemand ob das überhaupt möglich ist und könnte mir kurz beschreiben wie man da vorgehen müsste?

Danke!
Posts: 92
Joined: Tue May 29, 2012 9:28 am
Location: Germany
by devyl » Fri Aug 03, 2012 11:33 am
Hm prinzipiell möglich ist es sicherlich. Einfach mal versucht den Quellcode zu compilen?

Allerdings sei die Sinnhaftigkeit dahin gestellt: i.d.r. sagt man bei Architektur-Wechsel (Beispiel Spielkonsolen/Emulatoren) in der relation 1:10 Rechnen soll. D.h. im Prinzip schafft eine 700mhz CPU ungefähr einen Rechner mit 70mhz zu simulieren. Allerdings hinkt der vergleich etwas in der Richtung, dass beim Pi eine effektive Geschwindigkeit von einem 400Mhz Pentium 2 gegeben ist.

Was wiederum bedeutet dass du einen PC mit irgendwas zwischen 40 und 100Mhz im optimalen Fall hinbekommst. Da wäre es sinniger die Programme die du benötigst neu für ARM zu kompilieren.

Auf der OpenPandora (ähnliche Leistungsklasse) nutze ich ab und an dosemu; glaub mir, neuKompiliertes ist wesentlich schneller... *g*
Posts: 7
Joined: Fri Aug 03, 2012 11:26 am
by meigrafd » Fri Aug 03, 2012 11:50 am
Vielen Dank für die schnelle Antwort ;)

Soviel Performance werden denk ich (oder hoff ich zumindest) auch nicht benötigt...

Die Programme sind leider nicht OpenSource und gibt es leider auch nicht als armel sondern nur als armeb Version :(

Ich hab es bereits mit QEMU v0.14 , v1.0.1 und v1.1.1 probiert; sowohl selber kompiliert als auch debian pakete installiert.. Der Prozess läuft zwar lässt sich aber nicht ansprechen :?

Gibt es vielleicht irgendwelche Alternativen?
Posts: 92
Joined: Tue May 29, 2012 9:28 am
Location: Germany
by cmeckler » Fri Aug 03, 2012 3:18 pm
ich hab davon in anderen Foren gelesen.
Es soll da ein emulator im Debian packete geben.
Weiß nur nicht mehr wie der heißt.

grüßle
Posts: 5
Joined: Fri Aug 03, 2012 3:14 pm
by meigrafd » Fri Aug 03, 2012 3:54 pm
@cmeckler: Kommt dir hier von irgendwas bekannt vor: http://wiki.debian.org/Emulator :?:

Ansonsten wäre es super wenn du das noch irgendwie in Erfahrung bringen könntest
Posts: 92
Joined: Tue May 29, 2012 9:28 am
Location: Germany
by triggerhurt » Fri Aug 03, 2012 4:03 pm
Also ich teile die Bedenken mit der Performance. Aber davon ab: Was gibt qemu denn so für Rückmeldung (log / output)?
Posts: 11
Joined: Tue Mar 13, 2012 12:02 pm
by meigrafd » Fri Aug 03, 2012 4:21 pm
Wie gesagt wird nicht viel Performance benötigt. Das es langsamer laufen wird ist mir bewusst ;)

Eine Ausgabe gab es nicht, der Prozess wurde gestartet aber darauf zugreifen konne ich leider nicht (es wird normalerweise ein Port geöffnet)

Ein Log hab ich aber auch nicht erstellen lassen. Welches wäre denn dafür wichtig? (da gibt es ja mehrere möglichkeiten)
Posts: 92
Joined: Tue May 29, 2012 9:28 am
Location: Germany
by clapper » Fri Aug 03, 2012 5:31 pm
Um welches Programm geht es denn? Möglicherweise gibts eine Möglichkeit das Ganze nativ zu machen.
Posts: 34
Joined: Mon Jan 30, 2012 2:10 pm
by meigrafd » Fri Aug 03, 2012 6:40 pm
@clapper: Und wie sollte das gehen? Die Binary ist wie gesagt für armeb kompiliert aber der Raspberry ist armel
Posts: 92
Joined: Tue May 29, 2012 9:28 am
Location: Germany
by PIstolero » Sat Aug 04, 2012 8:15 am
Schon mal den thread gesehen?
viewtopic.php?f=62&t=10635
Sind ein paar Tips drin für qemu zu kompilieren.
Um Windows binarys über Wine laufen zu lassen:
viewtopic.php?f=41&t=12727&p=136849#p136849
User avatar
Posts: 101
Joined: Mon Jul 23, 2012 6:28 am
Location: paradise city, where the grass is green and the girls are pretty
by meigrafd » Sat Aug 04, 2012 9:26 am
@PIstolero: Da werde ich leider nicht so recht schlau draus was da nun für mich relevant wäre..
Ich will zwar keine Windows Binary ausführen aber i386 würde auch gehen.

Soweit ich das verstanden habe soll man die speziell angepasste "Thoronirs Qemu 0.15.50" Version nehmen und das Makefile um die CFLAGS erweitern sowie das configure script mit diesen cflags aufrufen und dann soll i386 laufen?

Bitte korregiert mich wenn ich zusammenfassend noch etwas falsch habe:
1) apt-get install git zlib1g-dev libsdl1.2-dev
2) mkdir raspidev
3) cd raspidev
4) wget http://thoronir.net/raspi-dev/qemu-git.tar.bz2
5) tar xfj qemu-git.tar.bz2
6) cd qemu
7) vi Makefile
Code: Select all
CFLAGS=-O3 -mfloat-abi=hard -mfpu=vfp -mcpu=arm1176jzf-s -mtune=arm1176jzf-s -march=armv6zk
8) vi qemu/tcg/arm/tcg-target.c
Code: Select all
static inline void tcg_out_addi(TCGContext *s, int reg, tcg_target_long val)
9) vi qemu/tcg/i386/tcg-target.c
Code: Select all
static inline void tcg_out_addi(TCGContext *s, int reg, tcg_target_long val)

10) ./configure --target-list="i386-softmmu" --enable-sdl --prefix=/usr --extra-cflags="-O3 -mfloat-abi=hard -mfpu=vfp -mcpu=arm1176jzf-s -mtune=arm1176jzf-s -march=armv6zk"
11) make
12) make install

Und dann muss ich ein vollständiges i386 Linux laufen lassen (wenn ja, welches?) oder ginge auch UserMode?
Posts: 92
Joined: Tue May 29, 2012 9:28 am
Location: Germany
by PIstolero » Sat Aug 04, 2012 9:37 am
Dann hättest du zumindest ein Qemu binary mit dem du x86 Software starten kannst, egal ob W95 oder Linux. Scheinbar laüft laut dem Thread auf ARM als Host die Thoronir Version besser als die Qemu 1.1.1. An schnellsten hat man sich ein kleines test image am PC mit qemu erstellt und startet es nur auf dem Pi. Du kannst software auch im usermode starten.
http://wiki.qemu.org/download/qemu-doc. ... e-emulator
User avatar
Posts: 101
Joined: Mon Jul 23, 2012 6:28 am
Location: paradise city, where the grass is green and the girls are pretty
by meigrafd » Sat Aug 04, 2012 9:57 am
Inwiefern kann man sich denn auf dem PC ein Image für qemu vorbereiten welches man dann auf dem RPI nutzen kann?
Posts: 92
Joined: Tue May 29, 2012 9:28 am
Location: Germany
by PIstolero » Sat Aug 04, 2012 10:02 am
Qemu ist ein emulator, du erstellst dir eine VM auf deinem PC weils schneller ist. Danach nimmst du die Image Datei der VM und startest sie einfach nur mit qemu auf dem Pi statt auf dem PC.
In dem verlinkten Thread oben, da hat der auch vorgefertigte W95 und XP images benutzt und nicht erst installiert.
User avatar
Posts: 101
Joined: Mon Jul 23, 2012 6:28 am
Location: paradise city, where the grass is green and the girls are pretty
by meigrafd » Sat Aug 04, 2012 10:29 am
Ja gut das war mir schon bekannt, mich interessiert aber eine genauere Beschreibung aus der Praxis ;)

Kann ich dafür einfach irgendein VM image nehmen, oder ist dabei auf irgendwas zu achten (zb kein VMware sondern nur VB oder sowas..)
Nimmt man einfach das VM Image was man auch auf Windows nutzt oder muss man sich über debootstrap erst eines erstellen?
Muss das Image in einem bestimmten Format sein?
Posts: 92
Joined: Tue May 29, 2012 9:28 am
Location: Germany
by PIstolero » Sat Aug 04, 2012 10:31 am
Die VM sollte auch mit Qemu erstellt worden sein weil genau die selbe x86 Plattform emuliert wird und nicht mit was anderem. So kannst du eins installieren:
http://qemu-buch.de/de/index.php/QEMU-K ... tur/_Linux
Denk dran der der Pi im gegensatz zu nem PC begrenzte Ressourcen hat, da geht bestenfalls was ultra minimalistisches als OS
User avatar
Posts: 101
Joined: Mon Jul 23, 2012 6:28 am
Location: paradise city, where the grass is green and the girls are pretty
by meigrafd » Sat Aug 04, 2012 11:00 am
Welche Linux Distribution würdest du dafür empfehlen?
Wäre "Damn Small Linux" eine Möglichkeit oder lieber direkt Debian?
Posts: 92
Joined: Tue May 29, 2012 9:28 am
Location: Germany
by meigrafd » Sun Aug 05, 2012 10:07 am
Also ich hab es jetzt mit dem normalen Debian probiert. Es gab auch noch leichte Anlaufschwierigkeiten bei denen mir Dietmar freundlicherweise geholfen hat ;)

Was ich nun gemacht habe ist folgendes:

Vorbereitungen auf dem PC:

1) QEMU für Windows laden und installieren: http://qemu.weilnetz.de/w32/qemu-w32.exe
2) Debian i386 netinstall laden: http://cdimage.debian.org/debian-cd/6.0 ... etinst.iso
3) Per Eingabeaufforderung in C:\Program Files\qemu\ wechseln
4) 900MB Image erstellen: qemu-img.exe create -f qcow2 G:\debian.img 900M (nach installation sind ca. 720MB belegt)
5) Debian installation starten (512mb ram und nur ein cpu-core, auf keinen fall mehr cores da der raspberry auch nur einen hat!):
qemu -cpu 486 -hda G:\debian.img -cdrom G:\debian-6.0.4-i386-netinst.iso -boot d -m 512 -smp 1
6) Absolut minimale Installation durchführen (KEINE Pakete auswählen!)


Vorbereitungen auf dem Raspberry:

1) mkdir raspidev && cd raspidev
2) wget http://thoronir.net/raspi-dev/qemu-git.tar.bz2
3) tar xfj qemu-git.tar.bz2 && cd qemu
4) ./configure --target-list="i386-softmmu" --prefix=/usr --extra-cflags="-O3 -mfloat-abi=hard -mfpu=vfp -mcpu=arm1176jzf-s -mtune=arm1176jzf-s -march=armv6zk"
5) nano tcg/arm/tcg-target.c
static void tcg_out_addi(TCGContext *s, int reg, tcg_target_long val)
in folgendes ändern:
static inline void tcg_out_addi(TCGContext *s, int reg, tcg_target_long val)

6) nano tcg/i386/tcg-target.c .. das selbe wie in 5)
7) rm qapi/qmp-input-visitor.c && nano qapi/qmp-input-visitor.c .. und copy&past:
Code: Select all
/*
 * Input Visitor
 *
 * Copyright IBM, Corp. 2011
 *
 * Authors:
 *  Anthony Liguori   <aliguori@us.ibm.com>
 *
 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
 * See the COPYING.LIB file in the top-level directory.
 *
 */

#include "qmp-input-visitor.h"
#include "qemu-queue.h"
#include "qemu-common.h"
#include "qemu-objects.h"
#include "qerror.h"

#define QIV_STACK_SIZE 1024

typedef struct StackObject
{
    const QObject *obj;
    const  QListEntry *entry;
} StackObject;

struct QmpInputVisitor
{
    Visitor visitor;
    QObject *obj;
    StackObject stack[QIV_STACK_SIZE];
    int nb_stack;
};

static QmpInputVisitor *to_qiv(Visitor *v)
{
    return container_of(v, QmpInputVisitor, visitor);
}

static const QObject *qmp_input_get_object(QmpInputVisitor *qiv,
                                           const char *name)
{
    const QObject *qobj;

    if (qiv->nb_stack == 0) {
        qobj = qiv->obj;
    } else {
        qobj = qiv->stack[qiv->nb_stack - 1].obj;
    }

    if (name && qobject_type(qobj) == QTYPE_QDICT) {
        return qdict_get(qobject_to_qdict(qobj), name);
    } else if (qiv->nb_stack > 0 && qobject_type(qobj) == QTYPE_QLIST) {
        return qlist_entry_obj(qiv->stack[qiv->nb_stack - 1].entry);
    }

    return qobj;
}

static void qmp_input_push(QmpInputVisitor *qiv, const QObject *obj, Error **errp)
{
    qiv->stack[qiv->nb_stack].obj = obj;
    if (qobject_type(obj) == QTYPE_QLIST) {
        qiv->stack[qiv->nb_stack].entry = qlist_first(qobject_to_qlist(obj));
    }
    qiv->nb_stack++;

    if (qiv->nb_stack >= QIV_STACK_SIZE) {
        error_set(errp, QERR_BUFFER_OVERRUN);
        return;
    }
}

static void qmp_input_pop(QmpInputVisitor *qiv, Error **errp)
{
    qiv->nb_stack--;
    if (qiv->nb_stack < 0) {
        error_set(errp, QERR_BUFFER_OVERRUN);
        return;
    }
}

static void qmp_input_start_struct(Visitor *v, void **obj, const char *kind,
                                   const char *name, size_t size, Error **errp)
{
    QmpInputVisitor *qiv = to_qiv(v);
    const QObject *qobj = qmp_input_get_object(qiv, name);

    if (!qobj || qobject_type(qobj) != QTYPE_QDICT) {
        error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null",
                  "QDict");
        return;
    }

    qmp_input_push(qiv, qobj, errp);
    if (error_is_set(errp)) {
        return;
    }

    if (obj) {
        *obj = g_malloc0(size);
    }
}

static void qmp_input_end_struct(Visitor *v, Error **errp)
{
    QmpInputVisitor *qiv = to_qiv(v);

    qmp_input_pop(qiv, errp);
}

static void qmp_input_start_list(Visitor *v, const char *name, Error **errp)
{
    QmpInputVisitor *qiv = to_qiv(v);
    const QObject *qobj = qmp_input_get_object(qiv, name);

    if (!qobj || qobject_type(qobj) != QTYPE_QLIST) {
        error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null",
                  "list");
        return;
    }

    qmp_input_push(qiv, qobj, errp);
}

static GenericList *qmp_input_next_list(Visitor *v, GenericList **list,
                                        Error **errp)
{
    QmpInputVisitor *qiv = to_qiv(v);
    GenericList *entry;
    StackObject *so = &qiv->stack[qiv->nb_stack - 1];

    if (so->entry == NULL) {
        return NULL;
    }

    entry = g_malloc0(sizeof(*entry));
    if (*list) {
        so->entry = qlist_next(so->entry);
        if (so->entry == NULL) {
            g_free(entry);
            return NULL;
        }
        (*list)->next = entry;
    }
    *list = entry;


    return entry;
}

static void qmp_input_end_list(Visitor *v, Error **errp)
{
    QmpInputVisitor *qiv = to_qiv(v);

    qmp_input_pop(qiv, errp);
}

static void qmp_input_type_int(Visitor *v, int64_t *obj, const char *name,
                               Error **errp)
{
    QmpInputVisitor *qiv = to_qiv(v);
    const QObject *qobj = qmp_input_get_object(qiv, name);

    if (!qobj || qobject_type(qobj) != QTYPE_QINT) {
        error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null",
                  "integer");
        return;
    }

    *obj = qint_get_int(qobject_to_qint(qobj));
}

static void qmp_input_type_bool(Visitor *v, bool *obj, const char *name,
                                Error **errp)
{
    QmpInputVisitor *qiv = to_qiv(v);
    const QObject *qobj = qmp_input_get_object(qiv, name);

    if (!qobj || qobject_type(qobj) != QTYPE_QBOOL) {
        error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null",
                  "boolean");
        return;
    }

    *obj = qbool_get_int(qobject_to_qbool(qobj));
}

static void qmp_input_type_str(Visitor *v, char **obj, const char *name,
                               Error **errp)
{
    QmpInputVisitor *qiv = to_qiv(v);
    const QObject *qobj = qmp_input_get_object(qiv, name);

    if (!qobj || qobject_type(qobj) != QTYPE_QSTRING) {
        error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null",
                  "string");
        return;
    }

    *obj = g_strdup(qstring_get_str(qobject_to_qstring(qobj)));
}

static void qmp_input_type_number(Visitor *v, double *obj, const char *name,
                                  Error **errp)
{
    QmpInputVisitor *qiv = to_qiv(v);
    const QObject *qobj = qmp_input_get_object(qiv, name);

    if (!qobj || qobject_type(qobj) != QTYPE_QFLOAT) {
        error_set(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null",
                  "double");
        return;
    }

    *obj = qfloat_get_double(qobject_to_qfloat(qobj));
}

static void qmp_input_type_enum(Visitor *v, int *obj, const char *strings[],
                                const char *kind, const char *name,
                                Error **errp)
{
    int64_t value = 0;
    char *enum_str;
    assert(strings);
   enum_str = (char *)strings[value];
    qmp_input_type_str(v, &enum_str, name, errp);
    if (error_is_set(errp)) {
        return;
    }

    while (strings[value] != NULL) {
        if (strcmp(strings[value], enum_str) == 0) {
            break;
        }
        value++;
    }

    if (strings[value] == NULL) {
        error_set(errp, QERR_INVALID_PARAMETER, name ? name : "null");
        return;
    }

    *obj = value;
}

static void qmp_input_start_optional(Visitor *v, bool *present,
                                     const char *name, Error **errp)
{
    QmpInputVisitor *qiv = to_qiv(v);
    const QObject *qobj = qmp_input_get_object(qiv, name);

    if (!qobj) {
        *present = false;
        return;
    }

    *present = true;
}

static void qmp_input_end_optional(Visitor *v, Error **errp)
{
}

Visitor *qmp_input_get_visitor(QmpInputVisitor *v)
{
    return &v->visitor;
}

void qmp_input_visitor_cleanup(QmpInputVisitor *v)
{
    qobject_decref(v->obj);
    g_free(v);
}

QmpInputVisitor *qmp_input_visitor_new(QObject *obj)
{
    QmpInputVisitor *v;

    v = g_malloc0(sizeof(*v));

    v->visitor.start_struct = qmp_input_start_struct;
    v->visitor.end_struct = qmp_input_end_struct;
    v->visitor.start_list = qmp_input_start_list;
    v->visitor.next_list = qmp_input_next_list;
    v->visitor.end_list = qmp_input_end_list;
    v->visitor.type_enum = qmp_input_type_enum;
    v->visitor.type_int = qmp_input_type_int;
    v->visitor.type_bool = qmp_input_type_bool;
    v->visitor.type_str = qmp_input_type_str;
    v->visitor.type_number = qmp_input_type_number;
    v->visitor.start_optional = qmp_input_start_optional;
    v->visitor.end_optional = qmp_input_end_optional;

    v->obj = obj;
    qobject_incref(v->obj);

    return v;
}
8) make && make install
9) Fehlende sgabios.bin in /usr/share/qemu/ laden
wget -O/usr/share/qemu/sgabios.bin http://qemu.weilnetz.de/w32/2012-06-28/sgabios.bin


Das zuvor unter Windows erstellte debian.img Image auf den Raspberry in den Ordner /qemu/ kopieren (ordner anlegen)
Starten:
/usr/bin/qemu -cpu 486 -hda /qemu/debian.img -m 64 -nographic

... Leider funktioniert das noch nicht so wie es sollte - Weiter als
Booting from Hard Disk...
GRUB loading.
Welcome to GRUB!
macht er leider nicht :(
Hab das auch hier gepostet: viewtopic.php?p=141946#p141946

Vielleicht kann mir ja jemand auf die Sprünge helfen ob ich noch etwas falsch gemacht habe oder wie es anders besser wäre :?: - Danke!
Posts: 92
Joined: Tue May 29, 2012 9:28 am
Location: Germany
by ghans » Sun Aug 05, 2012 10:35 am
Ich bin vor allem auf Dietmars Ergebnisse gespannt , was dabei rauskommt , wennn man QEMU user-mode mit WINE kreuzt. Echt abgefahren.

@Dietmar
Wenn du das lesen solltest , will ich noch mal meine Unterstützung dafür aussprechen , deine verbesserte QEMU Binary in Raspbian aufzunehmen (als rqemu vielleicht ?) oder gar das jetzige Paket zu ersetzen.
Falls andere meiner Meinung sind - zusammen wäre es einfacher , die Raspbian Macher zu überzeugen.


ghans
• Don't like the board ? Missing features ? Change to the prosilver theme ! You can find it in your settings.
• Don't like to search the forum BEFORE posting 'cos it's useless ? Try googling : yoursearchtermshere site:raspberrypi.org
Posts: 7154
Joined: Mon Dec 12, 2011 8:30 pm
Location: Germany
by Dietmar » Sun Aug 05, 2012 12:57 pm
Hallo,
ich bin gerade auf einen schwerwiegenden Fehler gestoßen bei dem tar Befehl auf dem Raspberry Pi, die aktuelle Version Wheezy mit hf.
Tar erzeugt völlig unvohersagbar Null Byte files.
Ich bin darauf gekommen, als ich 2 Qemu Installationen untersucht habe:
Eine mit Thoronirs Qemu mit --enable-NPTL und bei der anderen dasselbe bloss ohne NPTL.
SOO viele Unterschiede konnten es nicht sein. Dann habe ich das Thoronir Qemu auf meinem Desktop Rechner mit RAR entpackt und mit den frisch auf dem Raspberry entpackten Qemu verglichen.
Dabei sind mir dann die 0-Byte Dateien auf dem Qemu auf dem Raspberry aufgefallen.
Ich habe die zu entpackenden *.tar.bz2 Dateien mit dem Hexeditor Winhex verglichen.
Sie sind 100% gleich. Die Null Byte Dateien werden auch von Raspberry Pi selbst als leer angezeigt.
Jetzt verstehe ich die manchmal auftretende Fehlermeldung, dass irgendein Bios nicht gefunden wurde. Das war dann tatsächlich bereits bei der Installation nicht vorhanden.
Ich entpacke jetzt meine Dateien nur noch auf meinem Desktoprechner und kopiere sie dann auf den Raspi. Dann mache ich den Binär-Vergleich. Ergebnis: Die Dateien, die mit copy und past auf den Raspi geschickt werden, sind vollständig. Man muss nur später evt ein chmod 777 oder ähnlich auf den Ordner loslassen, weil das Linux beim copy und paste immer blöderweise die Besitzerrechte ändert,

Gruß Dietmar
PS: qemu-i386 mit Wine ist in Arbeit :mrgreen:
Posts: 361
Joined: Sun Sep 04, 2011 5:43 pm
by meigrafd » Sun Aug 05, 2012 1:35 pm
Danke Dietmar für all deine Bemühungen und auch Rückmeldungen ;)

Das wär ja mies wenn die Raspbian Version doch noch nicht fehlerfrei ist :shock:
Liegt das wirklich an tar oder ist vielleicht die SD Karte mittlerweile auf?


Hab jetzt mein Debian Image umgebaut und grub durch lilo ersetzt. Jetzt scheint zwar ein bischen mehr zu passieren aber trotzdem bootet er auf dem Raspberry nicht durch :(

Hier die Schritte die zur Vorbereitung auf dem PC dazu kämen:

7) apt-get remove grub-common grub-pc
8) apt-get install lilo
9) nano /etc/lilo.conf :
Code: Select all
boot=/dev/sda
lba32
large-memory

install=text
timeout=50
default=linux

image=/boot/vmlinuz-2.6.32-5-486
initrd=/boot/initrd.img-2.6.32-5-486
root=/dev/sda1
label=linux
10) liloconfig

Dann bleibt der Raspberry-QEMU leider hier hängen:
Booting from Hard Disk...

LILO 22.8 Loading linux.........................................................
................................................................................
............................... ..........................................
BIOS data check successful
Probing EDD (edd=off to disable)... ok

Auf dem PC lief das aber :?
..so langsam bin ich mit meinem Latein am Ende :cry:


/EDIT: Was bewirkt eigentlich " --enable-NPTL " ?
Posts: 92
Joined: Tue May 29, 2012 9:28 am
Location: Germany
by Dietmar » Sun Aug 05, 2012 2:37 pm
Hallo meigrafd,
der Fehler liegt tatsächlich bei dem tar Befehl in Raspbian. Mehrere SD Karten zeigen denselben Fehler.
Deshalb würde ich an deiner Stelle auch einmal den Qemu Ordner auf der SD Karte auf Nullbyte Dateien checken. Der Fehler bei dem Tar liefert immer nur korrekte Dateien oder halt mit Null Byte, nichts dazwischen. Mit Linux kenne ich mich nicht so gut aus. Installiere doch mal dasselbe Thoronir Qemu 0.15.50 auf deinem Desktoprechner und versuche, in diesem Qemu dein debian.img zu starten.
NPTL (ab Sept 2002) erlaubt es, eine Vielzahl von Threads gleichzeitig durchzuführen.
Mit dem Ergebnis, dass viele Prozesse gleichzeitig auf irgendeine Speicherstelle zugreifen wollen.
Das gibt dann Absturz bei Qemu. Deshalb hat man eine Methode futex() entwickelt,
die ein beliebiges Programm so lange warten lässt, bis sich der Wert einer Speicherstelle ändert.
Ist wie im Briefkasten, man guckt jeden Tag ob Post da ist.
Ich vermute, dass zwar NPTL Unterstützung standardmäßig in Qemu installiert wird,
aber die Methode futex() nicht für Host: ARM und Guest: i386. Das kann man testen:
Eine hello world program (für i386) läuft als qemu-i386 hello (auf Raspi).
Aber z.B. Wine nicht. Es gibt ein Video im Internet, bei dem alles NPTL abgestellt ist, das geht aber nur bei sehr alten Wine-versionen, erkennbar an einem veränderten pthread. Auch der Compiler darf nix mit NPTL erzeugen. Da ich aber glaube, dass nur aus Faulheit futex() nicht in Qemu für i386 implementiert wurde, müsste sich das relativ einfach beheben lassen,
Gruß Dietmar
Posts: 361
Joined: Sun Sep 04, 2011 5:43 pm
by meigrafd » Sun Aug 05, 2012 3:28 pm
Moin Dietman ;)

0 byte Files scheine ich keine zu haben aber wenn dann müsste er doch beim kompiliern auch Errors auswerfen oder nicht?
17:15:29 root@raspberrypi:~/raspidev/qemu# oIFS=$IFS;IFS="\n"; for i in $(ls -la *); do size=$(echo $i|awk {'print $5'}); [[ $size = 0 ]] && echo $i; done;IFS=$oIFS
17:16:44 root@raspberrypi:~/raspidev/qemu# oIFS=$IFS;IFS="\n"; for i in $(ls -la */*); do size=$(echo $i|awk {'print $5'}); [[ $size = 0 ]] && echo $i; done;IFS=$oIFS
17:18:13 root@raspberrypi:~/raspidev/qemu#


Wegen NPTL: laut " ./configure --help | grep -i NPTL " scheint das aber nur für den user-mode zu sein?

Die aktuelle qemu 1.1.1 funktioniert nicht so gut auf em Raspi?
Posts: 92
Joined: Tue May 29, 2012 9:28 am
Location: Germany
by Dietmar » Sun Aug 05, 2012 4:25 pm
Da alles läuft unter Qemu,
solange man nicht in den User Mode geht mit qemu-i386 auf ARM,
nehme ich mal an, dass NPTL nur im Usermode nicht implementiert wurde.
Die neuste Version von Qemu, egal ob Qemu oder Linaro erzeugt das nackte Grauen mit Raspi als Host :lol: . Ich habe alles an Versionen getestet, deren ich nur habhaft werden konnte. Manche Versionen funktionieren (z.B. die neuste, wenn man i386 direkt im Speicher ausführt. Die Ladezeit gegenüber Thoronirs Qemu beträgt mehr als das 3 fache für denselben Vorgang).Nur weil ich bereits im Herbst letzten Jahres das Qemu auf den Raspi gebracht hatte,
Simulation in der Simulation :mrgreen: , wusste ich das es geht. Komisch, dass ARM als Host so vernachlässig wird plötzlich.

Ich habe übrigens eine Bestätigung gefunden:

Peter Maydell (pmaydell) wrote on 2011-04-14: #2

"We only implement the futex syscalls if CONFIG_USE_NPTL. This isn't defined for the i386 target (the necessary support in target-i386 for pushing atomic insns up to the linux-user top level loop isn't implemented). The upshot is that running multithreaded programs in linux-user i386-target isn't supported and this is just one of the symptoms."

https://bugs.launchpad.net/ubuntu/+source/qemu-linaro/+bug/758424

confirmed bug: No qemu-i386 for NPTL. Das ist die Bankrotterklärung für qemu-i386 auf ARM im Moment.
Posts: 361
Joined: Sun Sep 04, 2011 5:43 pm
by ota-kun » Fri Jan 04, 2013 7:16 pm
Meigrafd ich hab das gleiche Problem. Hast du das Problem inzwischen behoben?
Posts: 36
Joined: Tue Jul 17, 2012 8:38 am