Bir çalıştırılabilir dosyanın çalışması için bir işletim sistemi çekirdeğine ihtiyacı olur mu?


53

Kaynak kodun C ++ derlendiğinde derleyiciden çıktının doğrudan CPU için talimatlar olduğunu düşündüğüm makine kodu (çalıştırılabilir) olduğunu biliyorum. Son zamanlarda çekirdekleri okuyordum ve programların donanıma doğrudan erişemediğini, ancak çekirdeğin içinden geçmesi gerektiğini öğrendim.

Dolayısıyla, basit bir kaynak kodu derlediğimizde, sadece bir printf()işlevle derlediğimizde ve derleme çalıştırılabilir makine kodunu ürettiğimizde, bu makine kodundaki her bir komut doğrudan bellekten (işletim sistemi tarafından belleğe yüklendikten sonra) direkt olarak bellekten mi yürütülecektir? Makine kodundaki her bir komutun yürütülebilmesi için hala işletim sistemi (çekirdek) içinden geçmesi gerekir.

Benzer bir soru okudum . Derlemeden sonra üretilen makine kodunun doğrudan CPU'ya bir talimat olup olmadığını veya CPU için doğru talimatı oluşturmak için tekrar çekirdeğe gitmesi gerekip gerekmediğini açıklamadı. Yani, makine kodu belleğe yüklendikten sonra ne olur? Çekirdekten mi geçecek yoksa doğrudan işlemciyle mi konuşacak?


29
Bir Arduino için kod yazıyorsanız, bir işletim sistemine ihtiyacınız yoktur.
stib

12
printfbu iyi bir örnek değil. C spec tarafından açıkça "sadece barındırılan" uygulamalarda kullanılabilen bir işlev olarak tanımlanmıştır (bir tane gerektirmeyen "bağlantısız" yerine, çekirdek üzerinde çalışan anlamına gelir). Ve çoğu platformda, printfsizin libctarafınızdan sağlanan , sizin adınıza bir sürü şey yapan bir işlevdir (sonunda stdout'a yazdırmak için bir çağrı içerir). Bu aramasını gerçekten farklı değil libvlc_media_list_add_mediaya PyObject_GetAttrbiraz dışında printfuygulama ekstra standart dışı eklemeden bağlanabilir garantilidir -ls.
abarnert

1
Bu var! (bağlı değil, sadece güzel olduğunu düşündüm) erikyyy.de/invaders
Nonny Moose

9
Bu, gerçekten "çalıştırılabilir", "çekirdek", "çalıştır", "ihtiyaç", "konuş" ve "geç" terimlerinin tam tanımına bağlıdır. Bu terimlerin kesin bir tanımı olmadan, soru cevaplanamaz.
Jörg W Mittag

3
@ JörgWMittag - Eğer bilgiçlik yapacaksanız, neden sadece bu terimleri ve sadece bu soruyu incelemeyi düşünüyorsunuz? Tanımlanması gereken gerçekten belirgin terim, MS-DOS'a (ve benzer tek görevli çalışma zamanı ortamlarına) şüpheyle uygulanan "işletim sistemi" dir. PC BIOS'un bir işletim sistemi olduğunu düşünen birkaç (yanlış biçimlendirilmiş) kişi varsa, her şey kapmak için hazır mı? Bence değil. OP, bu kelimeleri makul görünen (özellikle anadili İngilizce olmayan) veya teknik olmayan bir bağlamda kullanır.
talaş

Yanıtlar:


86

İşletim sistemi olmadan çalışan programlar yazan biri olarak kesin bir cevap veriyorum.

Bir çalıştırılabilir dosyanın çalışması için bir işletim sistemi çekirdeğine ihtiyacı olur mu?

Bu, programın nasıl yazıldığı ve oluşturulduğuna bağlıdır.
Hiç bir işletim sistemi gerektirmeyen bir program (bilginiz olduğunu varsayarak) yazabilirsiniz.
Böyle bir program bağımsız olarak tanımlanmaktadır .
Önyükleyici ve tanılama programları, bağımsız programlar için tipik kullanımlardır.

Bununla birlikte, bazı ana işletim sistemi ortamlarında yazılmış ve oluşturulan tipik program, aynı ana işletim sistemi ortamında yürütme için varsayılan olacaktır.
Bağımsız bir program yazmak ve oluşturmak için çok açık kararlar ve eylemler gerekir.


... derleyiciden çıkan çıktı doğrudan CPU için talimat olduğunu düşündüğüm makine kodudur (çalıştırılabilir).

Doğru.

Son zamanlarda çekirdekleri okuyordum ve programların donanıma doğrudan erişemediğini, ancak çekirdeğin içinden geçmesi gerektiğini öğrendim.

Bu, işletim sisteminin programları yürütmek için kullandığı ve derleyiciler ve kütüphaneler gibi bazı derleme araçlarının kolaylaştırdığı bir CPU modu tarafından getirilen bir kısıtlamadır.
Şimdiye kadar yazılmış her program için gerçek bir sınırlama değildir.


Dolayısıyla, basit bir kaynak kodu derlediğimizde, sadece bir printf () işleviyle derlediğimizde ve derleme çalıştırılabilir makine kodunu ürettiğimizde, bu makine kodundaki her komut doğrudan bellekten doğrudan yürütülecektir (kod, işletim sistemi tarafından belleğe yüklendikten sonra). ) veya makine kodundaki her bir komutun yürütülecek işletim sistemi (çekirdek) içinden geçmesi gerekecek mi?

Her komut CPU tarafından yürütülür.
Desteklenmeyen veya yasa dışı olan bir talimat (örneğin, işlemin imtiyazının yetersiz olması) acil istisnalara neden olur ve CPU bunun yerine bu olağandışı durumu idare etmek için bir rutin yürütür.

Bir printf () işlevi "basit kaynak kod" örneği olarak kullanılmamalıdır .
Nesne yönelimli bir üst seviye programlama dilden makine koduna çeviri sizin ima ettiğiniz kadar önemsiz olmayabilir.
Ardından, veri dönüşümleri ve G / Ç işlemleri yapan bir çalışma zamanı kitaplığından en karmaşık işlevlerden birini seçersiniz .

Sorunuzun bir işletim sistemi (ve bir çalışma zamanı kütüphanesi) içeren bir ortam öngördüğünü unutmayın.
Sistem önyüklendiğinde ve işletim sistemine bilgisayarın kontrolünü verdikten sonra, bir programın yapabileceklerine kısıtlamalar getirilir (örn. İşletim sistemi tarafından G / Ç yapılması gerekir).
Bağımsız bir program (örneğin bir işletim sistemi olmadan) yürütmeyi düşünüyorsanız, işletim sistemini çalıştırmak için bilgisayarı başlatmamalısınız.


... makine kodu belleğe yüklendikten sonra ne olur?

Bu çevreye bağlı.

Bağımsız bir program için çalıştırılabilir, yani kontrol programın başlangıç ​​adresine atlanarak teslim edilir.

İşletim sistemi tarafından yüklenen bir program için, programın bağlı olduğu paylaşılan kütüphanelerle dinamik olarak ilişkilendirilmesi gerekir. İşletim sistemi, programı yürütecek olan işlem için bir yürütme alanı yaratmalıdır.

Çekirdekten mi geçecek yoksa doğrudan işlemciyle mi konuşacak?

Makine kodu CPU tarafından yürütülür .
Onlar yok "çekirdek üzerinden gitmek" , ama ne de yok "işlemci konuşmak" .
Makine kodu (op kodu ve operand'lardan oluşur) kodu çözülmüş ve işlem yapılan CPU'ya bir talimattır.

Belki de araştırmanız gereken bir sonraki konu CPU modlarıdır .


2
"Bağımsız bir program (örneğin bir işletim sistemi olmadan) yürütmeyi düşünüyorsanız, işletim sistemini çalıştırmak için bilgisayarı başlatmamalısınız." Tamamen doğru değil. DOS'tan sonra birçok DOS programı yüklenmiştir ve ardından DOS servislerini tamamen görmezden gelir (doğrudan doğrudan çarparak veya doğrudan BIOS'u arayarak). Win3.x (bazı ilginç köşe durumları hariç) DOS'un mevcut olmadığını göz ardı eden mükemmel bir örnektir. Win95 / 98 / Me de bunu yaptı. Pek çok 8- / 16-bit döneminden kalma bağımsız programları destekleyen birçok işletim sistemi örneği var.
Eric Towers

8
@EricTowers - "DOS" derken muhtemelen MS-DOS'u kastediyorsunuz (MS veya Intel ile ilgili olmayan DOS kullandığım için)? 1970'lerin üniversite ders kitaplarının işletim sistemi konseptleri ve tasarımı konusundaki kriterlerine uymayan bir “işletim sistemi” olduğunu söylüyorsunuz. MS-DOS'un kökenleri, (Seattle Computer Products aracılığıyla), açıkça işletim sistemi adı Gary Kildall tarafından adlandırılmayan CP / M'ye dayanıyor. FWIW Bir programın sistemi ele geçirmesine izin veren bir işletim sistemi, sistem kaynaklarını yönetme temel işlevinde başarısız olmuştur. "Bağımsız programları destekleyen birçok işletim sistemi örneği var" - "Destek" veya önlenemedi mi?
talaş

5
... veya ProDOS veya PC-DOS veya DR-DOS veya CBM DOS veya TRS DOS veya FLEX ...
Eric Towers

3
GCC'nin "bağımsız" terminolojisini seviyorum. İngilizce sözcük, işletim sistemi olmadan çalışan kod için tüm doğru çağrıştırmalara, belki de "bağımsız" kelimelere göre daha iyidir. Örneğin gcc -O2 -ffreestanding my_kernel.c special_sauce.S, normal kütüphanelerden herhangi birinin veya işletim sistemi öğelerinin orada olacağını varsaymayan bir çalıştırılabilir yapmak için derleyebilirsiniz . (Elbette normalde bir bootloader'ın yüklemek isteyeceği bir dosya formatına faydalı bir şekilde bağlanmasını sağlamak için bir linker betiğine ihtiyacınız olacak!)
Peter Cordes

4
@PeterCordes "bağımsız", IMO'nun biraz yetkili sayılabilecek C standardında kullanılan bir terimdir. Alternatif olarak, iyi bir terim aynı zamanda "barındırılmayan" dır (OS'nin ev sahipliğinde olduğu gibi)
Jan Dorniak,

38

Çekirdek "sadece" daha fazla kod. Sadece bu kod, sisteminizin en alt kısımları ile gerçek donanım arasında yaşayan bir katmandır.

Hepsi doğrudan CPU üzerinde çalışıyor, siz bir şey yapmak için katmanlarını geçiyorsunuz.

Programınız, çekirdeği, printfkomutu ilk etapta kullanabilmek için standart C kütüphanelerine ihtiyaç duyduğu şekilde "ihtiyacı" içindedir .

Programın gerçek kod CPU üzerinde çalışır, ancak kod ekranda bir şey C için kod geçmesi baskı yapar dalları printfkendi işlem yapmak, her biri çeşitli diğer sistemlere ve tercümanlar aracılığıyla, fonksiyonu, sadece çalışmak için nasıl hello world! aslında ekranınıza basılır.

Diyelim ki donanımınızda çalışan, çekirdeğinizde çalışan ve bir masaüstü pencere yöneticisinde çalışan bir terminal programınız var.

Devam eden daha çok şey var ama basit tutalım ...

  1. Terminal programınızda yazdırmak için programınızı çalıştırın. hello world!
  2. Terminal, programın (C çıkış yordamları yoluyla) hello world!konsola yazdığını görür.
  3. Terminal programı masaüstündeki pencere yöneticisine gidiyor, "Bana hello world!yazdım, yerine koyabilir misiniz x, ylütfen?"
  4. Masaüstü pencere yöneticisi, "programlarımdan biri grafik cihazınızın bu pozisyonda bir metin koymasını istiyor, hadi!"
  5. Çekirdek, isteği grafik kartının anlayabileceği şekilde biçimlendiren grafik aygıtı sürücüsüne iletir
  6. Grafik kartının nasıl bağlandığına bağlı olarak, verileri, PCIe gibi fiziksel aygıt veri yollarından çıkarmak, doğru aygıtın seçildiğinden emin olmak ve verilerin ilgili köprüden geçebileceğinden emin olmak gibi işlemleri yapmak için diğer çekirdek aygıt sürücülerinin çağrılması gerekir. dönüştürücüler
  7. Donanım bir şeyler görüntüler.

Bu sadece açıklama için çok büyük bir basitleştirmedir. Burada ejderhalar olsun.

Donanım erişmesi gerekiyor bunu Etkili herşey, amacım bu, dosyaların ya da bir şey hafıza blokları, bit görüntülemek olmak vardır tam olarak çalışmak için çekirdekte bazı cihaz sürücüsü geçmesi nasıl alakalı cihaza konuşmak için. Bir PCIe köprü aygıtının üzerinde oturan bir SATA sabit disk denetleyicisi sürücüsünün üstünde bir dosya sistemi sürücüsü.

Çekirdek tüm bu aygıtları nasıl bağlayacağını bilir ve programların tüm bu şeyleri kendileri nasıl yapacaklarını bilmeden bir şeyler yapmaları için nispeten basit bir arayüz sunar.

Masaüstü pencere yöneticileri, programların, pencereleri çizmeyi bilmeleri ve aynı anda bir şeyleri göstermeye çalışan diğer programlarla iyi oynamaları gerekmediği anlamına gelen bir katman sağlar.

Son olarak, terminal programı, programınızın nasıl bir pencere çizileceğini, çekirdek grafik kartı sürücüsüyle nasıl konuşacağını, ne de ekran tamponları ile başa çıkma ve ekran zamanlaması ile başa çıkma ve gerçekte dolaşma veri hatları ekrana gelir.

Hepsi kod katmanlarında katmanlarla işlenir.


Yalnızca donanıma erişim değil , programlar arasındaki iletişimin çoğu da çekirdeğin içinden geçiyor; tipik olarak en azından çekirdeği içermeyen, daha doğrudan bir kanal kurar. Bununla birlikte, sorunun amaçları için, tüm kodu tek bir programda yoğunlaştırmak çok daha basit durumlarda mümkündür ve uygulanır.
Chris Stratton

Gerçekten de, terminal programınız, kendisine program yazan programla aynı makinede çalışıyor olmak zorunda değildir.
jamesqf

Bu soruda açıkça belirtilmesi gerekebileceğinden - birbirleriyle "konuşan" programlar hakkında konuşurken, mecazi olduğunu not edin.
kullanıcı253751

21

Çevreye bağlı. IBM 1401 gibi daha eski (ve daha basit!) Bilgisayarlarda, yanıt "hayır" olur. Derleyici ve bağlayıcı, herhangi bir işletim sistemi olmadan çalışan bağımsız bir "ikili" yaydı. Programınızın çalışması durduğunda, işletim sistemi olmadan da çalışan farklı bir program yüklediniz.

Modern ortamlarda bir işletim sistemine ihtiyaç vardır, çünkü bir seferde sadece bir program çalıştırmıyorsunuzdur. CPU çekirdeği, RAM, yığın depolama aygıtı, klavye, fare ve ekranın aynı anda birden fazla program arasında paylaşılması koordinasyon gerektirir. İşletim sistemi bunu sağlar. Bu nedenle, modern bir ortamda, programınız sadece disk veya SSD'yi okuyamaz ve yazamaz, OS'den bunu kendi adına yapmasını ister. İşletim sistemi, depolama aygıtına erişmek isteyen tüm programlardan bu tür istekleri alır, erişim kontrolleri gibi şeyler uygular (sıradan kullanıcıların işletim sistemi dosyalarına yazmalarına izin veremez), onları cihaza sıraya koyar ve geri gönderilen bilgileri sıralar doğru programlara (süreçler).

Ek olarak, modern bilgisayarlar (örneğin 1401'den farklı olarak), yalnızca IBM'in eski günlerde size satacağı aygıtları değil, çok çeşitli G / Ç aygıtlarının bağlantısını destekler. Derleyici ve bağlayıcı, tüm olasılıkları bilemez. Örneğin, klavyeniz PS / 2 veya USB ile arayüzlenmiş olabilir. İşletim sistemi, bu aygıtlarla nasıl konuşulacağını bilen, ancak aygıt sınıfı için işletim sistemine ortak bir arabirim sunan aygıta özgü "aygıt sürücüleri" yüklemenizi sağlar. Bu nedenle, programınız ve hatta işletim sisteminiz, bir PS / 2 klavyeden bir USB'den tuş vuruşlarını almak veya başka bir yerde kapalı olan bir depolama birimine veya bir depolama birimine veya yerel bir SATA diskine erişmek için farklı bir şey yapmak zorunda değildir. NAS veya SAN'da. Bu ayrıntılar, çeşitli aygıt denetleyicileri için aygıt sürücüleri tarafından işlenir.

Yığın depolama aygıtları için, işletim sisteminin tümü, depolamanın nerede ve nasıl uygulandığına bakılmaksızın, dizinlere ve dosyalara aynı arabirimi sunan bir dosya sistemi sürücüsü sağlar. Ve yine de, işletim sistemi erişim kontrolleri ve serileştirme hakkında endişeleniyor. Genel olarak, örneğin, aynı dosya bir seferde birden fazla program tarafından bazı kasnaklara atlanmadan yazmak için açılmamalıdır (ancak aynı anda okumalar genellikle tamamdır).

Yani, modern, genel amaçlı bir ortamda, evet - gerçekten bir işletim sistemine ihtiyacınız var. Ancak bugün bile, gerçek zamanlı kontrol cihazları gibi bir bilgisayara ihtiyaç duyacak kadar karmaşık olmayan bilgisayarlar var.

Arduino ortamında, örneğin, gerçekten bir işletim sistemi yok. Elbette, derleme ortamının oluşturduğu her "ikili" ile birleştirdiği bir grup kütüphane kodu vardır. Ancak bu kodun bir programdan diğerine kalıcılığı olmadığı için bir işletim sistemi değildir.


10

Bence birçok cevap bu soruyu yanlış anlıyor, bu da aşağılara iniyor:

Bir derleyici, makine kodunu çıkarır. Bu makine kodu doğrudan bir CPU tarafından mı çalıştırılıyor, yoksa çekirdek tarafından "yorumlanıyor" mu?

Temel olarak, CPU doğrudan makine kodunu çalıştırır . Çekirdeğin tüm uygulamaları yürütmesi önemli ölçüde daha yavaş olacaktır. Ancak, birkaç uyarı var.

  1. Bir işletim sistemi mevcut olduğunda, uygulama programlarının belirli talimatların yerine getirilmesi ya da belirli kaynaklara erişiminin kısıtlanması vardır. Örneğin, bir uygulama sistem kesme tablosunu değiştiren bir talimat yürütürse, CPU bunun yerine bir istisna istisna işleyicisine atlayarak rahatsız edici uygulamanın sonlandırılmasını sağlar. Ayrıca, uygulamaların genellikle cihaz hafızasına okuma / yazmalarına izin verilmez. (Yani "donanıma göre konuşma".) Bu özel bellek bölgelerine erişim, işletim sisteminin grafik kartı, ağ arayüzü, sistem saati vb. Gibi aygıtlarla nasıl iletişim kurduğunu gösterir.

  2. Bir işletim sisteminin uygulamalara getirdiği kısıtlamalar, CPU'nun ayrıcalık modları, bellek koruması ve kesintiler gibi özel özellikleriyle sağlanır. Bir akıllı telefon veya PC'de bulacağınız herhangi bir CPU bu özelliklere sahip olsa da, bazı CPU'lar yoktur. Bu işlemciler gerçekten istenen özellikleri elde etmek için uygulama kodunu "yorumlayan" özel çekirdeklere ihtiyaç duyarlar. Çok ilginç bir örnek, 34 komutlu bir bilgisayarı taklit eden yongalardan yapabileceğiniz 8 talimatlı bir bilgisayar olan Gigatron'dur .

  3. Java gibi bazı diller, gerçekten makine kodu olmayan Bytecode adlı bir şeye "derler". Geçmişte programları çalıştırmak için yorumlanmış olsalar da, bugünlerde Just-in-Time derleme adı verilen bir şey genellikle kullanılmaktadır, böylece doğrudan CPU'da makine kodu olarak çalışmaktadırlar.

  4. Yazılımın bir Sanal Makinede çalıştırılması, makine kodunun Hiper Yönetici olarak adlandırılan bir program tarafından "yorumlanmasını" gerektiriyordu . VM'ler için muazzam endüstri talebi nedeniyle, CPU üreticileri, konuk sistemlerin çoğu talimatının doğrudan CPU tarafından yürütülmesine izin vermek için CPU'larına VTx gibi özellikler eklediler. Bununla birlikte, bir Sanal Makinede uyumsuz bir CPU için tasarlanmış yazılım çalıştırırken (örneğin, bir NES taklit), makine kodunun yorumlanması gerekir.


1
Java'nın byte kodu normalde makine kodu olmasa da, hala Java işlemcileri vardır .
Ruslan

Hiper yöneticiler her zaman tercüman olmamıştır. Sanal makine, sunucusuyla uyumlu olmayan bir komut seti olarak aynı makinenin çalıştırılması için, ancak aynı mimari uygulama için bile, erken hipervizörler bile doğrudan CPU üzerinde kod çalıştırıyorsa, yorumlama zorunludur (paralirtileştirilmiş çekirdeklere ihtiyaç duymadan, CPU'lar için karıştırabilirsiniz). gerekli hiper yönetici desteği).
Toby Speight

5

Kodunuzu derlerken, (çoğu durumda) sistem kitaplıklarına ( printförneğin) bağlı olan "nesne" kodunu yaratırsınız , daha sonra kodunuz, işletim sisteminizin sağlayabileceği bir program yükleyicisi ekleyen bağlayıcı tarafından sarılır. tanıyın (bu nedenle örneğin Windows'ta Windows için derlenmiş bir programı çalıştıramazsınız) ve kodunuzu nasıl açacağınızı ve çalıştıracağınızı öğrenin. Yani programınız bir sandviçin içindeki bir et gibidir ve sadece bir paket halinde yenilebilir.

Son zamanlarda Çekirdeği okuyordum ve programların donanıma doğrudan erişemediğini, ancak çekirdeğin içinden geçmesi gerektiğini öğrendim.

Peki bu yarı doğru; Programınız bir çekirdek modu sürücüsü ise, o zaman aslında donanıma nasıl "konuşacağınızı" biliyorsanız doğrudan donanıma erişebilirsiniz, ancak genellikle (özellikle belgelenmemiş veya karmaşık donanım için) insanlar çekirdek kitaplıkları olan sürücüleri kullanır. Bu şekilde, adresleri, kayıtları, zamanlamayı ve başka pek çok şeyi bilmeye gerek kalmadan, neredeyse insan tarafından okunabilir bir şekilde donanımla nasıl konuşulacağını bilen API işlevlerini bulabilirsiniz.

Bu makine kodundaki her komut doğrudan bellekten mi yürütülmeli (bir kez kodun OS tarafından belleğe yüklenmesinden sonra) veya makine kodundaki her bir komutun hala işletim sisteminin (çekirdek) üzerinden yürütülmesi gerekecek mi?

Çekirdek, bir garson olarak, sorumluluğu sizi bir masaya sokup size hizmet etmektir. Yapamayacağı tek şey - senin için yemek, bunu kendin yapmalısın. Kodunuzla aynı şekilde, çekirdek programınızı bir belleğe açar ve doğrudan CPU tarafından yürütülen makine kodu olan kodunuzu başlatır. Bir çekirdeğin sizi nezaret etmesi gerekir - neye izin verildiğini ve neye izin verilmediğini.

derlemeden sonra üretilen makine kodunun doğrudan CPU'ya bir talimat olup olmadığını veya CPU için doğru talimatı oluşturmak için tekrar çekirdeğe girmesi gerekip gerekmediğini açıklamıyor mu?

Derlemeden sonra üretilen makine kodu doğrudan CPU'ya bir talimattır. Bundan şüphe yok. Akılda tutmanız gereken tek şey, derlenmiş dosyadaki tüm kodlar gerçek makinenin / CPU kodudur. Linker, programınızı yalnızca çekirdeğin yorumlayabileceği bazı meta verilerle, bir ipucu olarak, programınızla ne yapabileceğini sarar.

Makine kodu belleğe yüklendikten sonra ne olur? Çekirdekten mi geçecek yoksa doğrudan işlemciyle mi konuşacak.

Eğer kodunuz sadece iki yazmaç eklemek gibi basit bir işlem ise, o zaman çekirdek yardımı olmadan doğrudan CPU tarafından gerçekleştirilir, ancak kütüphanelerden fonksiyonlar kullanan kodunuz varsa, bu tür çağrılar, örneğin garsonlukta olduğu gibi, çekirdek tarafından desteklenir. Bir restoranda yemek yemek için size bir alet vereceklerdi - çatal, kaşık (ve hala varlıkları) ama onunla ne yapacaksın, - "koduna" kadar.

Eh, sadece yorumlardaki alevi önlemek için - OP'nin temel şeyleri anlamasına yardımcı olacağını umuyorum, bu basitleştirilmiş bir modeldir, ancak bu cevabı iyileştirmek için iyi öneriler bekliyoruz.


3

Dolayısıyla basit bir kaynak kodu derlediğimizde, sadece bir printf () işleviyle diyelim ve derleme çalıştırılabilir makine kodunu ürettiğinde, bu makine kodundaki her komut doğrudan bellekten çalıştırılacak (kod belleğe yüklendikten sonra) İşletim sistemi tarafından) veya makine kodundaki her bir komutun yürütülmesi için işletim sistemi (çekirdek) içinden geçmesi gerekecek mi?

Temel olarak, sadece sistem çağrıları çekirdeğe gider. G / Ç veya bellek ayırma / ayırma ile yapılacak herhangi bir şey genellikle bir sistem çağrısına neden olur. Bazı talimatlar yalnızca çekirdek modunda çalıştırılabilir ve CPU'nun bir istisna tetiklemesine neden olur. İstisnalar, çekirdek moduna geçmesine ve çekirdek koduna geçmesine neden olur.

Çekirdek bir programdaki her komutu işlemez. Sadece sistem çağırır ve CPU'yu paylaşmak için çalışan programlar arasında geçiş yapar.

Kullanıcı kipinde (çekirdek olmadan) bellek tahsisi yapmak mümkün değildir, belleğe erişme izniniz yoksa, daha önce çekirdek tarafından programlanan MMU’ya erişme izniniz yoksa, CPU düzeyinde bir "bölümlendirme hatası" istisnasına neden olur hangi çekirdeği tetikler ve çekirdek programı öldürür.

G / Ç'yi kullanıcı modunda (çekirdeksiz) yapmak, G / Ç bağlantı noktalarına veya aygıtlar için kayıtlara veya aygıta bağlı adreslere (herhangi bir G / Ç gerçekleştirmek için gerekli olanlardan biri veya her ikisi) erişirseniz mümkün değildir. aynı şekilde istisna.


Bir çalıştırılabilir dosyanın çalışması için bir işletim sistemi çekirdeğine ihtiyacı olur mu?

Çalıştırılabilir dosya türüne göre değişir.

Çekirdekler, RAM ve donanıma paylaşılan erişime aracılık etmenin yanı sıra, bir yükleyici işlevi de gerçekleştirir.

ELF veya PE gibi pek çok "çalıştırılabilir format", çalıştırılabilir dosyada koda ek olarak meta verilere ve işleyicinin bunu işlemek için işine sahiptir. Daha fazla bilgi için Microsoft'un PE formatıyla ilgili kanlı detayları okuyun .

Bu çalıştırılabilirler ayrıca kütüphanelere (Windows .dllveya Linux paylaşılan nesne .sodosyaları) başvuruda bulunur - kodlarının dahil edilmesi gerekir.

Derleyiciniz bir işletim sistemi yükleyicisi tarafından işlenecek bir dosya üretiyorsa ve o yükleyici orada değilse, çalışmaz.

  • Yükleyicinin işini yapan kodu ekleyebilir misiniz?

Elbette. Herhangi bir meta veriyi işlemeden, işletim sisteminizi bir şekilde ham kodunuzu çalıştırması için ikna etmeniz gerekir. Kodunuz çekirdek API'leri çağırırsa, yine de çalışmaz.

  • Ya çekirdek API'lerini çağırmazsa?

Bu yürütülebilir dosyayı bir şekilde bir işletim sisteminden yüklerseniz (örneğin, ham kodun yüklenmesine ve yürütülmesine izin veriyorsa), yine de kullanıcı modunda olacaktır. Kodunuz, ayrılmamış bellek veya G / Ç aygıt adresleri / kayıtları gibi çekirdek modunun aksine, kullanıcı modunda yasak olan şeylere erişirse, ayrıcalık veya bölüm ihlaliyle çarpışır (yine, istisnalar çekirdek moduna geçer ve ele alınır) orada) ve hala işe yaramaz.

  • Ya çekirdek modundan çalıştırırsanız.

O zaman işe yarayacak.



Bu tamamen doğru değil. Donanım erişiminin çekirdekten geçmesi veya bir çekirdeğin olması şartı, bugün birçok sistemde olumlu, ancak aynı zamanda birçok basit sistemde olumsuz (bugün bile) olumsuz olarak verilen bir tasarım kararıdır.
Chris Stratton

İşlerin nasıl olduğunu açıklıyorum A) Bir çekirdek ve B varsa, kullanıcı / denetleyici modu olan bir CPU'da ve bunun zorlanmasına yardımcı olmak için bir MMU kullanıyorsanız. Evet, MMU'lar veya kullanıcı / denetleyici modu olmayan CPU'lar ve mikro denetleyiciler var ve evet, bazı sistemler tüm kullanıcı / denetleyici altyapısını kullanmadan çalışır. Microsoft'un ilk Xbox'ı bu gibiydi - kullanıcı / süpervizör modlu standart bir x86 işlemciye rağmen, çekirdek modundan asla ayrılmadığını anladığım kadarıyla - yüklü oyun ne isterse yapabilirdi.
LawrenceC

1
MacOS X'ten önceki Macintosh Sistemi, hiç bir zaman hafıza korumasını kullanmayan, on yıllarca hafıza korumasını destekleyen genel amaçlı CPU (68000 ailesi, PowerPC) ile çalışan, genel amaçlı bir bilgisayarın işletim sistemi idi. : herhangi bir program bellekteki herhangi bir şeye erişebilir.
curiousguy

3

TL; DR No.

Arduino geliştirme, işletim sisteminin olmadığı mevcut bir ortam olarak karşımıza çıkıyor. İnan bana, bu bebeklerden birinde işletim sistemi için yerin yok.

Aynı şekilde, Sega Genesis için oyunlarda Sega tarafından çağrılmak üzere sağlanan bir işletim sistemi yoktu. Oyununuzu 68K montajcısında oluşturup doğrudan çıplak metale yazdınız.

Ya da dişlerimi kestiğim, Intel 8051'de gömülü çalışmalar yapıyorum. Yine de elinizde olan tek şey 2k * 8 ayak izi olan 2716 eprom iken, işletim sistemi için yeriniz yok.

Tabii ki, bu kelime uygulamasının çok yaygın bir şekilde kullanıldığını varsayar. Bir retorik soru olarak, bir Arduino taslağının gerçekten bir uygulama olup olmadığını kendinize sormaya değer.


3

Diğer cevapların kendi başlarına doğru olmadıklarını ima etmek istemem ama, korkarım ki hala sizin için çok belirsiz olan çok fazla ayrıntı veriyorlar.

Temel cevap, kodun doğrudan işlemcide yürütüleceğidir. Ve hayır, makine kodu kimseyle "konuşmayacak", tersi de olur. İşlemci aktif bileşendir ve bilgisayarınızda yaptığınız her şey bu işlemci tarafından gerçekleştirilecektir (Buradaki işleri biraz basitleştiriyorum, ama şimdilik sorun değil). İşlemci kodu okuyacak ve yürütecek ve sonuçları tükürecektir, makine kodu yalnızca işlemci için gıdadır.

Kafanızdaki karışıklık donanım kelimesinin kullanımından kaynaklanıyor. Bölünme eskisi kadar net olmasa da, her şeyi donanıma çağırmak yerine, çevre birimleri açısından düşünmeniz daha iyi olur. Bu nedenle, makinenizde bir işletim sistemi veya benzeri bir şey varsa, programınız çevre birimlerine erişmek için hizmetlerini kullanmak zorundadır ancak işlemcinin bir çevre birimi olmadığı, programınızın doğrudan çalıştığı ana işlem birimidir.

Çekirdekler, işletim sistemleri ve benzer araya giren katmanlar tipik olarak yalnızca birkaç programın çalışacağı beklentisinin olduğu daha büyük sistemlerde kullanılır ve sistemin bu programların bilgisayarın çevre birimlerini nasıl kullanabileceğini yönetme ihtiyacı vardır (oldukça sık aynı zamanda). Bu durumlarda, çalışan programlar yalnızca bu çevre birimlerine, nasıl paylaşılacağına karar verecek ve çakışma olmadığından emin olacak sistemi kullanarak erişebilir. Rakip programlar arasında herhangi bir yönetime ihtiyaç duyulmayan küçük sistemler, çünkü hiçbiri yok, çoğu zaman hiç altta yatan bir sistem yok ve normal olarak bu sistemler üzerinde çalışan tek program, çevre birimlerinde ne isterse yapmaları için az ya da çok özgür.


2

Bilgisayarınızda açılışta çalışan BIOS, ROM'da depolanan yürütülebilir koddur. Makine talimatları ve verilerden oluşur. Bu BIOS'u kaynak kodundan birleştiren bir derleyici (veya bir derleyici) var. Bu özel bir durum.

Diğer özel durumlar, çekirdeği ve çekirdeğin kendisini yükleyen önyükleme programını içerir. Bu özel durumlar genellikle C ++ 'dan başka bir dilde kodlanmıştır.

Genel durumda, derleyicinin bir çekirdek veya kütüphane rutinleri tarafından sağlanan sistem hizmetlerini çağıran bazı talimatlar üretmesi çok daha pratiktir. Derleyiciyi çok daha hafif yapar. Ayrıca derlenmiş kodu daha hafif hale getirir.

Spektrumun diğer ucunda Java. Java'da derleyici kaynak kodunu makine talimatlarına çevirmez, çünkü bu terim genellikle anlaşılır. Bunun yerine, kaynak kodu, Java Sanal Makinesi adı verilen hayali bir makine için "makine yönergelerine" çevrilir. Bir Java programı çalıştırılmadan önce, Java Sanal Makinesi için bir tercüman içeren Java çalışma zamanı ile birleştirilmelidir.


2

Eski güzel günlerde, programınız, programın yürütülmesi sırasında yapılması gereken her şeyi yapmaktan ya da kendiniz ya da programınıza başkalarının yazdığı kütüphane kodunu eklemekle sorumluydu. Bilgisayarın yanında çalışan tek şey, derlenmiş programınızda okunacak koddu - eğer şanslıysanız. Bazı bilgisayarlarda daha fazlasını (orijinal "önyükleme" işlemi) yapmadan önce anahtarlar arasında kod girilmiş olmalı, hatta tüm programınız bu şekilde girmiştir.

Hızlıca, programın yüklenip çalıştırılabilmesi için kod çalıştıran kodun bulunmasının hoş olduğu tespit edildi. Daha sonra, bilgisayarların, özellikle donanım yardımcı olabilir, ancak programların karmaşıklığı ile birlikte, diğerlerinin ayak parmaklarına basmadığı durumlarda CPU arasında geçiş yaparak aynı anda birkaç programın çalışmasını destekleyecek kadar güçlü oldukları bulundu. , bir kerede yazıcıya veri göndermeye çalışırken birden fazla program nasıl kullanılır?).

Bütün bunlar, büyük miktarda yardımcı kodun, yardımcı program kodunu kullanıcı programlarından çağırmak için standart bir yolla, bireysel programlardan ve "işletim sistemine" taşınmasıyla sonuçlandı.

Ve bugün buradayız. Programlarınız tam hızda çalışıyor ancak işletim sistemi tarafından yönetilen bir şeye ihtiyaçları olduğunda işletim sistemi tarafından sağlanan yardımcı yordamları çağırıyorlar ve bu koda ihtiyaç duyulmuyor ve kullanıcı programlarında bulunmuyor. Bu, ekrana yazma, dosyaları kaydetme, ağa erişme vb. Dahil.

Belirli bir programın tam bir işletim sistemi olmadan çalışması için tam olarak neyin gerekli olduğunu sağlayan mikro çekirdekler yazılmıştır. Bu, deneyimli kullanıcılar için birçoğunu dağıtırken, bazı avantajlara sahiptir. Bununla ilgili Wikipedia sayfasını okumak isteyebilirsiniz - https://en.wikipedia.org/wiki/Microkernel - daha fazla bilgi edinmek istiyorsanız.

Java Sanal Makinesi çalıştırabilen bir Microkernel ile denedim, ancak daha sonra bunun için en güzel yerin Docker olduğunu öğrendim.


1

Tipik masaüstü işletim sistemlerinde, çekirdeğin kendisi yürütülebilir bir dosyadır. (Windows vardır ntoskrnl.exe; Linux vardır vmlinux, vb.) Yürütülebilir bir dosyanın çalışması için bir çekirdeğe ihtiyacınız varsa, bu işletim sistemleri mevcut olamazdı.

Çekirdeğe ihtiyaç duyduğunuz şey, bir çekirdeğin yaptığı şeyleri yapmaktır. Birden fazla çalıştırıcının bir kerede çalışmasına, aralarında hakem, donanımın soyutlanmasına vb. İzin verin. Çoğu program bu şeyleri yetkin bir şekilde yapma yeteneğine sahip değildir ve yapabilecek olsalar bile istemezsiniz. İşletim sisteminin kendisi olarak bile adlandırılabilecek DOS günlerinde, oyunlar genellikle işletim sistemini bir yükleyiciden daha az kullandı ve bir çekirdeğin yapacağı gibi donanıma doğrudan erişdi. Ancak, bir oyuna başlamadan önce makinenizde hangi donanım markalarının ve modellerinin olduğunu bilmek zorunda kalıyordunuz. Pek çok oyun yalnızca belirli video ve ses kartı ailelerini destekliyor ve rakiplerinde hiç çalışmamışlarsa çok kötü bir şekilde koştular. 'O

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.