Not logged in. · Lost password · Register

Page:  1  2  3  4  next 

All posts by sicherha (53)

topic: SPiC Klausur August 2011 MultipleChoice  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
sicherha
Informatik-Veteran
Member since Oct 2010
53 posts
Quote by KlausFritz:
Quote by sicherha:
[...] Theoretisch wäre es möglich, dass zwei unterschiedliche virtuelle Adressen auf ein und dasselbe physikalische Stück Speicher verweisen (Preisfrage: wie? ;-)).
Auch auf die Gefahr hin, dass die Frage eher rethorisch Natur ist (in Hoffnung auf einen großen, tollen, goldenen Preis :D) :
Diese Funktionalität stellt ich mir analog zu Zeigern vor: Mehrere virtuelle Memory Pages zeigen auf einen physikalischen Page Frame.
Genau, man lässt in der Seitentabelle zwei unterschiedliche Einträge auf dieselbe physikalische Adresse verweisen. :-)
topic: SPiC Klausur August 2011 MultipleChoice  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
sicherha
Informatik-Veteran
Member since Oct 2010
53 posts
In reply to post ID 4650
Quote by KlausFritz:
Wobei mich dass nun doch ein wenig genauer interessiert.
Die MMU wird im Betriebssystem wirklich ganz ausgeschaltet? Das verblüfft mich, weil irgendwie muss das OS ja auch auf virtuellen Speicher zugreifen können!? Das OS kann doch nicht nur allein auf physikalischen Speicher arbeiten irgendwie muss es, wenn es die Prozesse kontrolliert ja auch auf deren Adressraum zu greifen können. Oder bezieht sich das Ausschalten der MMU nur auf ISR bzw Signalhandler!?
Du hast Recht, das war sehr stark (zu stark) vereinfacht. Natürlich arbeitet auch das Betriebssystem intern mit virtuellen Speicheradressen. Um zu erklären, wie das funktioniert, muss ich einen kleinen Bogen machen.

Ein Anwendungsprozess darf nur auf Speicheradressen zugreifen, die sich innerhalb seines eigenen virtuellen Adressraums befinden. Eine Speicherseite befindet sich genau dann in einem virtuellen Adressraum, wenn sie in die zugehörige Seitentabelle eingetragen ist. Bei jedem Speicherzugriff schlägt die MMU in der Seitentabelle nach, überprüft die eingestellten Zugriffsrechte und spuckt im Erfolgsfall die zugehörige physikalische Adresse aus - im Fehlerfall löst sie einen Trap aus.

Nun wollen wir mit Hilfe der MMU verhindern, dass ein Anwendungsprozess auf Speicherbereiche zugreift, die dem Betriebssystem gehören. Die naheliegende Möglichkeit ist hier: Wir sorgen dafür, dass keine Seite des Betriebssystem-Speichers in einem Anwendungsprozess eingeblendet ist. Wenn das Betriebssystem "angesprungen" wird (entweder durch einen Interrupt von außen oder durch einen Trap im Anwendungsprogramm), müssen wir folglich die MMU so umkonfigurieren, dass sie eine andere Seitentabelle benutzt, in die der Betriebssystem-Speicher eingetragen ist. Und das ist richtig teuer: Das Umkonfigurieren an sich ist zwar eine sehr simple Operation, aber als Folge eines Seitentabellen-Wechsels sind alle möglichen Caches nicht mehr gültig und müssen invalidiert werden.

Folglich wird in der Praxis ein anderes Verfahren benutzt, das ein besonderes Feature der MMU ausnutzt: Man kann jeden Eintrag in der Seitentabelle mit einem speziellen Bit markieren, welches angibt, dass diese Seite nur zugreifbar sein soll, wenn der Prozessor im privilegierten Modus (sprich: im Betriebssystemmodus) läuft. Jetzt kann man für jeden Anwendungsprozess den Betriebssystem-Speicher in die Seitentabelle eintragen (und zwar überall an exakt der selben Stelle), aber man markiert alle diese Einträge mit dem genannten "Supervisor-Bit". Dann ist dieser Speicher zwar nominell die ganze Zeit eingeblendet, aber die Anwendung selber kann nicht drauf zugreifen. Nur wenn das Betriebssystem drankommt, wechselt der Prozessor in den privilegierten Modus, alle benötigten Seiten sind sofort da (juhu, kein teures Umkonfigurieren der MMU!) und das Betriebssystem kann auf seinen eigenen Speicher zugreifen, ohne dass die MMU ihm auf die Finger haut.

Nachtrag zur ursprünglichen Frage ganz oben:
Nein, eine "umgedrehte" Abbildung von physikalischen auf virtuelle Adressen ist nicht möglich - die Seitentabelle funktioniert nur in die eine Richtung! Die Abbildung muss auch gar nicht unbedingt bijektiv sein. Theoretisch wäre es möglich, dass zwei unterschiedliche virtuelle Adressen auf ein und dasselbe physikalische Stück Speicher verweisen (Preisfrage: wie? ;-)).

Nachtrag 2:
Vorsicht, Signalbehandlung ist eine Sache, die rein innerhalb der Anwendung abläuft! Das Betriebssystem kümmert sich ums Zustellen, Blockieren usw., aber das Abarbeiten der Signalbehandlungsfunktion selber läuft immer im Anwendungskontext ab.
This post was edited on 2012-07-18, 01:54 by sicherha.
topic: Suche nach weiteren Klausurlösungen  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
sicherha
Informatik-Veteran
Member since Oct 2010
53 posts
In reply to post ID 4653
Es muss nur einer den Anfang machen. Lösungen zu Altklausuren fallen ja nicht vom Himmel, sondern es setzen sich ein oder mehrere Leute auf den Hintern und schreiben ihre Ergebnisse nieder. Das funktioniert ein bisschen wie in der Open-Source-Welt: Wer konsumieren möchte, sollte auch bereit sein, selber Hand anzulegen.

Das heißt im konkreten Fall: Trau dich ruhig, deine Teillösungen hier reinzustellen, und stell Fragen zu den Punkten, wo du dir nicht sicher bist!
topic: SPiC - Aufgabe6 - lstat  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
sicherha
Informatik-Veteran
Member since Oct 2010
53 posts
In reply to post ID 4568
Die Kurzantwort: Unter Windows wirst du das Teil nicht ohne ein paar Verrenkungen zum Laufen bekommen. Klopf dir entweder auf die heimische Kiste ein Linux oder mach das Testen per SSH (PuTTY) in der Uni.

Hier eine etwas ausführlichere (wenngleich plakative) Erklärung.
topic: AVR Studio zuhause  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
sicherha
Informatik-Veteran
Member since Oct 2010
53 posts
In reply to post ID 4433
Willkommen im Jahr 2012 - wo Business™-Anwendungen bei UTF-8-Sonderzeichen in Dateinamen immer noch Mist bauen. :rolleyes:
This post was edited on 2012-05-07, 11:26 by sicherha.
topic: März 2010 Aufgabe 2  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
sicherha
Informatik-Veteran
Member since Oct 2010
53 posts
In reply to post ID 4279
Müsste gehen.
topic: März 2010 Aufgabe 2  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
sicherha
Informatik-Veteran
Member since Oct 2010
53 posts
In reply to post ID 4276
Im Normalfall gilt eigentlich immer: Wenn du von einem I/O-Port Daten einlesen willst, lies aus PINx. Wenn du Daten rausschreiben willst, schreib nach PORTx.
topic: Klausur Juli 2010 & 2009  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
sicherha
Informatik-Veteran
Member since Oct 2010
53 posts
In reply to post ID 4272
Zuerst am besten eine kurze Wiederholung der Definition, was die Begriffe formale Parameter und "aktuelle" Parameter [1] zu bedeuten haben:
  • Formale Parameter sind die Namen, unter denen die aufgerufene Funktion auf ihre Parameter zugreifen kann.
  • "Aktuelle" Parameter sind die tatsächlichen Werte, die der Aufrufer an die aufgerufene Funktion übergibt.

So schaut nun der Stack aus, wenn man eine Funktion aufruft, die drei Argumente [2] entgegennimmt:

|        ...        |
|    Argument 2     |
|    Argument 1     |
|    Argument 0     |
| Rücksprungadresse | <- Stack-Zeiger
+-------------------+

Der Stack wächst von oben nach unten, der Stack-Zeiger zeigt immer auf das letzte gültige Element.
Der Aufrufer legt zuerst die "aktuellen" Parameter in umgekehrter Reihenfolge und anschließend die Rücksprungadresse auf den Stack. Das Programm springt in die aufgerufene Funktion. Diese kann nun mittels Zeigerarithmetik auf ihre formalen Parameter zugreifen:
  • Argument 0 liegt an Adresse (Stack-Zeiger + 4)
  • Argument 1 liegt an Adresse (Stack-Zeiger + 8)
  • Argument 2 liegt an Adresse (Stack-Zeiger + 12)
  • usw.

Ein Problem an diesem Modell ist, dass man innerhalb der Funktion den Stack nicht beliebig dynamisch wachsen lassen kann, weil sich dadurch der Stack-Zeiger verschieben würde und damit die Adressen für die formalen Argumente nicht mehr gültig wären. Deswegen findet man oft dieses erweiterte Modell:

|         ...         |
|     Argument 2      |
|     Argument 1      |
|     Argument 0      |
|  Rücksprungadresse  |
| alter Frame-Pointer | <- Frame-Pointer, Stack-Pointer
+---------------------+

Der Frame-Pointer ist ein zusätzliches CPU-Register, das immer auf den Beginn des Stack-Frames der aktuellen Funktion zeigt. Beim Betreten einer Funktion wird als Allererstes der alte Frame-Pointer auf den Stack gelegt und der neue Frame-Pointer auf den Beginn des neuen Stack-Frames gesetzt. Unmittelbar vor dem Rücksprung aus der Funktion wird der alte Frame-Pointer wiederhergestellt.

Was bringt uns das? - Jetzt können wir innerhalb der Funktion den Stack-Zeiger nach Herzenslust in der Gegend rumschieben, aber können trotzdem noch problemlos auf unsere formalen Parameter zugreifen, indem wir ihre Adressen relativ zum Frame-Pointer berechnen:
  • Argument 0 liegt an Adresse (Frame-Pointer + 8)
  • Argument 1 liegt an Adresse (Frame-Pointer + 12)
  • Argument 2 liegt an Adresse (Frame-Pointer + 16)
  • usw.

[1] Aktuell ist eine Fehlübersetzung des englischen actual - korrekt müsste es tatsächliche Parameter heißen. Leider hat sich der falsche Begriff mittlerweile eingebürgert. :-(
[2] Die Begriffe Argument und Parameter sind in diesem Kontext synonym.
This post was edited 2 times, last on 2012-03-27, 18:27 by sicherha.
topic: Sichtbarkeit Variablen/ Interrupts  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
sicherha
Informatik-Veteran
Member since Oct 2010
53 posts
In reply to post ID 4270
Betriebsmittel sind Dinge, mit denen ein Programm arbeitet oder die es zur Ausführung benötigt. Darunter fallen unter anderem:
  • Rechenzeit
  • Speicher
  • I/O-Geräte
  • ...

Betriebsmittel werden durch das Betriebssystem verwaltet und an laufende Anwendungen zugeteilt. Das ist aber (ohne Gewähr) nicht mehr Teil des Stoffumfangs von GSPiC.
topic: 2007-07-SPiC-KlausurEEIML Beispielklausur  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
sicherha
Informatik-Veteran
Member since Oct 2010
53 posts
In reply to post ID 4231
Klar. Wenn du ganz auf Nummer sicher gehen willst, kannst du auch das fehlende #include ergänzen. ;-)
topic: Zeiger  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
sicherha
Informatik-Veteran
Member since Oct 2010
53 posts
In reply to post ID 4208
Einfach so vom Programm aus ins ROM schreiben funktioniert nicht.

Was morty gestern meinte, war Folgendes: Unter Umständen werden Werte, die eigentlich unveränderlich sein sollten, beim Start in den (schreibbaren) RAM geladen. Wenn man genau Bescheid weiß, kann man diese Speicherstellen vom Programm aus gezielt überschreiben. Sobald man den Stecker zieht, gehen die RAM-Inhalte aber verloren und beim nächsten Start wird wieder die ursprüngliche Konstante dorthin geladen.
topic: Zeiger  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
sicherha
Informatik-Veteran
Member since Oct 2010
53 posts
In reply to post ID 4195
Grundsätzlich gilt: Wenn du böse Tricksereien wie das Wegcasten von const treibst, hast du kein nach dem C-Sprachstandard gültiges Programm mehr. Was das Programm an der betreffenden Stelle tatsächlich tut, ist undefiniert.

Wenn du Glück hast, passiert tatsächlich das, was du denkst, und das Schreiben funktioniert. Wenn du weniger Glück hast, passiert entweder gar nichts oder die Anwendung wird durch das Betriebssystem kontrolliert beendet ("stürzt ab"). Wenn du ganz ganz großes Pech hast, löscht das Programm deine Festplatte, exmatrikuliert dich von der Uni und schreibt deiner Freundin eine SMS mit dem Inhalt "Du bist mir zu fett". Undefiniertes Verhalten halt! :-D

... Und deswegen will man sich nicht auf irgendwelche kranken Hacks verlassen, sondern immer bewusst sauber programmieren. ;-)
topic: Zeiger  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
sicherha
Informatik-Veteran
Member since Oct 2010
53 posts
In reply to post ID 4189
Nö, es geht nicht.

Was beim Versuch eines Schreibzugriffs passiert, kommt darauf an, auf was für Hardware du läufst:
  • Auf einfachen Mikrocontrollern wie dem AVR geschieht gar nichts, der Schreibzugriff wird einfach ignoriert.
  • Auf einem normalen Rechner wird der Prozessor den ungültigen Zugriff abfangen und an das Betriebssystem melden. Dieses schießt den verursachenden Prozess in der Regel ab.
topic: 2007-07-SPiC-KlausurEEIML Beispielklausur  in the forum: 2. Semester Grundlagen der systemnahen Programmierung in C
sicherha
Informatik-Veteran
Member since Oct 2010
53 posts
In reply to post ID 4159
Quote by andi91:
Außerdem hätte ich für die Variablen sensor und lastmw einfach uint8_t statt unsigned char genommen, da der Port ja nur Werte von 0-255 liefert, ist das richtig?
Danke schonmal für die Antwort!
uint8_t und unsigned char sind dasselbe. Ersteres ist natürlich kürzer und damit weniger Schreibarbeit in der Klausur. ;-)
topic: Demo gegen Studiengebühren/Bildungsstreik  in the forum: Studium & Uni Hochschulpolitik
sicherha
Informatik-Veteran
Member since Oct 2010
53 posts
In reply to post ID 3474
Wichtig ist nun, genau aufzuklären, was da im Informationsfluss schief lief. Wo kam die Information her, dass die Mappe aus Studiengebühren finanziert worden sei?
Wie setzt man sich jetzt gegen diese überaus polemische Presseerklärung zur Wehr? An welchen Stellen enthält die Presseerklärung ihrerseits unwahre oder verfälschte Tatsachen?
Close Smaller – Larger + Reply to this post:
Special characters:
Page:  1  2  3  4  next 
Go to forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen