Not logged in. · Lost password · Register

Page:  1  2  next 
stephan2
Member since Mar 2004
20 posts
Subject: 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
fredator
Ca$h Carlo$
Avatar
Member since Mar 2003
953 posts
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.
1.Sys: ZX Spectrum +2, 128K RAM, 0MB HD, Kassettendeck, RS232 Interface
2.Sys: Nintendo GameBoyAdvance SP, Metallicblau, 32bit CPU, Sound, Video/Mucke/NES Player
3.Sys: Sega Dreamcast, 128Bit, 2Mem Cards, 10+Spiele, SNES emulator, 2 (!) Controller
Christoph
DirtyBit
Avatar
Member since Nov 2002
166 posts
Quote by fredator:
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
"Prepare to meet your maker at the hands of my cat-launcher!" A.W.
Christoph
DirtyBit
Avatar
Member since Nov 2002
166 posts
In reply to post #1
Quote by stephan on 2005-09-18, 16:16:
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 ??

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.

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

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
"Prepare to meet your maker at the hands of my cat-launcher!" A.W.
fredator
Ca$h Carlo$
Avatar
Member since Mar 2003
953 posts
In reply to post #3
Quote by Christoph:
Quote by fredator:
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


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
1.Sys: ZX Spectrum +2, 128K RAM, 0MB HD, Kassettendeck, RS232 Interface
2.Sys: Nintendo GameBoyAdvance SP, Metallicblau, 32bit CPU, Sound, Video/Mucke/NES Player
3.Sys: Sega Dreamcast, 128Bit, 2Mem Cards, 10+Spiele, SNES emulator, 2 (!) Controller
Christoph
DirtyBit
Avatar
Member since Nov 2002
166 posts
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.
"Prepare to meet your maker at the hands of my cat-launcher!" A.W.
cody
Dipl.-Gamerx
Avatar
Member since Sep 2003
1140 posts
fredator:
dass 2 cli hintereinander einen deadlock verursachen halte ich für ein gerücht.
ist nämlich blödsinn!
cody@komputer:~$ LOAD "*",8,1
-bash: LOAD: command not found
fredator
Ca$h Carlo$
Avatar
Member since Mar 2003
953 posts
@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
1.Sys: ZX Spectrum +2, 128K RAM, 0MB HD, Kassettendeck, RS232 Interface
2.Sys: Nintendo GameBoyAdvance SP, Metallicblau, 32bit CPU, Sound, Video/Mucke/NES Player
3.Sys: Sega Dreamcast, 128Bit, 2Mem Cards, 10+Spiele, SNES emulator, 2 (!) Controller
This post was edited on 2005-09-20, 15:51 by fredator.
Ford Prefect
Pangalaktischer- Donnergurgler-Trinker
(Administrator)
Avatar
Member since Oct 2002
3266 posts
Also was ihr geschrieben habt, stimmt alles nicht. Ich hoffe ich schreibe das jetzt nicht zu spät ;-))
Quote: <mute> mit Miranda macht irc kein spass :P <Loki|muh> dann geh doch wieder :)
<mute> ich benutze kein miranda <Loki|muh> na und? :)
PoLL
needs anger management
Avatar
Member since Nov 2002
1049 posts
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 ...
Mäxle2
MS-Pinguin Schizophrener
Avatar
Member since Nov 2002
267 posts
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:
"Die Majorität der Dummen ist unüberwindbar und für alle Zeiten gesichert." (Albert Einstein)
Christoph
DirtyBit
Avatar
Member since Nov 2002
166 posts
In reply to post #9
Quote by Ford Prefect:
Also was ihr geschrieben habt, stimmt alles nicht. Ich hoffe ich schreibe das jetzt nicht zu spät ;-))

Was stimmt denn dann nicht?
Dein Bruder hat mich nur bestätigt.
"Prepare to meet your maker at the hands of my cat-launcher!" A.W.
Mäxle2
MS-Pinguin Schizophrener
Avatar
Member since Nov 2002
267 posts
Wir sollten das Program (s.o.) doch kompilieren... 8-(

Sorry for beeing off-topic
"Die Majorität der Dummen ist unüberwindbar und für alle Zeiten gesichert." (Albert Einstein)
Christoph
DirtyBit
Avatar
Member since Nov 2002
166 posts
Klausur war echt gut. War sogar schon ne viertel Stunde früher fertig  :-D

Mäxle: Hardwareaufgabe war doch nur abzeichnen
"Prepare to meet your maker at the hands of my cat-launcher!" A.W.
Mäxle2
MS-Pinguin Schizophrener
Avatar
Member since Nov 2002
267 posts
Quote by Christoph:
Mäxle: Hardwareaufgabe war doch nur abzeichnen

Ich weiß  :-D  
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...
"Die Majorität der Dummen ist unüberwindbar und für alle Zeiten gesichert." (Albert Einstein)
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Page:  1  2  next 
Go to forum
Datenschutz | Kontakt
Powered by the Unclassified NewsBoard software, 20150713-dev, © 2003-2011 by Yves Goergen