Télécharger le zip
OK c'est prometteur, upgrade régulièrement le zip de la source et tiens nous informé de l'avancement.Bonne continuation.
Très interressant et très clair.J'ai hate de voir le résultat final.A bientot :)
En effet !!!J'ai appris qu'un disquette avait 2 faces composées de 80 Disques concentriques composés de 18 Secteurs composés de 512 octets chacunD'où la taille de la disquette 2*80*18*512 = 1474560 OctectsN'hésite pas à mettre des commentaires car lors d'une mise à jours, on est pas averti par emailJ'attend le reste avec impatience :)Mais va pas trop vite, faut que ça reste compréhensible ;)
Ca tombe bien, moi qui projettait de m'amuser à coder un kernel...Merci ;-)
Une question cependant, je le lis avec quoi ce fichier mht ?D'accord pour ie, mais quand on ne l'a pas ?L'ouvrir avec firefox ? apparemment impossible ou si quelqu'un peut m'expliquer, et avec Konqueror ? faut pas rever...Donc est ce que ce serait possible d'avoir un format plus "lisible" :)Bon ok, sur le titre, c'est marqué "pour windows", mais n'empeche :)
"vaintaine de chapitre pour aprendre a"AÏE MES YEUX !!! DE L'EAU !!!Heuresement, il y a beaucoup moins de fautes dans tes fichier mht. D'ailleurs d'où t'es venue l'idée de faire un tutorial dans ce format? C'est la première fois que je le vois...Sur ce travaille bien, et essaye de ne pas faire trop de fautes d'orthographe ou d'étourderies, car cela ne fait pas trop sérieux.
Très intéressant, merci de prendre le temps.Je regarde ça avec patience dès que j'ai le temps.eRoZion
SalutJ'attends aussi la suite
Dès le premier chapître, j'ai appris quelque chose.Merci ;)
je trove sa super cool , ta souces bonne continuation
le format mht, c'est le format de microsoft word pour les pages htlm quand on met des photos, moi j'arive a le lire avec firefox ,c'est un peu comme du pdf, sauf que c'est du mhtOk, je vois que ce format ne met pas tt le monde d'accord, je vais essayer de faire ceci en .pdf@+, vinc1008881...
Ah non pitié, pas de pdf, c'est trop la daube à consulter.Fais don du html normal, Word les génère aussi et tout le monde peut les consulter confortablement.
Il existe un super soft pour faire du pdf :oPdf CreatorIl s'installe dans les imprimantes, et sous word tu fais un enregistré, tu choisis l'imprimante Adobe et voilà tu as un beau pdf, certes avec une pub en bas mais bon ;)Moi j'trouve quand même que c'est bien le mht, que j'arrive également à lire avec Firefox ;)
Question bete : un OS sous Windows, c'est une machine virtuelle, non ?Pour info, Doc2Pdf : www.vbfrance.com/code.aspx?ID=29662
Ce n'est pas l'OS sous Windows mais le créer, écrire son code et le compiler.Pdf est définitivement de la m***de, va bon juste pour imprimer sur papier. Si on fait un copier coller, il a inséré des retours charriots nimporte où, à bannir pour éditer du code.
Je suis d'accord le pdf c de la m***de, en plus avec mon pc ça rame à mort...
Ok, et pour tester rapidement l'OS, la il faut une machine virtuelle, non ?Pour Pdf, evitez à tout prix la version 6, elle rame trop. Les Pdf, c'est pratique justement pour éviter les modifications intempestives des autres ; si c'est pour modifier, mieux vaut choisir un autre format, puisque l'éditeur Pdf est payant.
Trés interessent!J'attend la suite avec impatience, mon Compaq Presario 7106 va adorer.Bonne continuation.PS: Si tu pouvais ajouter en fin de route, toutes les images en cas-ou ces images ne soit plus disponible sur le net.
A non desoler, je suis depasser par ce format!
Info: Foxit PDF Reader c'est rapide et gratuit.Par contre je suis également contre l'idée de mettre ce tutorial en pdf. html devrait largement faire l'affaire.
les images sont contenues à l'interieur du fichier mht, pas de problème donc, à l'avenir j'essairai de faire du htlm classique.Si vous trouver que mon tuto est pas clair, mal organisé ...fait le moi savoir et je ferai des modifications !
Un grand merci pour ce tuto,moi qui voulait comprendre le KERNEL de linux mais en vain,je vois en ton tuto une opportunité pour démarrer.je trouve deja ces débuts bien expliqué et bref aussi et je trouve que c'est bien,comme ça les gens ne vont pas s'ennuyer en lisant de tonnes de pages,bref mais efficace,continue comme ça ey merci d'avance.GOS is caming.
Tout simplement génial !Vivement la suite !@++
Pas mal ton tuto $Pas très avancé , mais très bien pour les débutants.Ok ! J'attends la suite. :)Ciao !
J'attends aussi la suite avec impatience!Vraiment nickel pour les débutants (comme moi!)
voila le chapitre 3, certain diront que ma méthode c'est du bricolage, moi je trouve + simple comme sa. Vous verrez le code est provisoire...si jamais vous comprenez pas un truk (si c'est mal expliquer..., fait le moi savoir merci)
vinc1008881 >> Excellent travail! Il faut juste corriger quelques rares fautes d'orthographe qui gênent la lecture un petit peu. Tout cela me rappelle l'époque où on faisait des trucs comme ça. Que de la joie!Patrice99 >> Pour tester l'OS il faut démarrer l'ordinateur à partir d'une disquette contenant cet OS. Ca viendra surement dans les prochains chapitres. Windows et sa machine virtuelle DOS ne devront pas être chargés.
vinc1008881 >> Je pense qu'il vaut mieux éviter les mots comme "malheureusement" et "cette partie est très compliquée". En fait dans un tutoriel tout doit être gai en encourageant. Moi je dirais plutôt "heureusement qu'il y'a l'assembleur pour arriver à notre fin." et "cette partie n'est pas très compliquée". Pour ceux qui n'ont pas d'expérience en assembleur, il est utile de leur fournir un lien qui donne des notions de bases. Idem pour les interruptions BIOS. Je trouve que tu expliques bien et avec de bons exemples.
ok, je prendrai tes remarques en compte. Pour ceux qui ont des difficulté en assembleur, ds le chapitre 2, j'ai mit un lien vers un tutoriel...Je vais pensez à écrire une annexe à propos des interruption en gereral (BIOS, DOS>>n'existe plus) en mode réel.Merci de tes remarques, @+
Ya un petit probleme de syntaxe qui vient peut etre du format mht :;Un secteur de boot plus complet[BITS 16]jmp startdb “GAMEOS01”A propos des " "
arf, je v coriger sa en mm temps que les modif que ma demander RACPP
ça me semble très bien ça, bonne prog @ tousmagicalementNono
à la vu des noubreux commentaire, je vais lire. J'apprendrai forcement quelque chose ;)
c'est très bien, jte mets 10/10 ce qui je l'espere t'encourage a continuer a mettre a jour ton tuto !!bravo!!!!!
ça a l'air super, vivement la suite :)on dit pas "cette partie est très compliquée..." mais plutôt "cette partie est plus compliquée que les précédentes" (sinon ça donne la grosse tête à ceux qui arrivent à comprendre facilement)
c'est bizarre il y a écrit que le zip contient "Annexe B.mht" mais il n'est pas dans celui-ci quand on le dl
c'est super interressant!! vivement la suite!
Super génial. J'attends avec impatience moi aussi la suite. Encore Bravo. Juste une chose (Annexe B.mht n'est pas présent dans le zip)Bonne continuation.
si ca peut interresser du monde, voila un site fait par mon hebergeurhttp://boost.freezee.org/ (os sur x86)
il est déja bien avancé ton OS ! Mzis ce qui est regrettable c'est le manque de documentation, c'est pourquoi je fais ce tuto !Dans quelques heure le chap 4 sera dispo...
La chapitre 4 contient des bug attention je le remettrai a jour !!
Tres tres tres interessant, merci bcp pour cette perle :)
Pas mal pour les 3 premiers chapitres...J'espere que tu sera aussi clair pour les autres, car la gestion de la memoire et des processus dans un kernel est qqch d'assez dur comparé à ce que tu nous as deja servis.Dans tous les cas BRAVO :-) et bonne continuation.
pour corriger le bug soit même et que le kernel du chapitre 4 fonctionne il suffit de remplacer la ligne :mov byte [0xB8001], 01par :mov byte [0xB8001],0x57c vraiment génial ce tutorial merci et continu on attend la suite
???, pourquoi 0x57 ??le bug du chapitre 4 est corriger javais fait 2 erreur : oublie du cli+2 fois mov cr0, eax o lieu de 1 seule fois...le 0x57 corespont à l'attribut couleur cela n'as rien à voir dsl avec 01 --> on voit un K en bleu sur font noir avec 0x57-> on voit un K gris sur font rose
dsl pour le poste du dessu mais je voulais simplement dire qu'il fallait ajouter 0x devant 01 de la ligne en question et apres sa marche nikelle valeur 57 change simplement la couleur de la lettre affichéencore dsl
Salut,Ce tuto est super mais j'ai un petit soucisNASM n'arrive pas à me compiler la ligne du kernel suivante :mov byte[0xB8000],‘K’ ,je ne comprend pas pourquoi et contrairement au commentaire indiqué sur cette ligne j'aimerais bien comprendre ;)Donc si tu a une idée je suis preneurMerci et continu c'est super, je l'attendais depuis longtemps ce tuto.Dan34
DAN34, c'est au sujet des guillements qui passe mal.
ok merci
pour que nasm le compil ajoute simplement sur la ligne mov byte [0xB8001], 01un x entre le 0 et le 1 et l'assemblage se fait tres bien
voilà, encore des petite erreur de frappe corigé (le ' ' et le 01)-------> mis a jource n'est rien pour le 0x57demain je poste l'annexe qui montre la compilation d'un kernel ecrit en C...+ un chapitre sur le driver console
heu maintenant ça compille bien mais quand je le teste (j'eteind et ralume le PC) ça reset en boucle :-(J'ai pu noté que dans le boot il y avait 2 CLI et un seul STI donc je suppose que la gestion des interruptions n'est pas réactivée en sortant du boot.Est-ce normal ??
ne tinkiete pas dan34, dem1 je poste un chapitre qui va t'epliquer le sens de cette ligne mov byte[0xB8000],'K'...
oui, c'est normal : il faut laisser le cli, en effet les interruption sont dereglée à cause du passage en Pmode, il faut donc les iniber jusqu'à nouvelle ordre : pas de sti.
m'inqiète pas mais je voudrais bien que ça marche quand c'est simple parce que quand ce sera plus compliqué oulala
si tu as rajouté un sti, c'est normal que ça reboot, sinon je comprend pas : je viens de telecharger la source et je lé tester sous BOCHS et sous machine réelle cela marche...assure toi d'avoir télécharger la dervière ersion du chapitre 4 (yas 2 jours il y avais des bug...
le "mov byte[0xB8000],'K'" ça écrit 'K' dans la mémoire vidéo, je me trompe ?ce qui est aussi possible c'est que tu aies changé le nom du kernel pour je ne sais quelle raison et que tu as supprimé l'ancien (buggé) alors il faut formater la disquette sinon ça exécutera encore l'ancien même s'il est en théorie supprimé
Tout simplement génial, :)10/10 tout ça non ?Nico
le fichier est trop gros mais voulus, j'ai donc du virer qques parties.., le tutoriel sera present en integralité procainement sur mon site...
Mon pb est résolu Le copié/merdé a encore frappé j'avais oublié la boucle infini à la fin du kernel.Donc normal que ça reboote en permanence.Merci à tous ceux qui se sont penchés sur mon pb.
oui en effet, sans boucle infinie, le processeur execute nimporte quoi, des octets totalement aléeatoires ce qui finit par le faire planter...mon site est là : http://membres.lycos.fr/vinc1008881/index.htm
Heu... je reste bluffé. Faux deja avoir des connaissances poussées au niveau ASM et H/W pour faire cela alors moi je dit chapeau vinc1008881. Je vais suivre tout cela de près car c'est non seulement instructif mais aussi utile. Et en plus tu n'as que 18ans... je suis bluffé
merci bcp ça fais plaisir !Voilà, j'ai fait un ptit site où il y a toutes les pages htm de mon tutorial (j'ai virer le mht). Dans la rubrique download, il y a les outils que j'utilise. je suis obliger de créer ce site car mon zip finir par devenir trop gros à la longueen cas de pépin (problème de compilation, qqchose pas cler) => un petit message
une question : le pong va être programmé en modifiant les couleurs d'arrière plan des espèces de gros pixels (où on écrit les caractères) ?
tetris pardon
on sa faire sa en mode graphique tu verras...c ce sera a la fin les jeux
quelqu'un m'as demander : comment je peut connaitre la capacité de la mèmoire quand je passe en mode P. On mode P, on a fais des segment d'une taille de 128 Mo, mais j'orais bien pu mettre 4 Go à la place, de toute facon pour le moment je ne connais pas la capacité mémoire. Je qui m'interrese dans le mode protégé, c'est que les instructions sont 32 bits, donc je vais pouvoir executer un kernel en C. Par contre comme je ne connais pas la taille de la RAM, pour l'instant tout mes programme sont situé dans le premier Mo de mémoire.J'espere que cela repond a ta question...voilà, @+, vinc1008881
Moi aussi je projetai de créer un 'mini os' et je suis tombé sur ta source, tout à fait géniale!Bonne continuation pour la suite
A quand la suite?
comme il n'y a plus de place dans le zip de cppfrance, je poste le chapitre 5 sur mon sitehttp://membres.lycos.fr/vinc1008881/index.htm
J'espere que tu mettras comment reactiver les interruptions genre 13h (lecture/écriture).Sinon pour le moment joli travail !!!
J'espere que tu mettras comment reactiver les interruptions genre 13h (lecture/écriture)>> impossible : je suis d'accord peut peut réactiver tt les interruptions, mais il faur créer nous meme nos propres drivers ...
euh tu saurais pas s'il est possible de linker le kernel avec visual studio, parce que je sais pas pourquoi mais si je mets une ligne de commande trop longue il me dit "impossible d'exécuter la commande" (crois moi j'ai testé des dizaines de fois)(ou alors tu m'expliques pourquoi ça dit impossible d'exécuter la commande)le problème est que j'ai voulu créer des fonctions (affichage à l'écran, modification de la palette et tout ça, j'ai pris un peu d'avance en regardant sur d'autres sites) dans d'autres fichiers .c et comme ça m'en fait plusieurs, l'instruction pour linker devient assez longue
c' est vraiment super ! merci beacoup, je vais suivre ce tuto avec beaucoup d' interet 10/10
si je me souvient bien, la ligne de commande DOS ne doit pas dépasser 255 caractères...ou un truc dans le genre...il faut compiler tout tes fichier .c en meme tempspour cela tu fé un fichier main.c qui contient#include "file.c"#include".....c/h"tu compile main.ctu aura un seul fichier objet dans ce cas là. Donc se sera plus facil à linker...
oui ça résoud le problème (enfin je pense, j'ai pas testé) mais le but de créer plusieurs fichiers .c est justement de pouvoir les compiler séparémentsinon si j'en ai que 3 (le kernel, la petite partie en asm et un autre) ça fonctionne sauf que si j'appelle une fonction de l'autre fichier .obj à partir du kernel, ça reset (je ne sais pas exactement pourquoi, bochs ne le précise même pas)
tu veut charger tes fichiers dynamiquement, c'est sa ?.obj >>C'est pas 16 bits sa ?, si tu execute ça apres que tu passe en Pmode, pas étonnant que sa foire...une triple faute et hop reset...sinon passe moi la partie qui foire, je vais essayer d'analyser sa...
non c'est pas 16 bits, on peut pas faire de 16 bits avec visual studio je pensesi je mets la fonction que j'appelle dans le même fichier .c (donc le même .obj au final) ça fonctionnesi je la mets dans un autre .obj (et que je rajoute le nom de cet .obj dans la ligne de commande pour linker), le linkage se passe bien sauf que ça resetcomment tu veux que je te le passe ?
fais des break point et regarde ou sa foire...sinon je ve bien jeter un coup d'oeil sur le code qui semblerai ne pas marchersa peut venir de minporte ou...montre moi aussi comment tu compile tu link et tu charge
ben si j'enlève l'appel à la fonction tout marche (sauf qu'il y a rien à l'écran puisque c'est la fonction qui s'en occupe)kernel.cpp (je programme en C++, mais j'ai essayé en C, c'est pareil) :#include "include/video.h"extern "C" void kernel_start() { int i = 0, j = 0; while (i < 320) { while (j < 200) { setPixelColor(i, j, 255 * i / 320); ++j; } ++i; j = 0; } while(1);}video.h :void setPixelColor(unsigned int x, unsigned int y, unsigned char color);video.cpp :#include "include/video.h"void video::setPixelColor(unsigned int x, unsigned int y, unsigned char color) { unsigned char* video = (unsigned char*)0xA0000 + x + 320 * y; video[0] = color;}j'ai essayé inline, extern "C" devant, etc. et ça fonctionne que si le corps de la fonction est dans le même fichier .obj que là d'où on l'appellesi je mets "setPixelColor(i, j, 255 * i / 320);" en commentaire, ça marche (écran noir mais au moins ça reset pas)je compile avec visual studio (d'ailleurs on peut tout faire à partir de visual studio, même formater la disquette et assembler les .asm) et voilà le .bat de linkage :cd ..\ldld.exe -Ttext 0x20000 link.ld -o A:\kernel.bin --oformat binary ..\temp\start.o ..\temp\kernel.obj ..\temp\video.objlink.ld c'est le même que sur ton site
euh petite connerie :levoid video::setPixelColor(unsigned int x, unsigned int y, unsigned char color) {c'est void setPixelColor(unsigned int x, unsigned int y, unsigned char color) {j'avais fait un test avec les namespaces et j'ai oublié d'enlever complètement
voilà quelques "betises pas bien méchante que je vois au premier coup d'oeil"--> un while avec un variable++ à l'interrieur, pour moi c'est un for --> dans ta fonction setpixelcolor, pourquoi s'emmerder à créer une variable "video", ((unsigned char*)(0xA0000 + x + 320 * y)) = color;--> thériquement ta fonction setpixelcolor doit etre déclaré externe car elle appartient bien à un autre fichier *.obj (extern void Set...)--> int i = 0, j = 0;while (i < 320) {while (j < 200) {setPixelColor(i, j, 255 * i / 320);++j;}++i;j = 0;}>>cradshort i = 0;/*un short est suffisant*/static unsigned char j = 0;/*un char est suffisant*/for (;j<=200;j++){for (i=0;i<=320;i++)setPixelColor (i,j,0x50);/*==>0x50 = couleur*/}>>plus propre non ?
mais moins bon que si tu places la vérif du j en bas, le mettant à 0 en haut c'est inutile de le controler illico.do {} while(...);
j'avais un bug avec le for mais je sais plus quoi (en tout cas j'avais mis un for et après je l'ai remplacé par un while)sinon mon (255 * i / 320) fait un joli dégradé de couleurssinon le "((unsigned char*)(0xA0000 + x + 320 * y)) = color;"créé de toutes manières des variables de manière temporaire comme je le faispar contre mettre short et unsigned char pour moi c'est un bel exemple d'un bug qui se produira quand j'augmenterai la résolution de l'écran (ça fera peut être un petit warning à la compilation et c'est tout) parce que j'oublierai surementde modifier le type des variables (mais bon c'est vrai qu'un unsigned short suffit)sinon même avec extern ça ne fonctionne pas (j'avais déjà testé)au final mon problème n'est pas reglé
il commence à m'énerver ce programme x_xmaintenant ça ne fonctionne même plus avec la fonction dans le même fichier :void setPixelColor(unsigned int x, unsigned int y, unsigned char color) { *((unsigned char*)0xA0000 + x + 320 * y) = color;}extern "C" void kernel_start() { for (unsigned short i = 0; i < 320; ++i) for (unsigned short j = 0; j < 200; ++j) setPixelColor(i, j, 255 * i / 320); //*((unsigned char*)0xA0000 + i + 320 * j) = 255 * i / 320; while(1);}si j'enlève le commentaire dans la fonction kernel_start et que je commente à la place la ligne "setPixelColor(i, j, 255 * i / 320);" ça marche !si je laisse comme c'est écrit là écran noir (mais pas de reset)si je mets inline devant la fonction, reseten plus le débuggeur de bochs me met des instructions en boucle, toutes au segment 0xf000, à se demander si ce sont bien les trucs qui se passent réellement