Çözüldü Kernelmain işleminde printf için tanımsız başvuru hatası

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

mrht1234

Hectopat
Katılım
3 Aralık 2020
Mesajlar
1.397
Çözümler
4
Yer
Edirne/Merkez
Daha fazla  
Cinsiyet
Erkek
Merhaba kernelmain işleminde printf için tanımsız başvuru hatası alıyorum kodları ve hatayla ilgili ekran alıntısını buraya atacağım.

[CODE lang="cpp" title="Hataya Sebep Olan Kod"]#include <stdio.h>

void print(char* str)
{

unsigned short* VideoMemory = (unsigned short*)0xb8000;

for(int i = 0; str != '\0'; ++i)
VideoMemory = (VideoMemory & 0xFF00) | str;

}

extern "C" void kernelMain(void* multiboot_structure, unsigned int magicnumber)
{
printf("Kapiler İsletim Sistemi");

while(1);

{

}

}[/CODE]

Ekran görüntüsü 2022-04-04 173750.png


@Enes3078
@Ecmel
@Recep Baltaş.
@Ali Güngör.
@GNU or NOT.
@TerabyteForever
@Dynamics
 
Çözüm
Hatayı sonunda çözdüm hatayı çözen kod:

[CODE lang="cpp" title="Hatayı çözen kod:"]#include <stdio.h>

void print(char* str)
{

unsigned short* VideoMemory = (unsigned short*)0xb8000;

for(int i = 0; str != '\0'; ++i)
VideoMemory = (VideoMemory & 0xFF00) | str;

}

extern "C" void kernelMain(void* multiboot_structure, unsigned int magicnumber)
{
print("Kapiler İsletim Sistemi");

while(1);

{

}

}[/CODE]
Oncelikle kernel fazla iddiali bir isim olmus bootloader e bagli bir callback sadece bu. Bu tarz low level calismalarda direk donanimla hasir nesir oldugun icin hazir kitaplik kullanamazsin her seyi sifirdan kendin yazarsin, mesela burada print fonksiyonu low level stdout memory adresine yaziyor. Her seyi kendin yazicaksin.
 
Oncelikle kernel fazla iddiali bir isim olmus Bootloader'e bagli bir callback sadece bu. Bu tarz Low level calismalarda direk donanimla hasir nesir oldugun icin hazir kitaplik kullanamazsin her seyi sifirdan kendin yazarsin, mesela burada print fonksiyonu Low level stdout Memory adresine yaziyor. Her seyi kendin yazicaksin.

Fakat eğer kütüphane tanımlamazsam başka bir hata veriyor.
 
İşletim sistemi yaparken C ile yalnızsınız. Standart kütüphaneyi kullanamazsınız çünkü onun uyumlu olduğu işletim sistemleri var. Standart kütüphanedeki fonksiyonlar aslında işletim sistemine SYSCALL yaparlar.

Mesela ekrana bişiler yazdırmak istiyorsanız BIOS interruptını kullanabilirsiniz, örneğin: int 10h ile AH registerına 0Ah değerini verdiğinizde imleç pozisyonundan itibaren ekrana yazı yazmak istediğinizi anlatmış olursunuz BIOS'a.
 
  • Artık dağıtımın ile gelen derleyici yerine cross-compiler'a geç, yoksa başın çok ağrıyacak.
  • GNU C kütüphanesi diye bir şey olmaz bare-metal kodda.
  • Programlamayı, mantığını tam bilmeden ilerlemeye çalışıyorsun ve bir yerde bu çok kötü seni patlatacak.

1. ben zaten cross-compiler dağıtımın derleyecisi değil kullanmıyorum 2. ben programlama öğrenmiyorum direk işletim sistemi geliştiriyorum.
 

Technopat Haberler

Yeni konular

Geri
Yukarı