2014-08-23 23 views
19

Bir İşletim Sistemini tamamen C'ye yazmak mümkün müdür?Bir İşletim Sistemini tamamen C'ye yazmak mümkün mü?

Tamamen, ben her şeyi bootloader'a kadar içerir, fakat BIOS/UEFI'yi değil.

+1

"İşletim sistemi" dediğinizde gerçekte ne anlama geldiğine bağlı olarak değişir. ARM ile ilgili bir kitaptaki bazı Cortex-M işlemcilerinin (MCU'lar için çok kullanışlıdır) mümkün olduğunu okudum, fakat büyük olasılıkla diğer birçok çekirdekte bazı temeller için en az bir montaj kullanmak zorunda kalacaksınız. yapılandırması. – user35443

cevap

20

Sorunun geleneksel cevabı "programını programını C dilinde yazabilir" "hayır" şeklindedir. Bunun nedeni, bir C programının kendi kümesini oluşturmasının bir yolu olmamasıdır.

Hemen hemen her işlemci işaret gerekmektedir (genellikle çerçeve işaretçisi adlandırılır) istif içinde geçerli adres işaret eder ve bazen (genellikle yığın işaretçisi olarak da adlandırılır), bir ikinci kayıt var en azından bir kayıt var yığındaki sonraki kullanılmayan adres. Yığın işaretçisini veya çerçeve işaretçisini mutlak bir değere ayarlamak için dilin kendisinde herhangi bir ifade veya deyimi kullanmanın bir yolu yoktur. (Prosedür çağırır ve döner ekleme ve yığın işaretçisi çıkarma ama bilinen bir değere başlatmak için bir yolu yoktur olabilir.)

Posix'e hemen hemen her zaman yazılı fonksiyonlar, setcontext, getcontext, makecontext ve swapcontext bir dizi (tanımlar yığın ve çerçeve işaretçisini okuyup yazmanızı sağlayacak en azından kısmen assembler içinde).

Maalesef, setcontext işlev ailesinin işlevleri yaygın olarak kullanılmamaktadır.

7

Teorik olarak evet, ama her şey değil.

Önyükleyici ve gerçek modda bazı eski 16 bit derleyiciyi (örn. Turbo C) bulabilir, ona düz ikili çıktı verebilir ve tüm bunları yazabilirsiniz.
Veya GCC'de alternatif olarak kodunuzun üstüne asm(".code16gcc") koyabilirsiniz, ancak GCC doğrudan 16 bit kodu çıkaramadığından sonuç derleme programı 512 baytan fazla sürebilir.

Diğer şeyler için, montaj kullanımını geçersiz kılmak mümkün değildir.
Evet, tüm montaj satırlarını satır içi işlevler (IN \ OUT, CRx yazmaçları ve diğer öğeler) içinde gizleyebilirsiniz, ancak diğer şeyler için, kesintiler gibi, montajı kullanmak zorunda kalacaksınız.

Düzenleme:
Şimdi GCC (4.9.0) bu nedenle montaj kullanımı ayrıca (bazı bitleri hala gerektirecektir bootsector/bootloader gibi şeyler için azaltılabilir, 16-bit kod üretimine imkan sağlayan -m16 seçeneğini destekler her ne kadar).

7

Size C.

ile ne demek bağlıdır

tanımladığınız davranışlarına sadece güvenerek, ISO tarafından tanımlanan ve donanım üzerinde çalışan bir ortak çeşitli işletim sisteminin düşündüğünüzü gibi standart C programlama dilini kastediyorsan o zaman, hayır, C'ye pratik bir işletim sistemi yazmak mümkün değildir, çünkü C, özellikle donanımlara erişmek ve ayrı programları manipüle etmek için birçok olanaktan yoksundur.

C programından oluşan bir işletim sistemi yazmak mümkündür ve sadece C tesisleri üzerinden giriş/çıkış sağlar, ancak gerçek donanım üzerinde çalışan bir işletim sistemi değildir. Bir makine ve işletim sistemi için bir emülatör yazabilirsiniz.

Uygulamaya özel davranışlara izin verirseniz, yanıtlar önemsizdir çünkü uygulamaların uygun gördükleri uzantıları eklemesine izin verilir. operating_system();'un bir işletim sistemi uygulayan bir programın kaynak kodu olduğu bir C uygulamasının olması kesinlikle mümkündür.

Bir derleme kullanmadan bir işletim sistemi (çalışma ortamı dahil) oluşturmak için tipik bir C derleyicisi kullanmanın mümkün olup olmadığını kastederseniz, C derleyicileri genellikle yalnızca bazı Bir bağlam anahtarını gerçekleştirmek ve bir yığın oluşturmak için gerekenler gibi, OS yazıcılarına olan ilgi. Ancak bu mutlak bir kural değildir. İsterseniz, çalışma ortamı ortamının hangi bölümlerinin derleyici yazıcısından geldiğini ve hangi parçaların OS yazıcısından geldiğini gösterir.

+0

Adil bir sayıdaki platformda tek bir montaj dili yazmadan (sadece derleyiciyle birlikte gelen kütüphaneleri kullanarak) bir işletim sistemi yazmak mümkün olabilir, ancak en azından biraz makine yazmak daha iyi olurdu kodu. Örneğin, birçok platformda (statik olarak) bir "jmp_buff" ile "char []" arasında bir birleşim tanımlanabilir, program giriş noktası kendi karakterlerini ayrı ayrı yazabilir ve sonra buna "longjmp" yazabilir. herhangi bir yığının herhangi bir şekilde kullanılması [memcpy, hatta bir yapısal atamanın bir altprogram olacağına, dolayısıyla iyi olmayacağına dikkat edin]. – supercat

+0

Yığını ayarlamak için bir miktar iç hat düzeneği kullanmak muhtemelen bir "jmp_buff" öğesinin byte by byte'ından daha temiz (ve muhtemelen daha taşınabilir) olacaktır, ancak jmp_buff gibi teknikleri kullanmak C kodundan başka bir şeyin derlenmesini gerektirmeden sistemi kurmak için birçok uygulama. – supercat

İlgili konular