Bonjour les agrumes,
Ce weekend je me suis laissé tenter par le tutoriel de IKnow pour concevoir son OS from scratch. C’est plus dans l’idée de m’amuser et comprendre le fonctionnement d’un OS (son amorçage) qu’en concevoir un.
Le souci d’une telle démarche c’est qu’on repart de zéro, on doit construire nous même les bibliothèques standards. En l’occurence, j’aimerai pouvoir déclarer une chaîne de caractères avec une taille fixe et dynamique (on parle ici d’un monde parallèle sans la fonction malloc()
… OMG!).
Voici une fonction que j’ai codé pour afficher textuellement le code d’un char :
string ordChr(char ch) {
string buffStr = "\x00\x00\x00\x00";
string alpha = "0123456789";
uint16 iBuffStr = lenChr(ch)-1;
while(ch > 0 && iBuffStr >= 0 && iBuffStr < 4) {
buffStr[iBuffStr] = alpha[ch % 10];
ch = (ch - (ch % 10)) / 10;
--iBuffStr;
}
return buffStr;
}
Si je déclare ma variable telle que string buffStr;
ou même string buffStr[4];
, ça provoque un buffer overflow. Puis l’idéal ce serait de pouvoir avoir dans certain cas une variable de taille dynamique, notamment j’ai une fonction readStr
qui attend X caractères de la part de l’utilisateur. Comment faire ?
Peut-être en passant par l’assembleur, via cette fonction :
#include "system.h"
uint8 inPortB(uint16 _port) {
unsigned char rv;
__asm__ __volatile__ ("inb %w1,%0" : "=a" (rv) : "dN" (_port));
return rv;
}
void outPortB(uint16 _port, uint8 _data) {
__asm__ __volatile__ ("outb %%al,$0x80" : : "dN" (_port), "a" (_data));
}
Comment dire ? Je suis une bille en ASM bidouiller et trouver de la docs sur le sujet ça va.
Une petite idée ? Merciii et bon weekend.
Edit : le sujet avait sauté à cause des caches de ré-édition … bizaremment ça n’arrive pas tout le temps.
Edit2 : pour voir les sources de mon GloomOS.