Het besturingssysteem genaamd BirdOS

TS
TS
maarten70

maarten70

Gevestigd lid
Ahhh... Het was me niet opgevallen dat we al op post 140 zaten. Naja bij deze: YAY! we hebben de 140 gehaald. :)
-------------------------------------------UPDATE------------------------------------------------------------

Ik heb me totaal niet gehouden aan de belofte dat er de 23e een update kwam, sorry daarvoor... Anyway, een update! Eindelijk, na 60 jaar wachten.

Introducing:
KMM --> Kernel Memory Manager
SATA apparaten kunnen worden gedetecteerd! (kunnen nog niet worden gelezen of geschreven)
Error 58 --> Unable to find specified PCI device (niet in staat het gespecificeerde PCI apparaat te vinden)

Bug fixes en optimalisaties:
Keyboard handler [optimalisatie]
v0.4.13.0 deed er ~2,088 seconden over om op te starten, huidige versies niet meer [bug fix]
Het verkeerde adres werd gelezen voor info over SATA apparaten, nu niet meer [bug fix]
Een data set voor het geven van commando's aan SATA apparaten was incompleet, nu niet meer [bug fix]

Huidige known issues:
KMM is in sommige gevallen niet in staat een vrije plek te vinden, terwijl deze er wel is, en geeft een error
De functie die SATA apparaten probeert te lezen en faalt, de error die gegeven wordt door het systeem bestaat niet in de functie (komt dus van 'buitenaf', zo lijkt het)
De functie die de fabrikant van de CPU zou moeten ontdekken is niet in staat deze te verkrijgen

KMM
De KMM is een nieuwe soort memory manager, deze regelt enkele memory management taken voor de kernel. Deze is in sommige gevallen succesvol, maar in andere niet en geeft in zo'n geval error 57 ("Failed allocating memory"). Deze memory manager is een extra manager die erbij komt die de kritieke data voor het systeem een plek in de RAM geeft, de oudere memory manager (nu genaamd de GMM, of Global Memory Manager) neemt enkele andere taken op zich en regelt de minder belangrijke data.

SATA apparaten gedetecteerd
Sinds versie 0.4.13.1 is het systeem in staat SATA apparaten te detecteren. Hieronder vallen onder andere HDDs/SSDs en CD-ROMs. Op de afbeelding zie je dat SATA en SATAPI apparaten gedetecteerd zijn, dit zijn respectievelijk HDDs en CD-ROMs. De afbeelding is een afbeelding van versie 0.4.13.2, maar deze versie doet hetzelfde.



Op deze afbeelding zie je ook gelijk de CPU fabrikant bug, in plaats van de fabrikant wordt S gegeven (dit is in de meeste gevallen NULL, oftewel niks). In nieuwere versies van Vireo (het systeem) wordt er maar een deel van de naam van de fabrikant weergegeven.

Error 58
Deze error ontstaat wanneer het systeem de opdracht geeft om een apparaat te zoeken, maar dit apparaat niet gevonden kan worden. Deze error heb ik te vaak gezien toen we dat probleem hadden met dat we PCI niet aan de praat konden krijgen, maar hij heeft wel geholpen (en helpt af en toe nog steeds).

Optimalisatie keyboard handler
Wanneer er op een toets gedrukt wordt op het toetsenbord gaat het systeem die afhandelen, de oude functie had 80+ regels aan code nodig om dit voor elkaar te krijgen. Het werkte ongeveer zo: ga elk karakter af, tot je weet welke het was en geef die door aan de juiste functie en doe er wat mee. Dit is heel inefficiënt omdat je eerst 26 letters, 10 cijfers en ongeveer 8 andere toetsen (dit waren de ondersteunde toetsen) moet vergelijken met de door jou ingedrukte toets. Dit deed ik eigenlijk door veel ja-nee vragen te stellen. Dus voor elke toets die je indrukte werden er in het ergste geval 44 ja-nee vragen gesteld om erachter te komen welke toets je had ingedrukt voor er ook maar iets mee gedaan werd. De nieuwe versie doet dat niet meer. Deze versie zet de code van de toets in een variabele, zo kan elke functie ermee doen wat ze willen en slaan we dus de stap met 44 ja-nee vragen over. De huidige versie ondersteund typen op het scherm niet meer, maar ondersteund bijvoorbeeld wel het wachten tot een toets is ingedrukt. Dit deed de vorige versie ook, maar dan met de 44 ja-nee vragen. Vergelijkend met hoeveel regels dit kost qua het schrijven van code, met behulp van een voorbeeld... Waar de oude versie 80+ regels nodig had voor het wachten tot je op enter hebt gedrukt, doet deze versie dat in 5 regels. Dat is stukke minder. :)

Wat?! 2,088 seconden!
In normale omstandigheden halen alle versies de 0,5 seconden (500ms) niet eens, maar bij deze versie (0.4.13.0) was dat anders. Met vijf keer testen kwam deze versie gemiddeld uit op 2,088 seconden. De kortste tijd met opstarten was 2,057 seconden, de langste was 3,021 seconden. De versie erop was alles weer normaal, wat best raar is. Het is waarschijnlijk verkeerd gegaan bij het omzetten van de menselijke leesbare code in computertaal, dit is vaker het geval geweest.

Bug verkeerde adres SATA info & incomplete data set
Deze waren best simpel, bij het verkeerde adres lezen had ik het verkeerde getal gegeven. Het systeem moet op decimaal adres 36 lezen maar ik gaf het systeem de waarde 9, wat dus het verkeerde adres was dat werd gebruikt. De incomplete data set kwam doordat ik een naam was vergeten in te tikken ergens, dit maakte het voor mij lastig om dingen te doen, maar het klopt weer.
 
TS
TS
maarten70

maarten70

Gevestigd lid
Niet zo heel erg veel gedaan deze maand.

Ik kan wel vertellen dat ik besloten heb om SATA (AHCI) voorlopig naast me neer te leggen aangezien dat een absolute hel is (veel read errors en je komt er niet echt uit). Ik ben begonnen aan ATA, ofwel IDE, hiervan kan ik vandaag detecteren of het een CD-ROM of een HDD/SSD is. Hoewel AHCI niet ondersteund wordt zoekt de kernel nog wel naar de informatie daarvan en zet dat ook op het scherm.

Screenshot van versie v0.4.14.0:



master type = 1 houdt in dat de master een hardeschijf is.
slave type = 3 houdt in dat de slave een CD-ROM is.

Nieuw in deze versie:
- ATA apparaten worden gedetecteerd (alleen de PRIMARY bus)
- Trace functie, deze zet tekst op het scherm en kan gelijk ook een getal naar keuze erin zetten (hieronder meer)
- Errors en berichten van het zoeken naar een PCI apparaat kunnen genegeerd worden naar keuze (hieronder meer)

Trace, eerst moest ik een zin op het scherm zetten en dan pas kon ik een getal neer zetten dit kost veel ruimte en nu kan het anders. Zie de voorbeelden.
C:
//Oude versie
//print is de functie om zinnen neer te zetten en hexstr zet variabelen om in tekst

print("Dit is een getal:");
print(hexstr(10)); //zet 10 om, zodat de computer weet dat het tekst is
print("\n"); //nieuwe regel
C:
//Nieuwe versie
//Zoals je ziet zijn dit twee regels minder om te schrijven

trace("dit is een getal: %i", 10); //%i is gewoon de plek waar '10' neergezet moet worden
PCI zoeken, het kan natuurlijk zo zijn dat een bepaald apparaat niet aanwezig is waarvan je nou eenmaal moet weten of die er is ja of nee. Bijvoorbeeld een ethernet kaart, als je hem niet hebt dan is er geen probleem maar het systeem moet wel weten of 'ie er is. Voorheen als het dan niet gevonden kon worden zag je een error verschijnen met dat hij dat niet kon vinden, nu kan die genegeerd worden zodat je geen error ziet (om bijvoorbeeld paniek te voorkomen :)).

Verbeteringen in deze versie:
- Kmemset werkt nu wel, ik dacht veel te moeilijk na
- Het scherm wordt nu voordat er iets op het scherm gezet wordt eerst leeggemaakt (meer hieronder)

Scherm leeggemaakt, niet alle machines maken het scherm leeg als ze klaar zijn met hun tekst laten zien, zo kan dus tekst van het systeem en van de computer voor het opstarten door elkaar gehusseld worden. Dit wordt al gauw onleesbaar.

Dat was het wel zo'n beetje. ATA blijkt WEL makkelijk te zijn, ik hoop het maar, en als dat zo is zie je (hopelijk volgende maand) een update verschijnen ermee en dan kan ik je vertellen dat we van versie 0.4.x.x (waar we nu bijna een heel jaar op zitten) gelijk doorgaan naar versie 0.5.x.x. Wanneer we het halen is dat een hele grote mijlpaal.
 
TS
TS
maarten70

maarten70

Gevestigd lid
Deze maand is er een milestone gehaald! Het lijkt misschien niet veel, maar het betekent wel veel.

Nieuw:
- Er is een functie die tekst kan omzetten van uppercase naar lowercase en andersom TransformUpLowUC
- ATA hardeschijven kunnen gelezen en geschreven worden

TransformUpLowUC, vraagt om een stuk tekst en gooit het dan om van lowercase naar uppercase of andersom. Dit kan in de toekomst handig zijn voor bijvoorbeeld CAPSLOCK. Dit is gedaan met behulp van de ASCII table, een lijst met 'alle' karakters die er zijn (industrie-standaard). De ASCII table wordt standaard door de computer gebruikt. In deze lijst heeft het lowercase karakter altijd een waarde van 32 hoger dan de uppercase. Alle karakters hebben namelijk een waarde. De kleine 'a' zou dus de waarde van A + 32 hebben. A heeft een waarde 65 en de a heeft een waarde van 97; 65 + 32 = 97. Dit maakt het dus heel makkelijk om te doen. Dit geldt alleen niet voor cijfers en leestekens, alleen de letters.

ATA hardeschijven (niet te verwarren met SATA):
ATA staat ook wel bekend als IDE, echter is er een verschil. IDE (Integrated Drive Electronics), ook wel Parallel ATA, is de hardware specificatie, de electronica ervan. ATA is de standaard specificatie (dus eigenlijk de software specificatie). Het is dus hetzelfde, maar officieel heet het ATA en niet IDE.

Om dit te testen heb ik een virtuele hardeschijf gebruikt. Voor zij die niet weten wat dat is: Dat is eigenlijk gewoon een bestand (net zoals een tekst bestand) die zich voor doet als hardeschijf. Hierop of -in (hoe je het ook wilt noemen :)) staat dan de data van de bestanden die erop staan. Het werkt praktisch gezien hetzelfde als een echte hardeschijf.

Dankzij het feit dat het een bestand is kan je deze openen met een hex-editor, dit is een programma dat binaire bestanden omzet in hexidecimale getallen en voor een programmeur is dit heel erg handig. Hiervan kan je afbeeldingen vinden in de bijlagen.

Er zijn verschillende manieren om de data van een ATA hardeschijf te lezen en te schrijven: PIO en DMA. Wat ze betekenen is niet heel erg belangrijk, het enige dat wel handig is om te weten is dat PIO hartstikke langzaam is en DMA kei snel. Momenteel gebruikt BirdOS PIO, ik ben bezig met DMA aan de gang te krijgen maar geen idee hoe lang dat duurt. PIO is voor nu prima, het is snel genoeg, maar over een poosje waarschijnlijk niet meer aangezien BirdOS dan moet gaan multitasken. En dan is de snellere manier beter.

Dan nu... De afbeeldingen. De waardes van BirdOS moet je omdraaien (3CEB wordt EB3C), dit hoort zo te zijn. De laatste waarde ('buf: 000000000' helemaal onderaan) is de allerlaatste waarde van de hardeschijf. De rede dat je ineens de laatste waarde daar hebt staan is omdat BirdOS niet weet hoe het moet scrollen dus schrijft het op een gegeven moment alsmaar op dezelfde plek op het scherm als het bij het einde van het scherm komt.



Voor wat er op de hardeschijf staat, zie bijlage (read.png).
Dit is dan vervolgens ook weer geschreven naar de hardeschijf (by_birdos.png). Het shcrijft dat wat het gelezen heeft 2x512 bytes (1024 bytes) verder.


Problemen (bugs en dingen die niet werken):
- CD-ROMS a.k.a. de ATAPI schijf, werkt niet terwijl dat wel zou moeten. De rede waarom is duidelijk, alleen niet hoe het opgelost moet worden.

Wat nu?
Nu is het vooral drivers maken voor bestandssystemen zoals FAT32 en DMA. Samen met iemand anders ben ik bezig met een ander bestandssysteem te ontwerpen, deze zal ooit ook een keer ondersteund worden. Na de bestandssystemen ga ik een eigen bootloader maken zodat we ook vanaf de hardeschijf op kunnen starten en we niet afhankelijk zijn van GRUB. Daarna kunnen we dan aan de slag met VBE: 'VESA BIOS Extension'. VESA is een bedrijf dat de standaarden binnen de grafische kaarten en monitoren industrie bepaalt. Wanneer dat er is kunnen we hogere resoluties dan 80x25 ondersteunen (waaronder als het goed is 1920x1080).

Welke bestandssystemen, naast FAT32 en de andere, is het niet duidelijk welke ondersteund gaan worden.

Vragen zijn welkom, zoals altijd. :)
 

Bijlagen

TS
TS
maarten70

maarten70

Gevestigd lid
ATAPI werkt! Het opent best wel veel nieuwe deuren.



Voor technisch: Ik wachtte op een interrupt maar ik hoefde daar blijkbaar niet op te wachten.
 

Nieuwste berichten

Bovenaan Onderaan