frage zu popl -4(%ebp) bzw. pushl -4(%ebp)

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

frage zu popl -4(%ebp) bzw. pushl -4(%ebp)
hallo ,
zu der folgenden aufgabe habe ich eine frage :

pushfl
popl -4(%ebp)
cli

pushl -4(%ebp)
popfl

aufgabenstellung : (Übung 7 / aufgabe 6 )im linux kern befindet sich oft folgender code . wozu ist dieser gut ?

meiner meinung nach geht es ja bei dieser aufgabe um das folgenden problem :
x()
{
cli

y();

sti

}

eine funktion x schaltet die interrupts aus . danach wird eine funktion y aufgerufen , die auch die interrupts ausschaltet .am ende der funktion y werden aber wieder die interrupts eingeschaltet . das problem besteht nun darin das ab dieser stelle in der funktion x die interrupts wieder erlaubt sind obwohl sie erst am ende erlaubt sein sollten !!

das ist doch so richtig ??

kann mir jemand erklären was popl -4(%ebp) bzw. pushl -4(%ebp)bewirkt ??

gruss stephan


aehm, das wird schwierig:

  1. deine formulierung: zuerst wird x und danach y aufgerufen gibt nicht das wieder, was du als code hingeschrieben hastt: da steht naemlich, dass die funze x die unterfunze y aufruft.
  2. Was hinzukommt: Wenn die Interrupts erstma gesperrt sind und du rufst ne funktion auf die das ganze nochmal versucht, wird selbige nicht mehr weiter kommen, weil nicht 2 kritische Bereiche gleichzeitig durchlaufen werden koennen. Nachdem du nun von x aus y aufrufst und dein InterruptEnable vor der Ausführung von y nicht mehr wiederhergestellt wird endeste in nem deadlock.

Versteh ich nicht!
X und Y sind hier in dem Beispiel doch Funktionen und keine Interrupthandler!
Warum solllte Y also nicht mehr aufgerufen werden?

Gruss Chris


Das Problem besteht zwar im Allgemeinen, hat aber mit dieser Aufgabe weniger zu tun.

In der Aufgabe speichert sich das Programm das Flag-Register als lokale Variable (und zwar direkt hinter den gesicherten Framepointer).

Dein oben beschriebenes Problem kann übrigens umgangen werden wenn man statt sti folgendes schreibt:

pushfl
cli

popfl

Damit werden nicht alle Interrups freigeschaltet, sondern der vorherige Zustand restauriert.

popfl -4(%ebp): nimm das oberste Stackelement und speichere es nach -4(%ebp)
pushl -4(%ebp): nimm das was an der Stelle -4(%ebp) steht und push es auf den Stack

ebp ist das Register des Framepointers.

Gruss Chris


Nö, so wie er es hingeschrieben hat, sinds handler. nix anders darf cli und sti aufrufen. und im allgemeinen is es auch unmoeglich das in hochsprache hinzuschreiben, was also die formulierung nicht richtiger macht.

haette er geschrieben
x() {
y();
}

waeren es einfache funktionen.

ABER: er hat in seiner beschreibung gleich noch mit nei geschrieben, das sowohl x als auch y die interrupts sperren und damit einen kritischen abschnitt durchlaufen, was i.A. nur interrupt handler duerfen


Das stimmt so nicht. Im Allgemeinen machen Interrupthandeler kein cli oder sti. Sie dürfen es zwar, aber normalerweise kümmert sich die CPU darum.

Auch jede andere Funktion darf Interrupts sperren oder freigeben. Das kann zum Beispiel bei zeitkritischen Prozessen, wie dem Einlesen von Messdaten, wichtig sein.


fredator:
dass 2 cli hintereinander einen deadlock verursachen halte ich für ein gerücht.
ist nämlich blödsinn!


@christoph: das von dir beschriebene sind trotzdem eigentlich int-handler.
Wenn Messwerte ankommen, dann loesst du nen interrupt aus, sperrst weitere interrupts, die cpu kuemmert sich um die werte, du gibst die interrupts wieder frei und haellst dein messintervall ein (kann keiner dazwischen funken).
Nebenlaukritsche Bereiche: analog. Jedesmal, wenn du ne Taste auf der Tastatur drückst, wird n Interrupt ausgeloesst, der das Zeichen irgendwohin schiebt, in nen Puffer. Natuerlich sollte der Puffer nicht gerade ausgelesen werden, deshalb ja auch die Sperrung.der Interrupts…

Ich hab uebrigens nicht gesagt, dass Interrupts dass immer machen, sondern lediglich dass Handler das duerfen. Also bitte erst lesen

normale Prozeduren die ints sperren koennen geht nicht, weil dazu die CPU im supervisormode laufen muss und um in selbigen zu kommen muss erst ein Interrupt oder ne Exception ausgeloesst werden.

@cody: ja, hast schon recht.bei genauerer betrachtung, ists schon wurschd wie oft jetzt ein flag geloeschd wird, solang man irgendwann wieder ausm handler rauswankt und keine endloschleifen mit gesperrten interrupts provoziert. Denkfehler meinerseits am fruehen morgen


Also was ihr geschrieben habt, stimmt alles nicht. Ich hoffe ich schreibe das jetzt nicht zu spät ;-))


dein bruder hat schon aufgeklärt … zumindest den dirty

wie ist denn die klausur verlaufen? ich konnte net kommen weil ich mein auto mit schüssel drinn zugemacht hab … :wand: :wand: :wand: :wand: und erst mal ersatzschlüssel holen musste …


Die Klausur war eigentlich gut machbar, nur die Hardwareaufgabe war etwas exotisch. Allerdings habe ich glaube ich ne Teilaufgabe vergessen :wand:
Zumindest bin ich mir ziehmlich sicher daß wir das Program das wir umschreiben sollten auch kompilieren sollten :wand: :wand: :wand:


Was stimmt denn dann nicht?
Dein Bruder hat mich nur bestätigt.


Wir sollten das Program (s.o.) doch kompilieren… 8-(

Sorry for beeing off-topic


Klausur war echt gut. War sogar schon ne viertel Stunde früher fertig :smiley:

Mäxle: Hardwareaufgabe war doch nur abzeichnen


Ich weiß :smiley:
War aber trotzdem erstmal geschockt weil ich damit überhaupt nicht gerechnet habe…

Kannst du mir bestätigen das ich das Compilieren vergessen habe? Die Ungewißheit macht mich wahnsinnig…


Meinst du die Aufgabe mit der Ein-Adress-Maschine? Da sollten wir nix kompilieren.


Ich wollte nur einen Witz machen. Den Text hab ich gar net durchgelesen :wink:


Wirklich nicht? Drecks Paranoia…hab mir eingeredet ich hätte da was vergessen;
Dann eben doch ne 1,0 :smiley:


dass ich das noch erleb! eine leichte (!) OTRS4 Klausur… das war ein Geschenk Gottes. Und die Hardware aufgabe, da dachte ich nur noch: das hab ich doch schon irgendwo mal gesehen?! Ja (bing)! 10 Punkte auf Seite im Skript finden und etwas Tinte verbrauchen fand ich echt sozial.

Auch waren diesmal keine grossen Hackerfragen drann. Naja irgendnen Scheiss bei der Ankreuzaufgabe hab ich gemacht, aber darauf kommts im Endeffekt auch nimmer an :slight_smile: