2016-03-30 33 views
-1

Kendi işletim sistemimi geliştiriyorum. Önyükleme sektörünü tamamladım ve çekirdeğimi başarıyla yükledim. Geliştirme ortamım Ubuntu 14.04 ve GCC 4.8. Çekirdeğim BOCHS altında çalışacak. Ekranda belirli bir konumda belirli bir karakteri yazdırmak istedi, ben de böyle bir işlevi yarattı: Ben çekirdeğin giriş noktasıdır benim main fonksiyonu, bu işlevi çağırmakBir karakter yazdırmak için bir işlev çağıran inanılmaz bir olay

void print_char(char target, int col, int row, unsigned char attribute) { 
    //attribute controls the colour of the character 
    char * vidmem = (char *) VIDEO_ADDRESS; //#define VIDEO_ADDRESS 0xb8000 
    *vidmem = target; 
    //TODO: add other control statements 
} 

:

print_char('T', 0, 0, (unsigned char) 0x0f);

Yukarıdaki kodun, ekranın sol üst köşesinde 'T' karakterini yazdırması bekleniyor. Bu görünmüyor! Böyle

void print_char(char target, int col, int row, int attribute)

Ya da bir şey: Ben print_char ilanını değişti sonra

void print_char(char target, int col, int row) sonra print_char('T', 0, 0) bunu değiştirdikten sonra

gibi diyoruz, her şey çalışıyor! Bu problem hakkında gerçekten kafam karıştı. Bana açıklayan var mı?

+0

. Ancak böyle garip semptomlarınız olduğunda, çoğu zaman Tanımsız Davranışa neden olan koddaki hataların bir sonucudur. Hata, belirtilerin ortaya çıktığı kodun bir parçası bile olmayabilir. Ama sağladığınız bilgilerden anlayabileceğimiz bir yol yok. – kaylum

+0

Bochs'u bir süredir kullanmadım, ancak bunun nispeten iyi bir montaj hata ayıklayıcısına sahip olduğunu hatırlıyorum. – immibis

+0

Belki de sadece kodu yanlış okuyorum. Ama farz edelim ki * vidmem = öznitelik; çalıştırılır ve 'vidmem', 0xB8000 özniteliğini yazacak olan 0xB8000 adresine sahiptir. 0xB8000 ilk karakterdir, 0xB8001 ilk karakterin özniteliğidir, 0xb8002 ikinci karakterdir ve 0xb8003 ikinci karakterin özniteliğidir ve böyle devam eder. Sanırım benim amacım, öznenin yanlış baytla yazılması gibi görünüyor. –

cevap

1

aşağıdaki Tabloları tarafından (My ubuntu 64-bit sürümü) sorunu çözmek dosyanın '.bin' 32 bit .o dosyası ve oluşturmak için gcc ve ld bayraklarını değiştirme var.

kernel_entry.o bizim rutin çekirdek kodunda main fonksiyonun girişi bulur sağlayacağız

kernel.bin: kernel/kernel_entry.o ${OBJ} ld -o [email protected] -melf_i386 -Ttext 0x1000 $^ --oformat binary

%.o: %.c ${HEADERS} gcc -ffreestanding -m32 -c $< ${CFLAG} -o [email protected]

. Sonra benim os görüntü elde: boot_sect.bin bir önyükleme sektörü rol oynar

os-image: boot/boot_sect.bin kernel.bin cat $^ > os-image

.

Ama 64 bit objektif dosya yukarıda açıklanan olayına sebep olur neden hala bilmiyorum ... Hemen hemen imkansız bize böyle eksik bilgiye size yardımcı olmak için var