RAM Test

So, diesmal ein Program bei dem man nachdenken muss. Ich hätte gerne ein Program mit dem man seinen Arbeitsspeicher testen kann. Das Programm sollte folgende Bedingungen erfüllen:
  • Startadresse des testenden Speicherbereichs in Hex eingeben
  • Grösse des zu testenden Speicherbereichs eingeben
  • den zu testenden Speicherbereich mit dem Wert 0x55 initialisieren
  • Read und Compare-Operationen auf diesen Bereich ausführen
  • 3 Fehlerabfragen einbauen (Out of Range, Wrong value found, Wert ok)
  • das ganze als Funktion, als Rückgabewert ein Pointer mit der Adresse eines der Fehler

Sollte also eine Speicherzelle defekt sein, so würde der Wert dort drinnen nicht 0x55 sein.
Sollte kein Fehler gefunden werden, dann ist der Rückgabewert der Funktion NULL.
Die Funktion sollte nur EINE Returnanweisung enthalten.

Hier mal ein kleines Konstrukt:
Code:
uint8 * ram_test(uint8* startadresse,uint32 size)
{
...
}

void main()
{
...//Funktionsaufruf
}

Interessant wäre es noch wenn jemand ein ausführliches Flussdiagramm über den Ablauf seines Programmes dazu machen würde. Ein ZÜD wäre natürlich noch besser!
 
hallo Tec,

ich hätte da mal noch eine Frage:

Startadresse des testenden Speicherbereichs in Hex eingeben
Grösse des zu testenden Speicherbereichs eingeben
den zu testenden Speicherbereich mit dem Wert 0x55 initialisieren

Was passiert mit den Daten, die vielleicht in dem zu testenden Speicherbereich liegen.
Oder anders gefragt: Wie weiss ich, das ich nicht gerade den Kernel abschieße ?

Ich programmiere noch nicht sehr lange;
Falls die Frage dumm ist, erklär mir bitte einer warum. ;)
 
ZU C.Mon

Ich bin auch erst C++ Anfänger aber ich glaube, das man einfach mit einem Zeiger
den Speicher reserviert und den reservierten Speicher dann testet.

mfg Fat Tony
 
Original von Fat Tony
ZU C.Mon

Ich bin auch erst C++ Anfänger aber ich glaube, das man einfach mit einem Zeiger
den Speicher reserviert und den reservierten Speicher dann testet.

mfg Fat Tony
also zunächst mal: es heisst D.Mon ;)
den zu testenden Speicherbereich mit dem Wert 0x55 initialisieren
heisst das nicht "0x55" hineinzuschreiben und damit das überschreiben, was davor drinstand ? *grübel*
Und wie sieht das "testen" nach Deiner Interpretation dann aus ?
Ich habe das so verstanden, dass man einen bestimmten Wert hineinschreibt und dann nachsieht, ob er auch drin steht - oder liege ich jetzt völlig daneben ?

Leider scheint das Interesse für diese Aufgabe ja ziemlich bescheiden zu sein - Schade eigentlich
 
Hallo!

Wenn man die Größe des zu testenden Speicherbereichs eingeben kann, ist es doch möglich, dass man die gesamte Größe des zur verfügung stehenden Speichers
eingibt, dann würde sozusagen wie D.Mon es schon richtig gepostet hat "Der Kernel abgeschossen werden".
Aber nur so kann man den Speicher auf Fehler testen.
Man kann also nie den gesamten Specher testen und deshalb auch nie wissen ob der Ram in Ordnung ist.
Bin ich da richtig oder völlig falsch ?(

Außerdem wie weiß ich auf welchen Adressen das BS seine Files gespeichert hat?
mfg Fat Tony
 
Hi,

@Fat Tony: Ich glaube da liegst du richtig. Man kann nie den gesamten Ram testen mit einem Programm welches auf ein Betriebssystem läuft. Das Programm selbst muss ja auch immer auf den Ram liegen.

Dass der Kernel aber abgeschossen wird, das sollte so gut wie unmöglich sein. Eine "Segmentation fault" könnte zB. so eine Schutzmaßnahme sein, welche das Betriebssystem dafür verwendet.

mfg ecologys
 
hallo ecologys,

ich vermute, dass das u. a. vom Betriebssystem abhängig ist.

Grundsätzlich würde ich aber annehmen, dass ein Programm, welches mit ausreichenden Berechtigungen läuft auch in der Lage ist, Speicherbereiche zu beschreiben, die anderen Prozessen zugeordnet sind.
Die gilt wohl insbesondere dann, wenn man in der Lage ist, die physikalische Addresierung einzelner Speicherstellen vorzunehmen.
 
Hi D.Mon,

wenn man den Bereich des Betriebssystems überschreibt funktioniert ja leider nichts mehr.
Ich hab mir da so was ausgekopft, weiss aber nicht ob das hinhaun würde.

Und zwar hab ich mir 2 Varianten ausgedacht:

1. Man könnte ja zB. die erste Hälfte des Rams testen, wobei das Betriebssystem und das Program in der hintern hälfte stehen sollte. Dann macht man eine Kopie des Betriebssystems und des Prozesses in der ersten Hälfte und biegt in der PageTable die zeiger um.
Voraussetzung ist aber dabei ausreichende Zugriffsrechte, wie D.Mon schon gesagt hat.

2. Man könnte ein eigenes Betriebssystem schreiben, das nur den ram testet. Dann müsste man auch alles umkopieren und Zeiger umbiegen aber es wär bedeutend einfacher wegen der Rechte und dem Kernel Mode.



mfg ecologys
 
Bleibt "nur" noch die Aufgabe herauszufinden, in welchem physikalischen Bereich des RAM der Kernel und die übrigen BS Geschichten (z. B. die Verwaltung des virtuellen Speichers und der ) sich gerade befinden und wie man diesen addressieren kann. ;)

Ich bin mir sicher, dass man diese Aufgabe lösen kann, wenn auch sehr systemspezifisch.
was mich allerdings ein wenig irritiert, ist, dass hier eine Aufgabe eingestellt wird und man das Ganze dann einfach sich selber überlässt.

Sieht ein wenig so aus, als hätte da jemand seine Hausaufgaben gepostet :D
 
Jetzt hab ich es man startet das Programm von Bootdiskete und läst sich die Daten in eine Textdatei auf der HDD speichern!
Dann kann man 100% des Speichers testen!!

mfg Fat Tony
 
Hallo!
Wäre nett, wenn jemand mal auf die ursprüngliche Frage antworten könnte. Sitze gerade vor der selben Aufgabe. Ich muss auch ein solches Programm schreiben. Dieses wird später zum RAM testen auf einem Motorolachip verwendet. Die Frage, ob ich einen wichtigen Speicherbereich überschreibe, kann später geklärt werden. Erst muss ich das Programm mal schreiben und zum Laufen bringen.

@ecologys: Flussdiagramm habe ich!

Muss mein Prog in C in Inline-assembler schreiben. Wie kann ich Assembler in Visual C einbinden? Wenn sich jemand auskennt bitte melden!

mfg
 
Original von Fat Tony
Jetzt hab ich es man startet das Programm von Bootdiskete und läst sich die Daten in eine Textdatei auf der HDD speichern!
Dann kann man 100% des Speichers testen!!

mfg Fat Tony

Müssen Dein Bootsystem und Programm um zu laufen nicht von der Bootdiskette in den Arbeitsspeicher geladen werden ?
 
Hi,

da kann ich nur D.Mon recht geben, das Programm muss in den Ram geschrieben werden und schon kann er nicht so ohne weiteres komplett getestet werden.
Das ganze wichtige Zeugs, Betriebssystem und so, müsste ab Adresse 0 starten, da eigentlich ein jedes Programm mit der Adresse 0 startet. 0 natürlich ausgeschlossen, da das der Nullpointer ist.

@kletterbeer: Du musst anfangs alles mit Assembler starten und kannst erst später in C-Code wechseln. Gute Beispiele dafür findest du unter [2].

Ein bisschen Werbung von unserem Project das dazu passt und vielleicht weiterhilft :]
[1] http://sourceforge.net/projects/sweb
[2] http://sweb.sourceforge.net/

mfg ecologys
 
Da hat sich wohl ein DAU einen üblen Scherz erlaubt...der RAM wird bei jedem Systemstart Byte für Byte getestet... :D
 
0 natürlich ausgeschlossen, da das der Nullpointer ist.
Nö. Null ist genauso eine Adresse wie alle anderen. Nur ist es eben unter vielen OS reserviert, damit man eben die Nullpointer verwenden kann ;)
Unter Windows braucht man mindestens einen Treiber, um auf den physischen RAM zugreifen zu können. Wers nicht glaubt, kann gerne versuchen im Ring3 Modus ein NT System mit seinem Programm durch Speicherüberschreiben abzuschießen :rolleyes:
Da gibts bessere Möglichkeiten.
 
wäre es nicht wirklich am sinnvollsten, das programm als eigenes OS in assembler zu schreiben? dadurch wird so wenig ram wie möglich durch aktive prozesse beschrieben, das heißt der größte teil kann durch das programm getestet werden. und der rest ist ja schon durch das programm belegt, das heißt, dieser teil sollte sowieso schon funktionieren, da sonst das programm nicht laufen wuerde? oder lieg ich irgendwo komplett falsch?
 
ähäm... diese Aufgabe ist eine Vorleistung für "Mikrocomputertechnik und hardware-nahe Software-Entwicklung" an der FH Kempten ;) Woher ich das weiß? Ein freund studiert da auch, und hat offensichtlich die gleiche Aufgabe bekommen. Man soll das für einen MPC555 Chip in C schreiben =)

Mach deine Aufgaben selbst, du schlingel :D
 
lolz... das hab ich net gesehen^^ ich dachte des topic wär noch einigermaßen aktuell, weils auf der ersten seite war ?(

is aber wirklich die aufgabe von der fh kempten, die mein freund bekommen hat :D
 
Zurück
Oben