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 - presswurst

Seiten: [1]
1
Lowlevel-Coding / Re: Treiber-Sourcecodes?
« am: 07. August 2007, 09:56 »
Normalerweise wuerde ich euch ja zustimmen, mit meiner IDT bin ich noch weit weit entfernt von treibern etc.

Aaaaaber: Ich frage nicht weil ich vor habe das in mein Betriebssystem zu integrieren, es ist eher 'allgemeines interesse' was die Funktionsweise der Hardware betrifft. In GRUB habe ich einen sehr einfachen Bootloader gefunden der es einem erleichtert einfach mal einen kleinen "Kernel" zu schreiben und ein wenig mit der Hardware "rumzuspielen" ;)
2
Lowlevel-Coding / Treiber-Sourcecodes?
« am: 06. August 2007, 19:31 »
Hallo Community!

Ich wuerde mal gerne in anderen Betriebssystemen stoebern wie die Geraetetreiber funktionieren und programmiert sind. Alleine schon deswegen weil ich sogar in Google zu einigen Themen nur duerftige Informationen finde und zum anderen um mein Wissen ueber Lowlevel-Programmierung noch zu vertiefen (von den Profis kann man schliesslich noch lernen *g*).

Darum wuerde ich mal gerne wissen welches OS ihr mir zum Thema Treiber-Quellcodes empfehlen wuerdet. Von Linux hoert man ja dass es zwar eine umfangreiche Hardware-Unterstuetzung bietet aber dass alles etwas unuebersichtlich gehalten ist, darum wuerde ich gern mal die Freebsd-Quellen untersuchen, zumal das auch mein Lieblings-OS ist :) - Allerdings befuerchte ich dass ein OS das mit solchen extremen Abstraktionsebenen eine Wissenschaft fuer sich ist was die Sourcecodes betrifft. Sollte ich mir vllt. etwas anderes suchen wenn ich es einfach nur auf die Treiber abgesehen habe? Was fuer ein OS koenntet ihr mir empfehlen wenn FBSD euerer meinung nicht in frage kommt?

In erster linie interessiere ich mich fuer PCI-Handling und USB-Geraete.

lg, presswurst

3
Lowlevel-Coding / Re: Kleines IDT-Problem
« am: 06. August 2007, 19:18 »
Das ist es wohl gewesen. Ich musste feststellen das Grub das das Interrupt Flag geloescht hat. Allerdings kommen mit IF weitere Probleme auf:

Bei jedem call, int oder ret gibt es wieder eine exception (Ohne IF ist dies nicht der Fall). Woran koennte das liegen? Muss ich erst den PIC neu programmieren bzw fuer alle "reservierten" Interrupts (also Exception-Inerrupts und IRQ-Interrupts) eine Routine erstellen?

Die 256*8 Bytes der IDT stammen aus der BSS-Sektion alle Eintraege (abgesehen von Interrupt 0x7f) enthaelten deswegen nur 0x00-Bytes, kommt die CPU damit evtl nicht zurecht?
4
Lowlevel-Coding / Re: Kleines IDT-Problem
« am: 04. August 2007, 21:29 »
lol ne, also so stoffelig bin ich ja auch nicht :p

Meine do_nothing Funktion sieht so aus:
.globl _do_nothing
_do_nothing: iret

Report? dann werd ich mich Morgen wohl durch die docs graben muessen - Aber danke fuer den Tip :)

EDIT:
hmpf, ich vergesse immer wieder dass man die Einstellungen vom bochs auch ganz bequem in der Console veraendern kann... hier kommt man der komplette auszug:

Zitat
00204344146i[CPU0 ] BxError: instruction with opcode=0xff
00204344146i[CPU0 ] mod was c0, nnn was 7, rm was 7
00204344146i[CPU0 ] WARNING: Encountered an unknown instruction (signalling ille
gal instruction)
00204344146e[CPU0 ] interrupt(): gate descriptor is not valid sys seg
00204344146e[CPU0 ] interrupt(): gate descriptor is not valid sys seg
00204344146i[CPU0 ] protected mode
00204344146i[CPU0 ] CS.d_b = 32 bit
00204344146i[CPU0 ] SS.d_b = 32 bit
00204344146i[CPU0 ] | EAX=00105000  EBX=0002bd20  ECX=0001c300  EDX=001053f8
00204344146i[CPU0 ] | ESP=00104fdc  EBP=00104ff0  ESI=0002be60  EDI=00000080
00204344146i[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df if tf sf zf af pf cf
00204344146i[CPU0 ] | SEG selector     base    limit G D
00204344146i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
00204344146i[CPU0 ] |  CS:0008( 0001| 0|  0) 00000000 000fffff 1 1
00204344146i[CPU0 ] |  DS:0010( 0002| 0|  0) 00000000 000fffff 1 1
00204344146i[CPU0 ] |  SS:0010( 0002| 0|  0) 00000000 000fffff 1 1
00204344146i[CPU0 ] |  ES:0010( 0002| 0|  0) 00000000 000fffff 1 1
00204344146i[CPU0 ] |  FS:0010( 0002| 0|  0) 00000000 000fffff 1 1
00204344146i[CPU0 ] |  GS:0010( 0002| 0|  0) 00000000 000fffff 1 1
00204344146i[CPU0 ] | EIP=e58955cf (e58955cf)
00204344146i[CPU0 ] | CR0=0x00000011 CR1=0 CR2=0x00000000
00204344146i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
00204344146i[CPU0 ] >> (invalid)  : FFFF
00204344146e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown
 status is 00h, resetting
00204344146i[SYS  ] bx_pc_system_c::Reset(SOFTWARE) called

Kannst du damit was anfangen?
5
Lowlevel-Coding / Kleines IDT-Problem
« am: 04. August 2007, 17:58 »
Hallo Community,

Schon den ganzen Tag versuche ich eine IDT anzulegen, leider ohne Erfolg so dass ich mal Teile meines Codes hier poste, vllt findet ja jemand den Fehler:

Zuerst die Struktur (habe ich von http://www.osdev.org/wiki/IDT):

#pragma pack(push,2)
struct idt {
unsigned short offset1;
unsigned short select;
unsigned char reserved;
unsigned char attr;
unsigned short offset2;
};
#pragma pack(pop)
-- das pragma sollte alignment-bytes verhindern.

Auf globaler Ebene habe ich einen Speicherbereich fuer die IDT reserviert (struct idt idt[256]).

Nun kommt die Funktion mit der ich einzelne IDT-Eintraege setze:

void setidt(struct idt *idt, unsigned int offset) {
unsigned short codesel;

asm ("mov %%cs, %%ax\n\tmov %%ax, %0" : "=r" (codesel) :: "%eax");

idt->select = codesel;
idt->offset1 = offset & 0xffff;
idt->offset2 = (offset >> 16) & 0xffff;
idt->attr = 0x8e;
}
(Man beachte dass es sich bei 'offset' um eine Adresse einer Funktion handelt)

Ich habe mal einen Test-Eintrag erstellt:
setidt(&idt[0x7f], (unsigned int)do_nothing);
(do_nothing ist eine Funtion die nur eine Anweisung enthaelt: 'iret', daher kann der fehler als auch nicht kommen).

Als Letztes kommt noch eine Funktion um die IDT zu laden (void loadidt(struct idt*)):

.globl _loadidt
_loadidt:

push %ebp
mov %esp, %ebp
mov 8(%ebp), %eax
mov %eax, (bas)
lidt (idts)
leave
ret

idts:
lim: .word 256*8-1
bas: .long 0


Das Ausfuehren eines int 0x7f erzeugt folgenden Fehler:

00046832145e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting


Kann mir vllt jemand sagen wo mein Fehler liegt? Bin schon fast am verzweifeln... :(


lg, presswurst
6
Lowlevel-Coding / Re: Wieviel Speicher ist vorhanden?
« am: 04. August 2007, 17:39 »
Ah danke :)

Aber jetzt habe ich ganz spontan noch eine Frage zum belegten Speicher:

Was fuer Speicherbereiche sind denn grundsaetzlich belegt? also bisher kenne ich nur den fuer die IVT [0x0000 bis (0x0000 + 256 * 4)] und den gemappten Videospeicher [0xb8000 bis (0xb8000 + (25 * 80) * 2)]. Gibt es Sonst noch Speicherbereiche die nicht fuer den Allzweckgebrauch nutzbar sind?
7
Lowlevel-Coding / Wieviel Speicher ist vorhanden?
« am: 03. August 2007, 16:23 »
Hallo Community!

Gerade stelle ich mir die Frage auf welche Weise man rausfinden koennte wieviel Speicher der Computer hat.

Kann mir das jemand beantworten?

lg, presswurst
8
Lowlevel-Coding / Re: Cursorposition aendern?
« am: 03. August 2007, 00:52 »
Was fuer ein idiotischer Anfaengerfehler :( - Da haette ich wohl auch alleine drauf kommen koennen, habe bei den I/O Ports den Datenbreiten wohl nicht die noetige Aufmerksamkeit geschenkt.... Danke fuer den Code - wenn man 8 Bit nimmt funktioniert es auf jeden Fall :)

Achja, was ich eben bemerkt habe: Bei den beiden Registern handelt es sich nicht um X/Y -Position sondern um das Highbyte/Lowbyte einer 16 Bit breiten linearen nummerierung der zeichen ;)
9
Lowlevel-Coding / Cursorposition aendern?
« am: 02. August 2007, 22:20 »
Guten Abend ;)

Also da mein letzter Thread leider trollifiziert wurde und deshalb nun geschlossen ist danke ich dir mal hier fuer den Tip mit GRUB, bluecode! - Das Ding ist echt schick - und wieder was gelernt *g*

Aber jetzt wo ich im PM bin habe ich gleich mal noch eine Frage die etwas mit dne I/O Ports zu tun hat, und zwar wuerde ich gern die Cursorposition auf dem Bildschirm veraendern. Habe mir Ein paar Funktionen geschrieben wie clrscr() und puts() um in den Videospeicher zu schreiben, aber das sieht alles einfach nicht aus wenn der Cursor nicht folgt sondern immer an der einen Stelle herumduempelt:

http://666kb.com/i/aqlhcnmt8i93d64zw.png

Darum habe ich mal ein wenig gegoogled und auch das hier gefunden:

http://www4.informatik.uni-erlangen.de/Lehre/WS06/V_BS/oostubs/web/aufgaben/aufgabe1/cga.shtml

So wie ich das sehe muesste das also wie folgt funktionieren:

mov $14, %eax
mov $0x3d4, %dx
out %eax, (%dx)
mov $0x3d5, %dx
mov <neue_position>, %eax
out %eax, (%dx)

## und das gleiche nochmal mit register 15...

Aber das tut es auch nicht... Was mache ich denn da falsch?


lg, presswurst
10
Lowlevel-Coding / Re: I/O Ports, externe Geraete etc?
« am: 01. August 2007, 22:52 »
Super - Da stehen auch noch gleich Informationen zu Festplatten und Diskettencontrollern drin, damit werde ich mich wohl befassen wenn ich mit PCI fertig bin, da weiss ich ja schonmal wo ich es finde :) - Danke

Also was die Funktionen betrifft habe ich es so verstanden: Wenn ein Geraet im 'header type' auf das vorhandensein von funktionen hinweist dann kann das uebergeben einer Funktionsnummer dazu fuehren dass die PCI Device Structure sich von Funktion zu Funktion unterscheidet? Kann ich mir das so vorstellen dass dieses Geraet mit hilfe der Funktionen mehrere virtuelle Geraete 'simuliert'?

Wie finde ich denn ueber den Header type heraus ob ein bestimmtes Geraet Funktionen unterstuetzt?

--

Auf jeden fall habe ich mir schonmal Teilweise einen Bootloader Programmiert der FAT12 unterstuetzt und nach dem laden einer Code-Datei in den PM wechselt und diese Datei ausfuehrt, damit werde ich dann wohl weitaus bequemer in der lage sein mit PCI ein wenig 'herumzuspielen' ;)

Also danke schonmal an dieser Stelle, wenn nochwas ist werde ich fragen ;)
11
Lowlevel-Coding / Re: I/O Ports, externe Geraete etc?
« am: 01. August 2007, 15:39 »
Achso, dann habe ich den Code auf der Seite doch nicht so falsch verstanden... Aber was ist denn die Function-Nummer? Dachte das ist etwas Geraetespezifisches was bei jedem Geraet ein anderes Verhalten ausloesen kann. Oder irre ich mich da?


Wenn es so funktioniert wie ich mir das bisher denke dann sollte dieser Schnipsel bewirken dass sobald ein Geraet auf dem Bus gefunden wird die Funktion dealWithIt() aufgerufen wird:

int bus, device;
unsigned int indowrd, outdword;

for (bus = 0 ; bus <= 0xff ; bus++) {

for (device = 0 ; device < 0x1f ; device++) {

outdword = 0x80000000 | (bus << 16) | (device << 11);
out32(0xcf8, outdowrd);

indword = in32(0xcfc) & 0xffff;
if (indword != 0 && indword != 0xffff) {
dealWithIt(bus, device);
}

}

}

Ist das so richtig?
12
Lowlevel-Coding / Re: I/O Ports, externe Geraete etc?
« am: 01. August 2007, 13:13 »
Danke erstmal bluecode, das war schon sehr hilfreich, allerdings bleiben noch ein paar Fragen offen:


Zitat
Was fuer I/O-Ports sind fuer was genau gut?
Um mit der Hardware zu kommunizieren.

Ja, das war mir schon klar ;) - Allerdings meinte ich das etwas anders:
Einige Ports haben ja eine spezielle Aufgabe, so ist der Port ueber den man das A20-Gate freischaltet immer gleich. Gibt es vllt eine Liste mit Ports und was sich hunter ihnen verbirgt? also wozu "sie gut sind"?


Zitat
wie komme ich an die Vendor-ID eines Speziellen PCI-Geraetes heran?
siehe hier

Danke, auch das hat ein wenig licht ins Dunkel gebracht, allerdings auch nicht vollstaendig.

Man stelle sich folgende Situation vor: Ich moechte herausfinden ob in meinem PC ein bestimmtes PCI-Geraet vorhanden ist (Ein Geraet eines bestimmten Herstellers, um bei der Vendor-ID zu bleiben). Ich moechte nun rausfinden ob das Geraet vorhanden ist. Vllt gibst da auch ein Beispiel fuer?

Gibt es im Internet evtl auch noch andere Dokumente die sich mit I/O Ports befassen bzw. den x86-Anweisungen in und out?
13
Lowlevel-Coding / I/O Ports, externe Geraete etc?
« am: 31. July 2007, 21:23 »
Hallo Community!

Ich habe ja schon einige Erfahrungen mit Lowlevel-Programmierung gemacht, was mir aber bis heute ein Raetsel ist sind IO-Ports und auf den Speicher gemappte geraete (?) wie zb. der Grafikspeicher an den mal ueber den normalen Arbeitsspeicher rankommt.

So wie ich das bisher verstanden habe sind das zwei ziemlich verwandte Themen.

Also, die Fragen die mich bewegen sind folgende: Wie findet man raus welche Speicherbereiche auf ein Geraet gemappt (?) sind? Wie kann man diese "verknuepfung" zwischen Geraet und Speicher aufheben bzw. herstellen?

Was fuer I/O-Ports sind fuer was genau gut? wie komme ich an die Vendor-ID eines Speziellen PCI-Geraetes heran? usw usf.

Wie ihr seht ist mein Wissen ueber diese beiden Themen mehr als lueckenhaft und ich wuerde mich ueber jede Informationsquelle oder Erklaerung freuen die mit diesen Themen zu tun hat.

Danke schonmal im vorraus!
lg, presswurst
Seiten: [1]

Einloggen