Progetto semplice sistema operativo non parte o quasi.

Pubblicità

Barrux

Utente Attivo
Messaggi
66
Reazioni
1
Punteggio
28
Ciao a tutti ho seguito varie guide su internet per compilare un mini sistema operativo che praticamente invia un messaggio a video con la scritta ''SO''.
Ho composto le varie parti su Ubuntu, le parti sono:
LOADER.ASM
global loader
extern main
MODULE_ALIGN equ 1<<0
MEM_INFO equ 1<<1
FLAGS equ MODULE_ALIGN | MEM_INFO
MAGIC equ 0x1BADB002
CHECKSUM equ -(MAGIC + FLAGS)
section .text
align 4
MultiBootHeader:
dd MAGIC
dd FLAGS
dd CHECKSUM
STACKSIZE equ 0x4000
loader:
call main
cli
hang:
hlt
jmp hang
section .bss
align 4
stack:
resb STACKSIZE
KERNEL.C
void main(){
unsigned char* video = (unsigned char*) 0xB8000;
video[0] = 'O';
video[1] = 0x07;
video[2] = 'S';
video[3] = 0x07;
}
LINKER.LD
ENTRY (loader)
SECTIONS
{
. = 0x00100000;
.text ALIGN (0x1000) :
{
*(.text)
}
.rodata ALIGN (0x1000) :
{
*(.rodata*)
}
.data ALIGN (0x1000) :
{
*(.data)
}
.bss :
{
sbss = .;
*(COMMON)
*(.bss)
ebss = .;
}}
SINTASSI PER LA COMPILAZIONE USATI (DA TERMINALE):
LOADER: nasm -f elf -o loader.o loader.asm
KERNEL: gcc -o kernel.o -c Kernel.C -Wall -Wextra -nostdlib
LINKER: ld -T link.ld -o os.bin loader.o kernel.o

Ora mi sono stati creati 3 file (kernel.o/loader.o/os.bin) solo con un errore quando mi ha compilato il kernel, che mi dice "kernel.c:1: warning: return type of ‘main’ is not ‘int’
" però mi ha creato ugualmente il file. Ora io ho scaricato un pacchetto del GRUB nel quale c' erano dei file (stage1 e stage2) che servono per il prossimo passo (il link del pacchetto l' ho messo sotto per farvelo vedere meglio) e con il comando "dd if=/dev/zero of=pad bs=1 count=750" ho creato un il file "pad". Ora ho creato il file image.img con il comando "cat stage1 stage2 pad os.bin > image.img". Questo file l' ho montato con diversi emulatori. Mi parte il Grub ma non visualizza la scritta "OS" (allego la foto per far capire meglio) dove ho sbagliato ? I tentativi sono stati effettuati con Qemu con il comando da terminale "qemu -fda image.img",ma non sono riuscito a farlo partire mi sono fermato su una schermata uguale a quella che linko sotto. Cosa dovrei fare ? Grazie per l 'attenzione.

LINK FILE GRUB: GNU Project Archives [Settimo file dall' alto: grub-0.94-i386-pc.tar.gz]
LINK IMMAGINE GRUB: ImageShack® - Online Photo and Video Hosting
 
scrivere a mano il fiule è relativamente semplice, ti passo come modello il mio, così hai una base di partenza ..


# general configuration:
timeout 5
default 0
color light-blue/black light-cyan/blue

# boot sections follow
# each is implicitly numbered from 0 in the order of appearance below
#
# TIP: If you want a 1024x768 framebuffer, add "vga=773" to your kernel line.
#
#-*

# (0) Arch Linux
title Arch Linux
root (hd0,0)
kernel /vmlinuz-linux root=/dev/disk/by-uuid/1e716108-782e-46b8-872f-d936a345f57a ro
initrd /initramfs-linux.img

# (1) Arch Linux
title Arch Linux Fallback
root (hd0,0)
kernel /vmlinuz-linux root=/dev/disk/by-uuid/1e716108-782e-46b8-872f-d936a345f57a ro
initrd /initramfs-linux-fallback.img
 
alcune raccomandazioni :
grub inizia a contare da 0, per cui la prima partizione del primo disco la identifica come 0,0
io ho "/dev/disk/by-uuid/numero " , se vuoi puoi semplificardi usando /dev/sdXx
 
ok ho più o meno risolto il problema..per ora invio il comando ''qemu -kernel os.bin'' e mi parte una schermata diretta del ''sistema operativo'' senza grub. Per ora mi accontento, volevo iniziare ad arricchire il kernel, ricordo che per ora visualizza solo la scritta ''OS''. Sono riuscito a trovare il seguente codice che visualizza una stringa:
int main(void)
{
char *str="Ciao a tutti",*ch;
unsigned short *vidmem=(unsigned short*) 0xb8000;
unsigned i;
for (ch=str,i=0;*ch;ch++,i++)
vidmem=(unsigned char) *ch | 0x0700;
for(;; )
;}

Volevo aggiungere qualche libreria al progetto, come le librerie standard: stdio.h, stdlib.h, string.h, time.h e volevo aggiungere anche un input dal mouse con la libreria allegro.h. Perciò ho trovato anche un codice (che metto qui sotto) che visualizza un puntatore e se tenuto premuto crea un fascio blu. Questo lo compilo in Dev-C++ (sotto windows) e passo il file ''prova.o'' creato dopo la compilazione su ubuntu per unirlo al loader.o tramite il linker.ld, ma quando eseguo il solito comando ''ld -T linker.ld -o os.bin loader.o prova.o'' mi visualizza un errore: ''prova.o: file not recognized: File format not recognized'' come posso risolvere ? grazie.

CODICE PER VISUALIZZARE PUNTATORE:
#include <allegro.h>
BITMAP* buffer;
int cursor_x = 20;
int cursor_y = 20;
void getMouseInfo(){
if(mouse_b & 1){
cursor_x = mouse_x;
cursor_y = mouse_y;
}
}
void updateScreen(){
circlefill ( buffer, cursor_x, cursor_y, 20, makecol( 0, 60, 0));
draw_sprite( screen, buffer, 0, 0);
}
int main(){
allegro_init();
install_mouse();
install_keyboard();
set_color_depth(16);
set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0);
buffer = create_bitmap( 640, 480);
show_mouse(buffer);
while( !key[KEY_ESC]){
getMouseInfo();
updateScreen();
}
return 0;
}
END_OF_MAIN();
 
non mischiare i compilatori, altrimenti non te ne esci

dev-c++ usa una versione di gcc vecchia quanto il mondo, da allora gcc ha modificato l'abi e i formati dati una trentina di volte :asd:

è fondamentale, soprattutto quanto s'implementa un os, usare una specifica toolchain
 
Pubblicità
Pubblicità
Indietro
Top