URL: https://linuxfr.org/forums/linux-noyau/posts/creer-mini-os-unix Title: Créer mini-os unix Authors: Rémi Date: 2013年01月02日T09:12:33+01:00 License: CC By-SA Tags: système_d'exploitation Score: 0 Bonjour, je suis en train de créer un kernel grâce à un tuto que voici [Texte du lien](http://a.michelizza.free.fr/pmwiki.php?n=TutoOS.TutoOS) mais quand j'utilise le make fournis dans l’archive le terminal m'affiche `__stack_chk_fail' alors j'ai ajouté l'option -fno-stack-protector dans le makefile puis un make clean et oh miracle ça marche... sauf quand j'ai voulu utiliser le kernel le terminal m'a affiché Erreur segmentation Fault. J'ai utiliser gdb et il m'affiche ```sh Program received signal SIGSEGV, Segmentation fault. 0x00103d99 in hide_cursor () at screen.c:99 99 *(video + 1) = 0x0; ``` mais je soupçonne printk.c. voici le code : ```c //screen.c #include "io.h" #include "types.h" #define __SCREEN__ #include "screen.h" void scrollup(unsigned int n) { unsigned char *video, *tmp; for (video = (unsigned char *) RAMSCREEN; video < (unsigned char *) SCREENLIM; video += 2) { tmp = (unsigned char *) (video + n * 160); if (tmp < (unsigned char *) SCREENLIM) { *video = *tmp; *(video + 1) = *(tmp + 1); } else { *video = 0; *(video + 1) = 0x07; } } kY -= n; if (kY < 0) kY = 0; } void putcar(uchar c) { unsigned char *video; hide_cursor(); video = (unsigned char *) (RAMSCREEN + 2 * kX + 160 * kY); if (c == 10) { /* CR-NL */ kX = 0; kY++; } else if (c == 8) { /* BS */ if (kX) { *(video + 1) = 0x0; kX--; } } else if (c == 9) { /* TAB */ kX = kX + 8 - (kX % 8); } else if (c == 13) { /* CR */ kX = 0; } else { /* autres caracteres */ *video = c; *(video + 1) = kattr; kX++; if (kX> 79) { kX = 0; kY++; } } if (kY> 24) scrollup(kY - 24); show_cursor(); } void move_hw_cursor(u8 x, u8 y) { u16 c_pos; c_pos = y * 80 + x; outb(0x3d4, 0x0f); outb(0x3d5, (u8) c_pos); outb(0x3d4, 0x0e); outb(0x3d5, (u8) (c_pos>> 8)); } void hide_hw_cursor(void) { move_hw_cursor(-1, -1); } void show_cursor() { unsigned char *video; cursorX = kX; cursorY = kY; video = (unsigned char *) (RAMSCREEN + 2 * cursorX + 160 * cursorY); *video = cursorC; *(video + 1) = cursorA; } void hide_cursor(void) { unsigned char *video; video = (unsigned char *) (RAMSCREEN + 2 * cursorX + 160 * cursorY); *(video + 1) = 0x0; } //printk.c #include #include "screen.h" #include "lib.h" void printk(char *s, ...) { va_list ap; char buf[16]; int i, j, size, buflen, neg; unsigned char c; int ival; unsigned int uival; va_start(ap, s); while ((c = *s++)) { size = 0; neg = 0; if (c == 0) break; else if (c == '%') { c = *s++; if (c>= '0' && c <= '9') { size = c - '0'; c = *s++; } if (c == 'd') { ival = va_arg(ap, int); if (ival < 0) { uival = 0 - ival; neg++; } else uival = ival; itoa(buf, uival, 10); buflen = strlen(buf); if (buflen < size) for (i = size, j = buflen; i>= 0; i--, j--) buf[i] = (j>= 0) ? buf[j] : '0'; if (neg) printk("-%s", buf); else printk(buf); } else if (c == 'u') { uival = va_arg(ap, int); itoa(buf, uival, 10); buflen = strlen(buf); if (buflen < size) for (i = size, j = buflen; i>= 0; i--, j--) buf[i] = (j>= 0) ? buf[j] : '0'; printk(buf); } else if (c == 'x' || c == 'X') { uival = va_arg(ap, int); itoa(buf, uival, 16); buflen = strlen(buf); if (buflen < size) for (i = size, j = buflen; i>= 0; i--, j--) buf[i] = (j>= 0) ? buf[j] : '0'; printk("0x%s", buf); } else if (c == 'p') { uival = va_arg(ap, int); itoa(buf, uival, 16); size = 8; buflen = strlen(buf); if (buflen < size) for (i = size, j = buflen; i>= 0; i--, j--) buf[i] = (j>= 0) ? buf[j] : '0'; printk("0x%s", buf); } else if (c == 's') { printk((char *) va_arg(ap, int)); } } else putcar(c); } return; } ``` si vous pouvez m'aider ça serai sympa. merci et bonne journée

AltStyle によって変換されたページ (->オリジナル) /