C ++ Sorularında İşletim Sistemi Geliştirme


9

Bir Master projesi olarak, basit bir işletim sistemi tasarlıyorum. Bir x86 mimarisinde 16 bit Gerçek Modda çalışacak şekilde tasarlanmıştır. İdeal olarak, bu işletim sistemini C ++ ile geliştirmek ve yalnızca gerektiğinde montajı kullanmak istiyorum. Şimdiye kadar, C ++ ve asm karışımı olan bir çekirdeği yükleyen montajda yazılmış bir önyükleme yükleyicim var. Benim sorum C ++ kullanımı ile ilgili. Şu andan itibaren derlendi ve çalışabilir, ancak dinamik bellek ayırma kullanmadım.

C'yi kullanıyordum, bellek ayırmayı işleyecek malloc işlevlerini yazmak mantıklı olurdu, ancak C ++ 'da yeni anahtar kelime kullanılır. Yani...

Bellek ayırmak için perde arkasında 'yeni' nasıl çalışır ve bunu nasıl ele alacağım?

Ve bir sonuç olarak ...

Daha yüksek seviyedeki apselerden faydalanmak için C ++ kullanmaya çalışmak mantıklı mı? Yoksa onu kullanmak daha çok bir baş ağrısı mı olur ve C ile mi yapmalıyım?

C ++ 'ın iyi bir seçim olmayacağına inanıyorsanız lütfen mantık sağlayın.

Yanıtlar:


9

newFiili tahsisi kapalı anahtar kelime eller operator newoldukça benzer davranır, malloc: o yere gelen bellek alır. Derleyici tüm yapıcı sihri yapacak. Bu nedenle, C ++ derleyicisi C ++ çalışma zamanı lib'inin (veya kodunuzun) uygulanmasını bekler operator new.

Bazı soyutlamalar için C ++ kullanmak kesinlikle mantıklıdır. Bir işletim sisteminin kendi başına dönmesi için hiçbir neden yoktur std::list<>. İstisnalar çok daha zahmetlidir. Arasında yararlıdan yararsız şeylere bir degrade var. std::complex? Mükemmel çalışıyor, ama neden ihtiyacınız var?


5

C ++ 'ın C'ye göre avantajlarının çoğunun çalışma zamanı desteği ile ilgisi yoktur ve bu durumlarda C ile yazılmış kod ile C ++ ile yazılmış kod arasında gerçekten bir fark yoktur. Örneğin, şablonlar çalışma zamanında hiçbir şey yapmaz. Ekstra yazarak bir sürü yapamayacağınız hiçbir şey yapmıyorlar. C ++, işletim sistemlerini yazmak için çok makul bir dildir, çünkü ihtiyaç duyduğunuzda düşük düzey erişim sağlar, bit döndürmeye odaklanmanıza gerek olmadığında C'den daha yüksek düzey soyutlamalarla birlikte.

newiki şey yapar: bir yerden hafıza alır ve gerekli kurucuları çalıştırır. Hafızayı alırken, bundan farklı değil malloc.


3

Belki de normalde bir newifade için oluşturulan kod hakkında kabaca bir fikir vermek mantıklı olacaktır . Bu derleyici tarafından oluşturulan, ama eğer bir işlev olarak uygulamadan edildi, böyle görünecektir:

template <class T>
T *new_object() { 
    void *raw_data = ::operator new(sizeof(T));
    return new(raw_data) T;
}

Nasıl newçalıştığına önem veriyorsanız , (neredeyse) kaçınılmaz takip şu şekilde gerçekleşir delete:

template <class T>
void delete_object(T const *object) { 
    object->~T();
    ::operator delete(object);
}

Diğerleri zaten işaret ettiği gibi ::operator newve ::operator deleteoldukça temel bellek ayırıcılar. Örneğin, Unix benzeri bir sistemde muhtemelen büyük bellek parçaları tahsis etmek brkveya sbrkayırmak için bir şey çağırırlar ve daha sonra bu büyük bloklardan daha küçük parçalar dağıtırlar. Kendi işletim sisteminizde, muhtemelen bir çeşit analog sbrkve benzeri bir şey istiyorsunuz - aslında tüm bellekle "boş" olarak başlayan ve gerektiğinde bellek parçalarını ayıran bir şey. Gerçek modda çalıştığınız göz önüne alındığında, bu muhtemelen oldukça basit olacaktır - kullanılabilir az miktarda bellek göz önüne alındığında, pratik bir tasarımın ayrıntılı algoritmalar üzerinde küçük boyutu vurgulaması neredeyse gerekir.


-4

Çoğu işletim sistemi CI'de yazılmıştır. Öte yandan bu bir yüksek lisans projesi, bu yüzden farklı ve ilginç bir şey yapın.


1
Çoğu büyük işletim sistemi başlangıçta C ++ kullanıma sunulmadan önce yazılmıştır. Bu seçimi sınırladı. :-)
Bo Persson

1
bazen downvotes bulaşıcı olduğunu düşünüyorum.
Kevin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.