Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - Jidder

Seiten: 1 ... 78 79 [80] 81
1581
OS-Design / Protected Mode Tutorials?
« am: 31. January 2005, 13:50 »
Zitat von: ODIN
Ich mein wie kann ich Sektoren lesen ohne Interrupts?!? Geht das überhaupt?

Du musst dann über I/O Ports direkt oder mit DMA auf die Hardware zugreifen. -> hier gibt es infos für die verschiedenen medien

Zitat
Im ProtectedMode Tutorial ist im Deskriptor von der Speicherstell 0x8B000 die Rede. Is das jetzt 0x8B00 oder 0x8B000?

Kleiner Zahlendreher. Es muss 0xB800 oder 0xB8000 heissen. ;)
Im Real Mode ist die Speicheradressierung anders als im Protected Mode. Es wird über ein Segment-Offset-Paar adressiert mit der "Formel" Segment * 0x10 + Offset = Lineare Adresse. Das Segment für den Zugriff auf den Textmodus ist üblicherweise 0xB800. Wenn man für Offset = 0 nimmt kommt man mit dieser Formel auf die lineare Adresse 0xB800 * 0x10 + 0x0 = 0xB8000, was der Adresse im Protected Mode entspricht. Mehr dazu in Ausgabe #1

Zitat
3.) Wie kann ich in VGA oder SVGA im PMode schalten? Und wie kann ich hohe Auflösungen und höhere Farbtiefen erreichen?

Entweder du schreibst deinen eigenen Grafiktreiber für deine Grafikkarte (sehr schwer) oder du erstellst einen v86-Task der dann per VESA in den Grafikmodus schaltet (auch nicht leicht). Es gibt auch noch die Möglichkeit mit den VESA BIOS Extensions (VBE) Version 3.0 glaub im Protected Mode den Grafikmodus zu wechseln. (funktioniert nur mit neueren karten und da auch nicht immer) Aber da kenn ich mich auch nicht aus.

Aber am einfachsten ist es erstmal, wenn du den Grafikmodus wählst bevor du in den Protected Mode gehst.

Die VESA-Modi bieten hohe Auflösungen und hohe Farbtiefen. Eine Liste mit Modi gibt es hier.

PorkChicken
1582
OS-Design / FAT12
« am: 27. January 2005, 18:30 »
Zitat
times 1024-($-$$)-2 db 0

füllst du damit das image nicht nur bis 1022 byte auf? das ist doch zu wenig oder?

@Signatur: Star Trek - Der Film glaub ich
1583
Lowlevel-Coding / Bootloader
« am: 25. January 2005, 15:13 »
Zitat von: Roshl
DS, ES,... sind 16 Bit Breit, EAX 32Bit, das geht eigendlich garnicht.
Warum meckert der Assembler da nicht?


Zitat
When operating in 32-bit mode and moving data between a segment register and a general-purpose register, the Intel Architecture 32-bit processors do not require the use of the 16-bit operand-size prefix (a byte with the value 66H) with this instruction, but most assemblers will insert it if the standard form of the instruction is used (for example, MOV DS, AX). The processor will execute this instruction correctly, but it will usually require an extra clock. With most assemblers, using the instruction form MOV DS, EAX will avoid this unneeded 66H prefix. When the processor executes the instruction with a 32-bit general-purpose register, it assumes that the 16 least-significant bits of the general-purpose register are the destination or source operand. If the register is a destination operand, the resulting value in the two high-order bytes of the register is implementation dependent. For the Pentium Pro processor, the two high-order bytes are filled with zeros; for earlier 32-bit Intel Architecture processors, the two high order bytes are undefined.


-> http://faydoc.tripod.com/cpu/mov.htm
1584
Lowlevel-Coding / GRUB/Multiboot.
« am: 24. January 2005, 21:09 »
lol

also es muss afaik das elf format sein. allerdings produziert nasm irgendwie eine elf-datei, die so noch nicht geht. (irgendwelche symbole sind nicht aufgelöst oder so.) auf jeden musst du das mit ld nochmal linken. wenn ich mal eine schätzung abgeben soll würde das so gehen: ld -Ttext=0x100000 --oformat=elf -o kernel.elf nc_init.o

nc_init.o ist das was nasm beim assemblieren ausgespuckt hat und kernel.elf soll dein fertiger kernel sein. vielleicht musst du dann das org 0x100000 in der asm-datei entfernen.

frei nach: http://www.openbg.net/sto/os/xml/grub.html#multiboot
1585
Lowlevel-Coding / Keyboard Scancodeset
« am: 23. January 2005, 12:27 »
mal ne blöde frage: was ist die zweite scancode tabelle?
1586
Lowlevel-Coding / Big-Small-Sonstwas-Endian
« am: 23. January 2005, 12:25 »
nein, der computer macht alles richtig. die bytes sind immer noch in der reihenfolge, wie du sie haben wolltest.

es ist nur deine ausgabe, auf den ersten blick wegen der endianness falsch ausschaut. weil x86 little endian ist, ist z.b. das vierte byte eines dwords das most significant byte. (z.b. bei 0x44000000 ist das 0x44 oder 0x010001000, was bei dir auch korrekterweise das vierte byte ist.)

gib dein font mal nicht als dwords sondern als bytes aus. dann sehen die auch "richtiger" aus.
1587
Lowlevel-Coding / Big-Small-Sonstwas-Endian
« am: 23. January 2005, 10:46 »
solange du nur db und nur byte-operationen verwendest sollte die endianness keine probleme machen. den rechner kannst du da nicht beeinflussen. sonst hilft da nur sich an die endianness anzupassen.
1588
Offtopic / Welches OS für einen 286
« am: 10. January 2005, 17:08 »
ich würd sagen der PM ist schon sehr ausgereift. soweit ich weiss erfüllt er, wenn er richtig programmiert ist, voll und ganz seine aufgabe (speicherschutz und beschränkung von hardware/befehlen). aber soweit ich weiß nutzt kaum ein betriebssystem den PM korrekt (also so wie von intel gedacht), weil das sonst zu kompliziert und/oder zu langsam wird. da kommen dann so sachen wie software-taskswitching, nicht vollständiger speicherschutz, speicherverwaltung nur per paging oder nur per GDT, und vom betriebssystem bereitgestellte möglichkeiten sein CPL zu erweitern bzw. die beschränkung zu umgehen. sicherlich haben diese "tricks" ihre berechtigung, doch sie machen den ursprünglichen protected mode "weich". ich würde sagen nicht der PM ist in irgendeiner form schlecht sondern die OSses die für ihn geschrieben werden.

das sieht man z.b. wie zur zeit versucht wird bei allen betriebssystem die gefahr von exploits, die auf bufferoverflows im stack basieren, einzudämmen. also zu verhindern, dass code in einem datensegment ausgeführt wird. [afaik]die *BSDs (oder nur OpenBSD?) nutzen dazu seit neuestem die seit dem 386er verfügbare technik um speicherschutz zu realisieren (W^X = Write xor eXecute), linux trennt daten und code nicht (sie überlappen sich also immer noch), und windows xp popelt da mit service pack 2 rum, und AMD und Intel rüsten die NX- (bzw. bei Intel XD)-technologie in ihren prozzis nach. (ich glaub NX wird auch von linux unterstützt)[/afaik]

porkchicken
1589
Lowlevel-Coding / Delta Nanocore
« am: 06. January 2005, 20:30 »
Zitat von: TeeJay
Aber dann hat trotzdem der Anwendungsentwickler das Problem das er das dem OS mitteilen muss.


Wenn ein Programmierer in einem Delta Nanocore-Programm Systembefehle nutzt wird ja bei deren Aufruf in den Kernelmodus gewechselt. Hier kann das OS entscheiden ob es dem Programm die Ausführung entzogen werden muss, weil es unkooperativ ist. Das ist z.B. bei dem Befehl sleep() sinnvoll - das programm will ja keine CPU-Zeit mehr - oder bei Dateioperationen, die u.U. eine bestimmte Zeit dauern, in dem ein anderes Programm laufen kann. Bei Windows hab ich es beobachtet, dass sogar bei einem vergleichsweise schnellen (da keine HW-I/O) Systembefehl wie CreateThread() ein Taskswitch erfolgt. Das ist also eine gängige Sache. Aber das kann daran liegen, dass Windows (IIRC) früher auf komplett kooperativem Multitasking basierte.

Ich fände es gut, wenn du das kooperative Multitasking beibehältst.

Ich finde das mit den mehreren Stages viel zu kompliziert. Wenn du Stage-M mit Netzwerk- und Internetzugriff ausstatten willst, ist Stage-M schon ein ausgewachsenes Betriebssystem. Außerdem musst du für den Kernel und für Stage-M jeweils einmal Netzwerktreiber/FS-unterstützung schreiben. Auch wenn diese Treiber sich sehr ähnlich oder sogar die gleichen sein sollten, ist das ein erheblicher Aufwand. Ich würde den Stage-M vollständig in den Kernel integrieren. Der Kernel kann sich auch selbst checken und evtl. Updates herunterladen und dann sich selbst neuladen und booten.

Von Festplatte, Netzwerk oder Diskette booten kann auch GRUB. Wenn man den Bootserver (oder wie das Ding heisst, das halt dann die Datei für einen Netzwerkboot bereitstellt) entsprechend konfiguriert kann der bestimmt auch selber das System aktuell halten.

Ich würde auf jedenfall mir das Delta Nanocore gerne mal anschauen.

PorkChicken
1590
OS-Design / FAT12
« am: 31. December 2004, 11:53 »
Hi,

laut Microsoft Dokumentation wird FAT12 auf eine 1,44 MByte Floppy gespielt. Das hat _nur_ was mit der Cluster Zahl zu tun. Je nach Clusterzahl wird ein anderes FAT-Format verwendet. Diese Clusterzahl steht afaik im Bootsektor und ich glaube du kannst sie nicht ohne weiteres Manipulieren, um ein anderes FAT da raufzukriegen. Genaueres steht wohl in der Doku.

Auf jedenfall fällt mir kein Weg ein ein FAT16 oder FAT32 auf die Diskette zu spielen. Ein Grund ebenfalls nicht...

Mit NTFS geht es aber, auch wenns nicht schön ist und du nur noch 1 MByte freien Speicher hast: http://www.sysinternals.com/ntw2k/freeware/ntfsfloppy.shtml

PorkChicken
1591
Lowlevel-Coding / Funzt nicht?
« am: 31. December 2004, 00:29 »
Hi,

tjo dann fang ich mal an. ist ein bisschen spät, deswegen find ich vielleicht nicht alles. aber immerhin kannst du so morgen (also heute) ganz früh (also dann wenn ich noch schlafe :P) anfangen daran weiter zu machen. ^^

load_pm:
xor eax,eax
mov ax,cs
shl eax,4
add ax,eos_null_desc
mov dword [BaseAddr],eax
bits 32

nicht so ungeduldig ;) wir sind noch nicht im protected mode, deswegen ist das bits32 hier falsch (und kann für einen absturz sorgen.) also weg damit.

lgdt [eos_gdt_desc+20000h]
sollte besser lgdt [cs:eos_gdt] heissen. gibt nur probleme mit dem herumgerechne. vor allem im realmode kannst du so ein großes offset (> 16 bit) gar nicht verarbeiten. ;)

mov eax,cr0
or eax,1
mov cr0,eax

hier gehört das "bits 32" hin, denn erst hier sind wir im protected mode. :D

mov word ax, [eos_code_selector]
mov cs, ax

das wird nicht gehen. :shock: cs und (e)ip kann (soll) man nur über jmp's und call's usw. ändern. seltsam, dass dein assembler das ohne meckern übersetzt ... auf jeden fall ist dein prozessor spätestens jetzt im nirvana.  :roll:

deswegen solltest du folgendes schreiben: :idea:
jmp dword 0x10:kernel_pm
das stück code lädt cs mit 0x10 und eip mit einem korrekten offset. es springt also zu kernel_pm. du kannst das in dieser variante leider nicht so mit dem cs-aus-variable-laden machen. ist aber mMn auch nicht nötig. :wink:

mov word [kernlin],kernel_pm

DB 0EAh
      DW 0000000000010000b
kernlin      DW 0

das wird damit auch überflüssig. immer diese leute, die ihre opcodes selber zusammen popeln ... :roll:

deine selektoren schauen für mich ok aus. ich habe aber nie mit einer basis ungleich 0 gearbeitet, deswegen kann ich nicht so aus dem kopf sagen, ob das so einfach geht... :roll:

kernel_pm:
bits 32

das bits 32 ist hier überflüssig, weil es oben schon vorhanden ist, dürfte aber keinen schaden anrichten.

PorkChicken
1592
Offtopic / Welches OS für einen 286
« am: 31. December 2004, 00:02 »
Doch Minix unterstützt Multitasking.

   * Full multiprogramming (multiple programs can run at once)


laut Wikipedia sogar die 8088er version.
1593
Das Wiki / LowLevel #7
« am: 30. December 2004, 12:11 »
Ich fand das Interview mit Mike Hibbet gut und hätte kein Problem noch eins von dir zu lesen. ;) Also bei einem Interview würde ich es schon vorziehen das englische Original zu lesen.
1594
Lowlevel-Coding / Mapping/Paging
« am: 25. December 2004, 21:15 »
Mir haben diese beiden Tuts beim Implementieren vom Paging sehr geholfen:

http://www.osdever.net/tutorials/paging.php?the_id=43
http://www.osdever.net/tutorials/pagetables.php?the_id=48
1595
Lowlevel-Coding / Textausgabe INT 10h/13h
« am: 25. December 2004, 12:19 »
wobei das 0x7D0 das gleiche wie 80 * 25 * 2 ist. (=Spalten * Zeilen * Bytes_pro_Zeichen).
1596
Offtopic / Welches OS für einen 286
« am: 23. December 2004, 12:40 »
Linux gibt es nicht für den 286er. Mit Linux geht es erst ab dem 386er los. (Es gibt aber auch irgendwo ein Linuxport auf den 8086er.)

Ich hab gehört, Minix soll auf dem 286er laufen. -> http://www.cs.vu.nl/~ast/minix.html (und halt google)
Ich weiss nicht ob es da Binaries oder gar Diskimages gibt ...
1597
Offtopic / PsychoTest
« am: 22. December 2004, 20:37 »
wieso verboten? ist das nicht einfach eine lüge bzw. unwahre aussage? (oder aberglaube^^)?

ich finde auch, dass sowas hier wirklich nicht hin gehört.
1598
OS-Design / Timer-Interrupt
« am: 21. December 2004, 13:51 »
Zitat von: joachim_neu
@Pork: ne! denn soweit ich weiß, kommt ein interrupt, der wartet gleich zum zuge, wenn das andere sich abmeldet. das heißt also, dass entweder direkt nach dem EOI, also noch vor dem iret oder nach dem iret das int wieder aufgerufen wird.

jo aber erst das iret aktiviert die interrupts wieder. erst wenn das iret das interrupt flag setzt kann wieder ein interrupt auftauchen.

Zitat
man hat also keine zeit für den task, weil gleich wieder geswitcht wird. allerdings denke ich, dass 18,2 switches schon reichen...

ich würd sagen nein. wenn du z.b. ein os mit 30 offenen anwendungen hast, dann kannst du ja mit bloßem auge sehen welches programm gerade am zug ist und gerade arbeitet.

Zitat
und was ist der PIT? wird damit umgeschrieben, wie oft das Int 0x00 aufgerufen wird?

nope. der PIT ist das teil was den IRQ 0 auslöst. und den kann man entsprechend programmieren wie oft er das tun soll. (der PIT macht auch noch mehr und was das genau ist verrät google.)
1599
OS-Design / Timer-Interrupt
« am: 21. December 2004, 13:38 »
Zitat von: joachim_neu
du übersiehst bei deinem alle-1-ms-tick-int was! und zwar, dass das ausführen des int schon länger als 1 ms dauern würde, und sich das so überschlägt. und irgendwann ist dein stack zu groß, weil du nimmer zum iret des ints kommst! deswegen ist das mit den 100 ticks zwar praktisch, allerdings ist die vergleichroutine zu lange, als dass sie in 1 tick passt!


Während du in einer ISR bist, kannst du die Ints deaktivieren (wird sogar automatisch bei der Auslösung des Ints gemacht) und schon bist du das Problem los. Um die Hardware-Ints wieder zu aktivieren musst du ein EOI (End of Interrupt) an den PIC (Programmable Interrupt Controller) senden.

RDTSC ist der Befehl um den Timestamp Counter (TSC) auszulesen. Dieses 64 bit Register wird bei jedem Takt um 1 erhöht. Also bei einem 200 MHz Prozessor wird er um 200.000.000 pro Sekunde erhöht. Wenn man die Prozessorfrequenz weiss kann man mit diesem Register viel genauer die Zeit messen, als mit den anderen Standardmöglichkeiten. Der TSC hat halt keine "Interruptanbindung" ...

Hier mal der Code, den ich verwende um bei meinem OS den PIT (Programmable Interrupt Timer) umzuprogrammieren:
#define PIT_FREQ 1193181 // die Standardfrequenz des PIT
#define FREQ 20 // die Frequenz die wir haben wollen

void setup_pit()
{
int counter; // nur eine temporäre variable ...

counter = PIT_FREQ / FREQ; // (achtung: bei der wahl der frequenz die (ab)rundung bei division beachten! also nicht wundern wenn der timer irgendwann "vor-" oder "nachgeht")

// achtung bei mir ist es outb(value, port); !!!!!
outb(0x34, 0x43); // control word schreiben
outb(counter & 0xFF, 0x40); // an den Counter 0 die neue Frequenz schreiben
outb(counter >> 8, 0x40);   // --------- " ----------

// todo: interrupt handler installieren
}
1600
Lowlevel-Coding / Swapping/Paging
« am: 20. December 2004, 15:16 »
hi,

du solltest darauf achten, dass während des kopierens der stackpointer nicht irgendwo in den zu kopierenden stack zeigt. das gibt nur probleme wenn du da irgendwelche rücksprung adressen überschreibst (beim kopieren des stacks vom über 1mb nach unter 1mb) oder nicht mitkopierst (ich könnte jetzt aber keinen fall konstruieren, wo das passieren könnte, aber man weiss ja nie).

porkchicken
Seiten: 1 ... 78 79 [80] 81

Einloggen