İşletim sistemleri… çalıştırmak için bir işletim sistemine sahip olmadan… nasıl çalışır?


167

Şu an gerçekten merak ediyorum. Ben bir Python programcısıyım ve bu soru beni rahatsız etti: Bir işletim sistemi yazıyorsunuz. Nasıl çalıştırıyorsun? Bir şekilde çalıştırılması gerekiyor ve bu yol başka bir işletim sistemi içinde mi?

Bir işletim sistemi olmadan bir uygulama nasıl çalışabilir? Bilgisayarda, çalıştırılması gereken bir işletim sistemi yoksa, bu komutları C çalıştırmasını ve bu komutları ekranda çalıştırmasını nasıl söylersiniz?

Bir UNIX çekirdeği ile ilgisi var mı? Eğer öyleyse, bir Unix çekirdeği veya genel olarak bir çekirdek nedir?

OS'lerin bundan daha karmaşık olduğundan eminim, ama nasıl çalışıyor?


14
Bir BIOS'un bunun için olduğundan oldukça eminim - daha büyük işletim sistemlerinde çalışan önyükleme yapan gerçekten küçük bir işletim sistemi.
sevenseacat

64
Bir işletim sistemi uygundur , ancak bir bilgisayarda programları çalıştırmak için birine ihtiyacınız yoktur.
Andres F.

10
İşletim sistemi olmayan bir yazılımı bile işletim sistemi olmadan yazmak mümkündür. Birçok Forth tercümanı geleneksel olarak bir işletim sistemi olmadan koştu (ya da işletim sistemi olduklarını söyleyebilirdiniz). O kadar da zor değil. C'yi biliyorsanız, bir öğrenme alıştırması olarak böyle bir program (belki de küçük bir oyun) yazmaktan zevk alabilirsiniz.
Maksimum

44
Bu karışıklık, bugünlerde kullandığımız harika, güvenli, çok soyutlanmış bilgi işlem sistemlerinin maliyetlerinden biridir: insanlar çok iyi ve yetkin programcılar olabilir ve bilgisayarın nasıl çalıştığının temellerini bile bilmiyorlar. Ne kadar düşük gitmek istersin? Çok düşük, ancak hala fiziğin üstünde, bkz . İlk mikroişlemciler nasıl programlandı? Elektronik.
dmckee

2
Programlama mevcut işletim sistemi konseptinin icat edilmesinden önce yapılmıştır. Açıkçası, bu düzeyde bir şey işletim sistemini başlatan şeydir. İşletim sistemleri önyüklendi. Bu en azından CS 4 yıllık bir programda bir noktada belirtilir, çünkü çoğu işletim sistemi dersinin bilgisayar teorisini gerektirir.
Rig

Yanıtlar:


263

Önyükleme işleminde geçen pek çok web sitesi var (örneğin, Nasıl Bilgisayar Açılır ). Özetle, işletim sistemi işlemlerine başlayabilene kadar sistemi bir süre içinde biraz tutan, çok aşamalı bir süreçtir.

İşlemciyi çalıştırmaya çalışan anakart üzerindeki firmware ile başlar. Daha sonra diğer donanımı kurup çalıştıran mini bir işletim sistemi gibi olan BIOS'u yükler. Bu yapıldıktan sonra bir önyükleme aygıtı arar (disk, CD, vb.) Ve bir kez bulunursa, MBR'yi (ana önyükleme kaydı) bulur ve belleğe yükler ve yürütür. İşletim sisteminin (ya da işler daha karmaşık hale geldiğinden diğer önyükleme yükleyicileri) nasıl başlatılacağını ve başlatılacağını bilen bu küçük kod parçasıdır. İşte bu noktada çekirdek gibi şeyler yüklenir ve çalışmaya başlar.

İşe yaraması inanılmaz!


108
Son cümle için +1.
12'de CVn 9

39
"Önyükleme" denmesinin bir nedeni var; terim "bootstraps tarafından yukarı çekerek", "bootstrapping" için kısa.
KeithS

5
Birinin önyükleme kodunu tuşlaması veya geçiş yapması gerektiğine dair bir zaman vardı. Bazen ROM'daki bir programın ilk talimatına basit bir atlayış oldu. Diğer zamanlarda bir cihazdan okumak ve okunan verilerdeki ilk program komutuna atlamak koddu. Artık işler çok daha basit.
BillThor


15
@BillThor: “Çok daha basit” derken, elbette “çok daha karmaşık” anlamına gelir. Onlar sadece kullanımı daha basit .
Raphael Schweikert

173

Bir "çıplak metal" işletim sistemi hiçbir şey içerisinde çalışmaz . Fiziksel makine üzerinde ayarlanan tam talimatı çalıştırır ve sanal bellek destek donanımını kontrol edenler de dahil olmak üzere tüm fiziksel belleğe, tüm cihaz kaydına ve tüm ayrıcalıklı talimatlara erişebilir.

(İşletim sistemi sanal bir makinede çalışıyorsa, yukarıdakiyle aynı durumda olduğunu düşünebilir . Fark, bazı şeylerin taklit edildiği ya da hiper yönetici tarafından başka bir şekilde ele alındığı; yani sanal makineleri çalıştıran seviyedir. .)

Her neyse, işletim sistemi (örneğin) C de uygulanabilir olsa da, mevcut tüm normal C kütüphanelerine sahip olmayacaktır. Özellikle, normal 'stdio' kütüphanelerine sahip olmayacaktır. Aksine, disk bloklarını okumasını ve yazmasını sağlayan bir disk aygıtı sürücüsü uygular. Disk blok katmanının üstüne bir dosya sistemi uygulayacak ve bunun üzerine bir kullanıcı uygulamasının çalışma zamanı kitaplıklarının (örneğin) dosya oluşturmak, okumak ve yazmak için yaptığı çağrıları uygulayacaktır ...

Bir işletim sistemi olmadan bir uygulama nasıl çalışabilir?

Doğrudan G / Ç donanımıyla vb. Etkileşime girmeyi bilen özel bir uygulama (örneğin bir işletim sistemi) olması gerekir.

Bilgisayarda, çalıştırılması gereken bir işletim sistemi yoksa, bu komutları C çalıştırmasını ve bu komutları ekranda çalıştırmasını nasıl söylersiniz?

Sen değil.

Uygulama (C dilinde yazılan argüman uğruna), yerel bir kod görüntüsü vermek için derlenir ve diğer bazı makinelerde bağlanır. Ardından görüntü sabit sürücüye BIOS'un bulabileceği bir yere yazılır. BIOS, görüntüyü belleğe yükler ve uygulamanın giriş noktasına atlamak için bir talimat yürütür.

Tam kapsamlı bir işletim sistemi olmadığı sürece (genellikle) uygulamada "çalışan C ve yürütme komutları" yoktur. Ve bu durumda, gerçekleşmesi için gereken tüm altyapının uygulanması işletim sisteminin sorumluluğundadır. Sihir yok. Sadece bir sürü kod.

Bill'in cevabı , kapatılmış bir makineden normal işletim sisteminin çalıştığı bir makineye geçtiğiniz işlem olan önyüklemeyi kapsar . Ancak, BIOS görevlerini tamamladığında (tipik olarak) donanımın ana işletim sistemine tam kontrolünü verdiğini ve bir sonraki sistem yeniden başlatılıncaya kadar başka bir rol oynamadığını belirtmekte fayda vardır. Ana işletim sistemi kesinlikle geleneksel anlamda BIOS’u “içinde” kullanmıyor.

Bir UNIX çekirdeği ile ilgisi var mı? Eğer öyleyse, bir unix çekirdeği veya genel olarak bir çekirdek nedir?

Evet öyle.

UNIX çekirdeği, UNIX işletim sisteminin özüdür. Yukarıda açıklanan "çıplak metal" eşyalarının tümünü yapan UNIX'in bir parçasıdır.

Bir "çekirdek" düşüncesi, sistem yazılımını çekirdek nesnelere (fiziksel cihaz erişimi, tüm belleğe vb. Gerektiren) ve çekirdek olmayan şeylere ayırmaya çalışmanızdır. Çekirdek temel şeylerden oluşur.

Gerçekte, çekirdek / çekirdek ile çekirdek olmayan / çekirdek olmayan arasındaki ayrım bundan daha karmaşıktır. Ve gerçekten bir çekirdeğe ait olan ve olmayan olanlar hakkında çok fazla tartışma yapıldı. (Örneğin mikro çekirdeğe bakın.)


6
Olağanüstü cevap. Mümkünse size birkaç tane daha fazla oy verin.
weberc2

7
Burada çok iyi cevaplar var, bu yüzden bunu bir yorum olarak ekleyeceğim, çünkü şu ana kadar hiç kimse bundan söz etmedi. İşlemleri zamanlama ve işlemleri birbirlerinin davranışlarını değiştirmekten koruma yeteneği, genellikle yalnızca bir işletim sisteminde bulunan ve üretici yazılımı veya BIOS'ta bulunmayan özelliklerdir.
Sean Barbeau

2
The idea of a "kernel" is that you try to separate the system software into core stuffTerimin kernelAlman kökenli olduğunu, Kernçekirdek / çekirdek anlamına geldiğini hatırlamak kolaydır .
deed02392

1
Bu cevabı
sevdim

3
"Bundan kurtulmak PC kullanıcılarını daha az akıllı hale getirdi." - Daha az akıllı değil, daha az bilgisayar okur yazar. PC kullanıcılarının sayısını arttırdığını da söyleyebilirsin.
Stephen C

62

Başlangıçta CPU'da güç yoktu.

Ve Adam "güç olmasına izin ver" dedi ve CPU bellekte verilen bir adresten okumaya ve orada bulunan talimatı uygulamaya başladı. Sonra bir sonraki ve böylece gücün sonuna kadar devam eder.

Bu açılış oldu. Görevi, ana yazılımın bulunduğu ortama erişmek ve başka bir yazılımı yüklemek için başka bir yazılım yüklemektı.

Son olarak, dost canlısı bir ekran sizi oturum açmaya davet etti.


58
Bu cevap christianity.stackexchange.com
adresine

6
"verilen adres" nedir, nereden geliyor? Charles Darwin'i burada oynadığım için özür dilerim.
Midhat

7
@Midhat - İşlemci tarafından alınacak ilk adres, içine bağlanır. Genellikle 0'dır.
mouviciel 24:12

17
... Ve 7. günde, Adam oyunlarıyla dinlendi
Kanadalı Luke

9
@mouviciel Hafızadaki adres uyumlu 0x7C00herhangi bir x86mimari için ve ilk önce tercih ettiği herhangi bir önyüklenebilir cihazın ilk sektörünü yükleyen BIOS tarafından doldurulmalı ... Güzel cevap olsa da: -7
Tobias Kienzler

29

Geciktiğim için üzgünüm ama bunu şöyle tarif edeceğim:

  • Anakart güç alır.

  • Zamanlama devreleri, yalnızca elektriksel özelliklerine bağlı olarak, gerekirse çalışır ve dengelenir. Bazı yeni cihazlar gerçekte çok sınırlı bir mikroişlemci veya sıralayıcı kullanabilir.

    "Zamanlama devreleri başlar ve gerektiğinde dengelenir" gibi şeylerin birçoğu artık donanımda gerçekleşmez. Bu çalışmanın muazzam bir miktarı aslında çok sınırlı alt işlemcilerde / sıralayıcılarda çalışan son derece özel bir yazılımdır.

    - jkerian , 25 Ekim’de saat 05 : 20’de

  • CPU ve RAM'e güç verilir.

  • CPU (dahili kablolama temelinde) BIOS'tan veri yükler. Bazı makinelerde, BIOS RAM'e yansıtılabilir ve daha sonra oradan çalıştırılabilir ancak bu nadir görülen IIRC'dir.

    Açıldığında, x86 uyumlu CPU'lar adres alanındaki 0xFFFFFFF0 adresinden başlar ...

    -Micheal Steil, 17 Hatalı Xbox Güvenlik Sisteminde Microsoft Yapılan Hatalar ( arşiv )

  • BIOS, anakart tarafından disk ve diğer donanım IO'ları için kullanılan donanım portlarını ve adreslerini çağırır ve diskleri döndürür, diğerlerinin yanı sıra RAM'in geri kalanını çalıştırır.

  • BIOS kodu (donanımda depolanan CMOS ayarları aracılığıyla), her diskin önyükleme kesimini, CMOS tarafından belirtilen sırada veya bir menü ile geçersiz kılmak için okumak için düşük seviye IDE veya SATA komutları kullanır.

  • Bir önyükleme sektörüne sahip ilk disk önyükleme sektörünü çalıştırır. Bu önyükleme sektörü, diskten daha fazla veri yükleme NTLDR, daha büyük , daha sonraki aşamaları GRUBvb. Yükleme talimatlarını içeren Montajdır .

  • Son olarak, işletim sistemi makine kodu, bir ön yükleme sektörünü alternatif veya ofset bir yerden yükleme zincir yükleme yoluyla doğrudan veya dolaylı olarak önyükleyici tarafından yürütülür.

Daha sonra dostça bir çekirdek paniği, boğulmuş bir penguen elde edersiniz veya diskiniz kafa çarpması nedeniyle durur. =) Alternatif senaryoda, çekirdeğiniz işlem tablolarını, bellek içi yapılarını kurar ve diskleri, sürücüleri, modülleri ve bir GUI'yi veya bir hizmet kümesini (bir sunucudaysa) yükler. Ardından, başlıkları okundukça programlar yürütülür ve derlemeleri hafızaya alınır ve buna göre eşlenir.


2
"Zamanlama devreleri başlar ve gerektiğinde dengelenir" gibi şeylerin birçoğunun artık donanımda olmadığına dikkat edilmelidir. Bu çalışmanın muazzam bir miktarı aslında çok sınırlı alt işlemcilerde / sıralayıcılarda çalışan son derece özel bir yazılımdır. - Dostça bir semt üretici yazılımı mühendisi
jkerian

@jkerian Yorumunuzu gönderime yazmamın sakıncası var mı?
ζ--

heh, hiç de değil.
jkerian

BIOS bir işletim sistemi değil . BIOS Basic Input / Output System ifadesinin kısaltmasıdır ve bu olduğunu BIOS ne yaptığını. Programcıların üreticilerin sağladığı sürücülerle düşük seviyeli kaynakları kullanmalarını sağlar. İşletim Sistemi Korumalı (32bit) veya Uzun (64bit) moduna girdiğinde, BIOS artık kullanılamaz ve işletim sistemi temelde BIOS'un "düşük" seviyelerde sağlanan işlevselliğini değiştiren kendi sürücülerini kullanır. Modern işletim sistemleri, örneğin Linux ve Windows, BIOS'u yalnızca kullanılabilir RAM bölümlerini tespit etmek ve gerekli sürücüleri yükleyebilecek daha gelişmiş yükleyicilerini yüklemek için kullanır.
Hannes Karppila

1
@HannesKarppila Güncelleme; Bu şu anda yaklaşık dört yaşında ve bu sitede artık aktif değilim.
Feb--

15

Çok iyi cevap var ama şunu eklemek istedim: Bir Python arkaplanından geldiğinizi söylemiştiniz. Python, yorumlanmış (veya "birbirine karışmış" veya en azından tipik CPython kullanım durumlarında) bir dildir. Bu, kaynağa bakarak ve bir şekilde çalıştıran başka bir yazılıma (Python yorumlayıcısı) sahip olduğunuz anlamına gelir. Bu iyi bir model ve gerçek donanımdan soyutlanmış oldukça iyi seviyeli dillere izin veriyor. Dezavantajı her zaman önce bu tercüman yazılımı gerekir.

Bu tercüman yazılımı tipik olarak, makine kodunu derleyen bir dilde, örneğin C veya C ++ dilinde yazılmıştır. Makine kodu, CPU'nun kaldırabileceği şeydir. Bir CPU'nun yapabileceği şey bellekten bazı baytları okumaktır ve bayt değerlerine bağlı olarak belirli bir işlemi başlatır. Bu yüzden bir bayt dizisi, bazı verileri bellekten bir sicile, bir diğeri iki değer eklemek için bir diziyi, diğerini bir sicilden bir sicilden ana belleğe ve kısa bir süre sonra saklamak için bir komuttur (bir sicil parçası olan özel bir bellek alanıdır). En iyi çalışabileceği cpu)), bu komutların çoğu bu seviyede oldukça düşük. Bu makine kodu talimatlarının okunabileceği insan montajcı kodudur. Bu makine kodu, temel olarak, Windows'taki .exe veya.com dosyalarında veya Linux / Unix ikili dosyalarında depolanan şeydir.

Şimdi bir bilgisayar başlatıldığında, aptal, böyle bir makine kodu talimatlarını okuyacak olsa da, bazı kablolama vardır. Bir PC'de bu genellikle (şu anda) anakartta BIOS (temel giriş çıkış sistemi) içeren bir EEPROM yongasıdır, bu sistem fazla bir şey yapamaz, bazı donanıma vb. Erişimi kolaylaştırabilir ve daha sonra önemli bir işlem yapabilir: önyükleme yapın ve ilk birkaç baytı (yani ana önyükleme kaydı, MBR) belleğe kopyalayın ve daha sonra CPU'ya "burada, programınız var" ifadesini kullanır, ardından CPU bu baytları makine kodu olarak ele alır ve çalıştırır. Genelde bu, çekirdeği bazı parametrelerle yükleyecek ve ardından kontrolü bu çekirdeğe devredecek olan işletim sistemi yükleyicisidir, bu durumda tüm donanıma tüm donanıma erişmek, biraz masaüstü veya kabuk programı yüklemek veya kullanıcının girişini yapması için izin verir sistemi kullan.


6
"interpiled"? Bu terimi daha önce hiç duymamıştım.
Bryan Oakley

3
Bu terim, idamdan ayrı, ayrı bir derleme aşamasına sahip olan “modern” tercümanları tanımlamak için 5 yıl kadar önce kullanıldı. Bu terim herhangi bir yerde sağ kaldıysa hiçbir fikrim yok ;-)
johannes

1
"ninterpreted"? Bu terimi daha önce hiç duymamıştım.
Cole Johnson

12

"Bir işletim sistemi olmadan bir uygulama nasıl çalışabilir" sorusunu sorabilirsiniz. Kolay cevap "bir işletim sistemi bir uygulama değildir" dir. Bir işletim sistemi bir uygulama ile aynı araçlarla oluşturulabilir ve aynı hammaddeden yapılmış olsa da, aynı şeyler değildir. Bir işletim sistemi bir uygulama ile aynı kurallara göre oynamak zorunda değildir.

OTOH, asıl donanım ve bellenimi, OS "uygulamasının" çalıştığı "OS" olarak düşünebilirsiniz. Donanım çok basit bir işletim sistemidir - makine kodunda yazılı talimatların nasıl çalıştırılacağını bilir ve çalışmaya başladığında ilk talimatı için çok özel bir hafıza adresine bakması gerektiğini bilir. Böylece başlar ve ardından hemen bu ilk talimatı çalıştırır, ardından ikincisi vb.

Dolayısıyla, işletim sistemi basitçe bilinen bir yerde bulunan ve donanım ile doğrudan etkileşime girebilen bir makine kodudur.


1
+1 Bunun en iyi cevap olduğunu düşünüyorum. Soyutlamalar açısından bence onu doğru seviyelere çekiyorsun.
Preet Sangha,

6

Sorunuza cevap, yerel (CPU için) kodun nasıl göründüğü ve CPU tarafından nasıl yorumlandığı bilgisini gerektirir.

Genellikle tüm derleme işlemi C, Pascal ve hatta Python (pypy kullanarak) ve C # ile yazdığınız şeyleri CPU'nun anladığı şeylere, yani "[hafıza adresi] altında bir şey sakla" gibi basit talimatların kayıtlar altında saklanan sayıları eklemek anlamına gelir. ve ebx "," foo işlevini çağır "," eax ile 10 "i karşılaştır. Tek tek yürütülen bu talimatlar, kodunuzla yapmak istediğiniz şeyleri yapar.

Şimdi şunu düşünün: bu yerel kodu çalıştırmak için gerçekten bir işletim sistemine ihtiyacınız yok! İhtiyacınız olan tek şey bu kodu belleğe yüklemek ve CPU'ya orada olduğunu ve yürütülmesini istediğinizi söylemek. Bununla birlikte, fazla endişelenme. BIOS'un endişelenmesi gereken iş bu - 0x7C00 fiziksel adresi altında, CPU başladıktan hemen sonra kodunuzu (sadece bir ve bir sektör) yüklüyor. Ardından CPU, kodunuzun bu bölümünü (512 B) çalıştırmaya başlar. Ve hayal ettiğin her şeyi yapabilirsin! Tabii ki, işletim sistemi herhangi bir destek olmadan. Çünkü SİZ işletim sistemi sizsiniz. Havalı değil mi? Standart kütüphane yok, destek yok, python yok, program yok, sürücü yok! Her şeyi kendin yazmalısın.

Ve donanım ile nasıl iletişim kurarsınız? İki seçeneğin var:

  1. "Gerçek Mod" un içinde kalırsınız - yalnızca 1 MB bellek (ve hatta daha az) olan CPU yürütme modu, CPU uzantıları, bellek koruması, çoklu görev; 16 bitlik çalıştırılabilir kod, eski adresleme modu ... Ancak BIOS tarafından sağlanan, basit ekran çıktısı, klavye desteği, disk G / Ç ve güç yönetimi gibi bazı rutinlerle. Tek kelimeyle, MS-DOS ve 16-bit CPU'ların zamanlarında geri dönersiniz.
  2. İşlemcinizin sahip olduğu tüm özelliklerle, kurduğunuz tüm belleklerle "Korumalı Mod" a girersiniz. Fakat Korumalı Mod'da tamamen yalnızsınız ve HER ŞEYİ kendiniz yapmak zorundasınız (ve donanımları G / Ç bağlantı noktalarına giriş / çıkış verileri vermek ve kesmeleri kullanmak için "giriş" ve "çıkış" komutlarını kullanarak iletişim kuruyorsunuz. /Ö). Windows 95 ve ilk Linux bu seçeneği seçtiğinden beri her işletim sistemini söylemek zorunda mıyım?

Şimdi çekirdeğin ne olduğunu soruyorsun. Kısacası, çekirdek doğrudan görmediğiniz ve deneyimlemediğiniz her şeydir. Sürücülerle birlikte, klavyenizden başlayarak PC'nizdeki hemen hemen her donanıma kadar her şeyi yönetir. Grafiksel kabuk veya terminal ile iletişim kurarsınız. Veya, kodunuzun içindeki işlevler sayesinde, Neyse ki, işletim sistemi desteği ile yürütülmektedir.

Daha iyi anlaşılması için size bir tavsiye verebilirim: kendi işletim sisteminizi yazmaya çalışın. Ekranda "Merhaba dünya" yazsa bile.


3

Bir işletim sisteminin nasıl işlediğine ve son derece sisteme bağlı bazı farklılıklar vardır. Yararlı olması için, sistemin "X adresinde çalıştırmaya başla" gibi başlangıçta bazı öngörülebilir davranışlara sahip olması gerekir. Uçucu olmayan depolama alanlarının (Flash bellek gibi) program alanlarına eşlendiği sistemler için bu oldukça kolaydır, çünkü başlangıç ​​kodunu işlemcinin program alanı içinde doğru yere koyduğunuzdan emin olun. Bu mikrodenetleyiciler için oldukça yaygındır. Bazı sistemlerin çalıştırma programlarını çalıştırmadan önce başka bir yerden alması gerekir. Bu sistemler bazı operasyonların kendilerine sabitlenmiş (veya neredeyse sabitlenmiş) olmasını sağlayacaktır. Başlangıç ​​kodlarını i2c ile başka bir yongadan alan bazı işlemciler var,

X86 işlemci ailesini kullanan sistemler, genellikle evrimi ve geriye dönük uyumluluk sorunları nedeniyle oldukça karmaşık olan çok aşamalı bir önyükleme işlemi kullanır. Sistem, anakart üzerindeki bazı geçici olmayan bellekte bulunan bazı bellenimi (BIOS - Temel Giriş / Çıkış Sistemi veya benzeri olarak adlandırılır) çalıştırır. Bazen bu bellenimin bir kısmı veya tamamı daha hızlı çalışmasını sağlamak için RAM'e kopyalanır (yerleştirilir). Bu kod, hangi donanımın mevcut olacağı ve önyükleme için kullanılabilir olduğu bilgisi ile yazılmıştır.

Devreye alma yazılımı genellikle sistemde hangi donanımın bulunacağına ilişkin varsayımlarla yazılır. Yıllar önce, bir 286 makinede, muhtemelen, G / Ç adresinde X disket sürücü denetleyicisi olacağı ve belirli bir komut kümesi (ve sektör 0'daki kod verildiğinde, kesim 0) belirli bir bellek konumuna yükleneceği varsayımı olurdu. BIOS'un kendi işlevlerini daha fazla kod yüklemek için kullanmayı ve sonunda bir işletim sistemi olması için yeterli kodu yüklendiğini bilir). Bir mikro denetleyicide, önyükleme işlemine devam etmeden önce, belirli ayarlarla çalışan (daha karmaşık bellenimi güncellemek için) komutları beklemesi gereken belirli ayarlarla çalışan bir seri port olduğu varsayılabilir.

Belirli bir sistemin tam başlatma süreci sizin için farklı sistemlere göre farklılık gösterdiğini bilmek kadar önemli değil, aynı zamanda hepsinin ortak şeyleri olduğunu bilmek kadar önemlidir. Genellikle G / Ç yapılması gerektiğinde başlatma (ön yükleme) kodu dahilinde G / Ç aygıtları kesintilere dayanmak yerine sorgulanır. Bunun nedeni, kesintilerin karmaşık olması, yığın RAM'in (henüz tam olarak kurulmamış olabilir) kullanılması ve tek işlem olduğunuzda diğer işlemleri engelleme konusunda endişelenmenize gerek kalmamasıdır.

İlk yüklendikten sonra işletim sistemi çekirdeği (çekirdek çoğu işletim sisteminin ana kısmıdır) başlangıçta ürün yazılımı gibi davranacaktır. Var olan donanım bilgisi veya keşfedilmesi, biraz RAM'in yığın-alan olarak ayarlanması, çeşitli testler yapılması, çeşitli veri yapıları kurulması, muhtemelen bir dosya sistemi keşfedip monte edilmesi ve muhtemelen daha fazla olan bir program başlatması gerekir. Yazmaya alışkın olduğunuz programlar gibi (bir işletim sisteminin var olmasına dayanan bir program).

OS kodu genellikle bir C ve montaj karışımı ile yazılmıştır. İşletim sistemi çekirdeği için ilk kod muhtemelen her zaman montajdadır ve yığını ayarlamak, C kodunun dayandığı ve sonra da bir C işlevi çağıran gibi şeyler yapar. Diğer el ile yazılmış montaj da orada olacak, çünkü bir işletim sisteminin yapması gereken bazı işlemler genellikle C ile ifade edilemez (içerik değiştirme / değiştirme yığınları gibi). Çoğu C programının kullandığı standart kütüphanelere güvenmemesi ve bir C'nin olmasını beklememesi için C derleyicisine sık sık özel bayraklar gönderilmelidir.int main(int argc, char *argv[])programda. Ayrıca, çoğu uygulama programcısının kullanmadığı özel bağlayıcı seçenekleri kullanılmalıdır. Bunlar, çekirdek programın belirli bir adrese yüklenmesini bekleyebilir veya bu değişkenler herhangi bir C kodunda asla belirtilmemiş olsa bile, belirli konumlarda dış değişkenler gibi görünecek şeyler ayarlayabilir (bu, eşlenen G / Ç belleği için yararlıdır). diğer özel hafıza konumları).

Tüm operasyon ilk başta sihir gibi gözüküyor, ancak siz onu inceledikten ve bölümlerini anladıktan sonra sihir, uygulanması gereken çok daha fazla planlama ve sistem bilgisi gerektiren bir dizi program haline geliyor. Onları ayıklamak olsa da, sihir alır.


3

İşletim sistemlerinin nasıl çalıştığını anlamak için, bunları iki kategoriye ayırmak yararlı olabilir: istek üzerine uygulamalara basitçe hizmet verenler ve uygulamaların yapmaması gereken şeyleri yapmalarını önlemek için CPU'da donanım özelliklerini kullananlar. MS-DOS, eski stilde idi; 3.0'dan bu yana tüm Windows sürümleri en son stildir (en azından 8086'dan daha güçlü bir şey çalıştırırken).

PC-DOS veya MS-DOS çalıştıran orijinal IBM PC, eski işletim sistemi "OS" nin bir örneği olabilirdi. Bir uygulama ekranda karakter göstermek isterse, bunu yapmanın birkaç yolu olabilirdi. MS-DOS'u "standart çıktıya" göndermesini rutin olarak adlandırabilir. Bunu yaparsa, MS-DOS çıktının yeniden yönlendirilip yönlendirilmediğini kontrol eder ve olmasa da, ROM'da depolanan bir rutini (IBM Temel Giriş / Çıkış Sistemi olarak adlandırılan rutin bir koleksiyonunda) arayacaktı. imleci konumlandırın ve imleci hareket ettirin ("teletype yazın"). Bu BIOS rutini daha sonra 0xB800: 0 ila 0xB800: 3999 aralığında bir yerde bir çift bayt depolar; Renkli Grafik Adaptöründeki donanım, sürekli olarak bu aralıktaki bayt çiftlerini alır. Bir karakter şekli seçmek için her çiftin ilk baytını, ikincisi ise ön plan ve arka plan renklerini seçmek için kullanılır. Baytlar okunaklı ve okunaklı bir metin görüntüsü veren bir sırada kırmızı, yeşil ve mavi sinyaller halinde işlenir.

IBM PC'deki programlar, DOS'u "standart çıktı" yordamını kullanarak veya BIOS'u "teletype yazma" yordamını kullanarak veya doğrudan belleği görüntülemek için saklayarak metni görüntüleyebilir. Çok sayıda metni görüntülemek için gereken birçok program, ikinci bir yaklaşımı seçti, çünkü tam olarak DOS rutinlerini kullanmak kadar yüzlerce kez olabilir. Bunun nedeni, DOS ve BIOS yordamlarının istisnai olarak verimsiz olması; Ekran boş bırakılmadığı sürece, sadece belirli zamanlarda yazılabilir. Bir karakter çıktısı almak için kullanılan BIOS yordamı herhangi bir zamanda çağrılabilecek şekilde tasarlanmıştır; bu nedenle, her bir istek, bir yazma işlemi gerçekleştirmek için doğru zamanı bekleyerek yeniden başlamak zorunda kalmıştır. Buna karşılık, ne yapılması gerektiğini bilen uygulama kodu, ekranı yazmak için mevcut fırsatlar etrafında kendisini düzenleyebilir.

Buradaki kilit nokta, DOS ve BIOS, ekrana metin çıktısı almak için bir araç sağlarken, bu yetenekler hakkında özellikle "büyülü" bir şey olmadığıdır. Ekrana metin yazmak isteyen bir uygulama, en azından ekran donanımı, uygulamanın beklendiği şekilde çalıştığında (birisi CGA'ya benzeyen ancak karakter belleğine sahip bir Monokrom Ekran Adaptörü takmışsa) etkili bir şekilde yapabilirdi. 0xB000: 0000-0xB000: 3999'da bulunur), BIOS otomatik olarak oradaki karakterleri çıkarır; MDA veya CGA ile çalışmak üzere programlanan bir uygulama da bunu yapabilirdi, ancak sadece CGA için programlanan bir uygulama MDA'da tamamen yararsız olurdu).

Yeni sistemlerde, işler biraz farklıdır. İşlemciler çeşitli "ayrıcalık" modlarına sahiptir. Kodun istediği her şeyi yapmasına izin verilen en ayrıcalıklı modda başlarlar. Daha sonra sadece seçilen bellek aralıklarının veya I / O imkanlarının bulunduğu sınırlı bir moda geçebilirler. Kod doğrudan kısıtlı moddan ayrıcalık moduna geçemez, ancak işlemci ayrıcalıklı mod giriş noktaları tanımlamıştır ve kısıtlı mod kod işlemciden ayrıcalıklı modda bu giriş noktalarından birinde kod çalıştırmasını isteyebilir. Ek olarak, kısıtlı modda yasaklanabilecek birkaç işlemle ilgili ayrıcalıklı mod giriş noktaları vardır. Örneğin, birinin aynı anda birden fazla MS-DOS uygulamasını çalıştırmak istediğini ve her birinin kendi ekranına sahip olduğunu varsayalım. Uygulamalar doğrudan ekran denetleyicisine 0xB800: 0 yazabiliyorsa, bir uygulamanın başka bir uygulamanın ekranının üzerine yazmasını engellemenin yolu yoktur. Öte yandan, bir işletim sistemi uygulamayı kısıtlı modda çalıştırabilir ve ekran belleğine yapılan tüm erişimleri yakalayabilir; eğer "arka planda" olması gereken bir uygulamanın 0xB800: 160 yazmaya çalıştığını keşfetmişse, verileri arka plan uygulama ekran tamponu olarak bir kenara koyduğu bir hafızaya kaydedebilirdi. Bu uygulama daha sonra ön plana geçirilirse, arabellek gerçek ekrana kopyalanabilir. bir işletim sistemi uygulamayı kısıtlı modda çalıştırabilir ve ekran belleğine yapılan tüm erişimleri engelleyebilir; eğer "arka planda" olması gereken bir uygulamanın 0xB800: 160 yazmaya çalıştığını keşfetmişse, verileri arka plan uygulama ekran tamponu olarak bir kenara koyduğu bir hafızaya kaydedebilirdi. Bu uygulama daha sonra ön plana geçirilirse, arabellek gerçek ekrana kopyalanabilir. bir işletim sistemi uygulamayı kısıtlı modda çalıştırabilir ve ekran belleğine yapılan tüm erişimleri engelleyebilir; eğer "arka planda" olması gereken bir uygulamanın 0xB800: 160 yazmaya çalıştığını keşfetmişse, verileri arka plan uygulama ekran tamponu olarak bir kenara koyduğu bir hafızaya kaydedebilirdi. Bu uygulama daha sonra ön plana geçirilirse, arabellek gerçek ekrana kopyalanabilir.

Dikkat edilmesi gereken önemli noktalar şunlardır: (1), metin görüntüleme gibi çeşitli standart hizmetleri gerçekleştirmek için standart bir yordam kümesi olması genellikle kullanışlı olsa da, "ayrıcalıklı modda" çalışan bir uygulamanın yapamayacağı hiçbir şey yapmazlar. kurulan donanım ile ilgilenmek için uygun şekilde programlanmışsa; (2) Bugün çalışan çoğu uygulamanın işletim sistemi tarafından doğrudan böyle bir G / Ç yapması engellense de, ayrıcalıklı modda başlayan bir program ne isterse yapar ve kısıtlı mod için istediği kuralları kurabilir programları.


2

Stephen C.'in dediği gibi, sadece İşletim Sistemini başlatmakla ilgili değil, aynı zamanda nasıl çalıştığıyla, donanımla ve üstündeki yazılımla etkileşimi de var.

Ben sadece cevabını ekleyeceğim, "Bilgi İşlem Sistemlerinin Elemanları" na bakmak isteyebilirsiniz . Bir bilgisayarın, işletim sisteminin ve derleyicilerin nasıl etkileşimde bulunduğunu açıklayan bir kitap ve bazı araçlar. Bu konuda benzersiz olan şey, kendi işletim sisteminizi simüle edilmiş bir ortamda çok hızlı bir şekilde geliştirmek, gerçek bir tane için gerekli olan pek çok ayrıntıyı göz ardı etmek ve böylece kavramları kavrayabilmeniz için araçlar sağlamasıdır . Ağaçlar yerine ormanı görmenize izin vermek harika bir iş çıkarır.

İşletim Sisteminin donanım ile nasıl etkileşime girdiğiyle ilgili daha fazla ayrıntıya girmek istiyorsanız, Minix'i inceleyin .


1

Bir işletim sistemi yazıyorsunuz. Bir şekilde çalıştırılması gerekiyor ve bu yol başka bir işletim sistemi içinde mi?

Uygulamanız bir işletim sistemi içinde çalışıyor. Bu İşletim Sistemi, uygulamanıza, bir dosyayı açmak ve ona bayt yazmak gibi hizmetler sunar. Bu hizmetler genellikle sistem çağrıları yoluyla sağlanır.

İşletim Sistemi donanım içinde çalışıyor. Donanım, İşletim Sistemine seri bağlantı noktasının baud hızını ayarlama ve ona bayt yazma gibi hizmetler sunar. Bu hizmetler genellikle bellek eşlemeli kayıtlar veya G / Ç portları aracılığıyla sağlanır.


Bunun nasıl çalıştığına dair çok basitleştirilmiş bir örnek vermek için:

Uygulamanız işletim sisteminden bir dosyaya bir şeyler yazmasını söyler. Uygulamanıza, işletim sistemi dosya ve dizin gibi kavramlar sunar.

Donanımda bu kavramlar mevcut değildir. Donanım, 512 baytlık sabit bloklara bölünmüş diskler gibi kavramlar sağlar. İşletim sistemi, dosyanız için hangi blokların kullanılacağına ve dosya adı, boyutu ve diskteki konum gibi meta veriler için diğer bazı blokların seçilmesine karar verir. Ardından donanıma şunu söyler: bu numara ile sektöre bu 512 baytı, bu numaraya sahip diske yazın; bu diğer 512 baytları, aynı sayıdaki diske bu farklı numara ile sektöre yazın; ve bunun gibi.

İşletim sisteminin donanıma yapma şeklini çok çeşitlidir. Bir işletim sisteminin işlevlerinden biri uygulamaları bu farklılıklardan korumaktır. Disk örneği için, bir donanım türünde, işletim sistemi diski ve sektör numarasını bir G / Ç bağlantı noktasına yazmalı ve ardından baytları ayrı ayrı bir G / Ç bağlantı noktasına yazmalıdır. Başka tür bir donanımda, işletim sistemi bir sektörün 512 baytını bir bellek alanına kopyalamak, o bellek alanının konumunu özel bir bellek konumuna yazmak ve disk ve sektör numaralarını bir başkasına yazmak zorunda kalır. özel hafıza yeri.


Günümüzün ileri teknoloji donanımı son derece karmaşık. Tüm programlama detaylarını veren kılavuzlar binlerce sayfalık kapıcıdır; örneğin, en son Intel CPU kılavuzu yedi birimdir ve toplam 4000 sayfadan fazladır - bu yalnızca CPU içindir. Diğer birçok bileşen, işletim sisteminin CPU'ya adres alanı içindeki adreslerle eşleşmesini söyleyebileceği bellek blokları veya I / O portları gösterir. Bu bileşenlerin birkaçı, birkaç G / Ç bağlantı noktasının veya bellek adresinin arkasına daha da fazla şey gösterir; bir örnek olarak, RTC (bilgisayarın kapalıyken zamanını koruyan bileşen olan Gerçek Zamanlı Saat), bir çift G / Ç bağlantı noktasının arkasına birkaç yüz bayt bellek gösterir ve bu, çok eski bir bileşendir. orijinal PC / AT. Sabit diskler gibi şeyler tamamen ayrı işlemcilere sahiptir, işletim sisteminin standartlaştırılmış komutlar aracılığıyla konuşabildiği. GPU'lar daha da karmaşık.

Yukarıdaki yorumlardaki birkaç kişi Arduino'yu önerdi. Onlarla aynı fikirdeyim, anlaşılması çok daha kolay - Arduino Uno'da USB konektörünü seri port olarak göstermek dışında her şeyi yapan ATmega328'in sadece birkaç yüz sayfalık bir el kitabı var. Arduino'da, aralarında işletim sistemi olmayan, doğrudan donanıma koşarsınız; istemiyorsanız kullanmak zorunda olmadığınız birkaç küçük kütüphane rutini.


1

Runnable örnekler

Teknik olarak, işletim sistemi olmadan çalışan bir program bir işletim sistemidir. Öyleyse, minicik bir merhaba dünya işletim sistemi oluşturmayı ve çalıştırmayı görelim.

Aşağıdaki tüm örneklerin kodu bu GitHub deposunda bulunmaktadır .

Önyükleme sektörü

X86'da yapabileceğiniz en basit ve en düşük düzey şey , bir önyükleme sektörü türü olan bir Ana Önyükleme Sektörü (MBR) oluşturmak ve ardından bir diske yüklemek.

Burada tek bir printfçağrı ile bir tane yaratıyoruz :

printf '\364%509s\125\252' > main.img
sudo apt-get install qemu-system-x86
qemu-system-x86_64 -hda main.img

Sonuç:

görüntü tanımını buraya girin

Ubuntu 18.04, QEMU 2.11.1'de test edilmiştir.

main.img aşağıdakileri içerir:

  • \364octal == 0xf4hex içinde: bir hltkomutun işlemesi, CPU'ya çalışmayı durdurmasını söyler.

    Bu nedenle programımız hiçbir şey yapmaz: sadece başla ve dur.

    Sekizlik kullanıyoruz çünkü \xonaltılık sayılar POSIX tarafından belirtilmemiştir.

    Bu kodlamayı kolayca şu şekilde alabiliriz:

    echo hlt > a.asm
    nasm -f bin a.asm
    hd a
    

    ancak 0xf4kodlama aynı zamanda elbette Intel el kitabında da belgelenmiştir.

  • %509s509 boşluk üret. 510 bayta kadar dosyayı doldurmanız gerekiyor.

  • \125\252octal == 0x55ardından 0xaa: donanım tarafından istenen sihirli bayt. 511 ve 512 bayt olması gerekir.

    Eğer mevcut değilse, donanım bunu önyüklenebilir bir disk olarak kabul etmeyecektir.

Hiçbir şey yapmadan bile, ekrana birkaç karakter basıldığını unutmayın. Bunlar üretici yazılımı tarafından basılır ve sistemi tanımlamaya yarar.

Gerçek donanımda çalıştır

Emülatörler eğlencelidir, ancak donanım asıl meseledir.

Ancak bunun tehlikeli olduğunu ve diskinizi yanlışlıkla silebileceğinizi unutmayın: bunu yalnızca kritik veriler içermeyen eski makinelerde yapın! Daha da iyisi, Raspberry Pi gibi devboard'lar aşağıdaki ARM örneğine bakın.

Tipik bir dizüstü bilgisayar için, şöyle bir şey yapmalısınız:

  • Resmi bir USB çubuğuna yazın (verilerinizi mahveder!):

    sudo dd if=main.img of=/dev/sdX
    
  • USB'yi bir bilgisayara takın

  • aç onu

  • USB'den başlatmasını söyle.

    Bu, bellenimin sabit diskten önce USB'yi seçmesini sağlar.

    Makinenizin varsayılan davranışı bu değilse, USB'den önyüklemeyi seçebileceğiniz bir önyükleme menüsü alana kadar Enter, F12, ESC veya bu tür tuhaf tuşlara basmaya devam edin.

    Bu menülerdeki arama sırasını yapılandırmak genellikle mümkündür.

Örneğin, eski Lenovo Thinkpad T430, UEFI BIOS 1.16'da şunu görebilirim:

Selam Dünya

Şimdi minimal bir program yaptıktan sonra, merhaba dünyasına geçelim.

Açıkça soru şudur: IO nasıl yapılır? Birkaç seçenek:

  • bizim için donanım yazılımı, örneğin BIOS veya UEFI isteyin
  • VGA: Yazıldığında ekrana yazdırılan özel bellek bölgesi. Korumalı modda kullanılabilir.
  • Bir sürücü yazın ve doğrudan ekran donanımıyla konuşun. Bunu yapmanın "uygun" yolu budur: daha güçlü ama daha karmaşık.
  • seri port . Bu, ana bilgisayar terminalinden karakterleri gönderen ve alan çok basit bir standarttır.

    Kaynak .

    Maalesef çoğu modern dizüstü bilgisayarda bulunmuyor, ancak geliştirme kartlarına gitmenin ortak yolu, aşağıdaki ARM örneklerine bakın.

    Bu gerçekten bir utançtır, çünkü bu tür arayüzler örneğin Linux çekirdeğini hata ayıklamak için gerçekten yararlıdır .

  • çiplerin hata ayıklama özelliklerini kullanın. ARM , örneğin onların yarı-temelini çağırıyor . Gerçek donanımda, bazı ek donanım ve yazılım desteği gerektirir, ancak öykünücüler için ücretsiz uygun bir seçenek olabilir. Örnek .

Burada x86'da daha basit olduğu için bir BIOS örneği yapacağız. Ancak bunun en sağlam yöntem olmadığını unutmayın.

main.S

.code16
    mov $msg, %si
    mov $0x0e, %ah
loop:
    lodsb
    or %al, %al
    jz halt
    int $0x10
    jmp loop
halt:
    hlt
msg:
    .asciz "hello world"

link.ld

SECTIONS
{
    . = 0x7c00;
    .text :
    {
        __start = .;
        *(.text)
        . = 0x1FE;
        SHORT(0xAA55)
    }
}

Montaj ve bağlantı:

gcc -c -g -o main.o main.S
ld --oformat binary -o main.img -T linker.ld main.o

Sonuç:

görüntü tanımını buraya girin

Test edildi: Lenovo Thinkpad T430, UEFI BIOS 1.16. Bir Ubuntu 18.04 ana bilgisayarında oluşturulan disk.

Standart kullanıcı montaj talimatlarının yanı sıra aşağıdakilere de sahibiz:

  • .code16: GAS'a 16 bitlik kod vermesini söyler

  • cli: yazılım kesintilerini devre dışı bırakın. Bunlar işlemciden sonra işlemcinin tekrar çalışmaya başlamasına neden olabilir.hlt

  • int $0x10: bir BIOS araması yapar. Karakterleri tek tek basan şey budur.

Önemli link bayrakları:

  • --oformat binary: Çıktı ham ikili derleme kodu, normal kullanıcı çalıştırılabilir dosyaları için olduğu gibi bir ELF dosyası içinde çözmeyin.

Montaj yerine C kullanın

C derleme için derlendiğinden, standart kitaplık olmadan C'yi kullanmak oldukça basittir, sadece yapmanız gereken:

  • şeyleri doğru yere hafızaya koymak için bir linker betiği
  • GCC'ye standart kütüphaneyi kullanmamasını söyleyen bayraklar
  • mainÖzellikle gereken C durumunu belirleyen küçük bir montaj giriş noktası :
    • yığın
    • BSS’yi sıfırlamak

TODO: GitHub’da bazı x86 örnekleri. İşte benim oluşturduğum bir ARM .

Ancak standart kütüphaneyi kullanmak istiyorsanız işler daha eğlenceli hale gelir, çünkü Linux çekirdeğine sahip değiliz, bu da POSIX aracılığıyla C standart kütüphane işlevlerinin çoğunu uygular .

Linux gibi tamamen gelişmiş bir işletim sistemine gitmeden birkaç olasılık:

KOL

ARM'de genel fikirler aynıdır. Yükledim:

Ahududu Pi için, https://github.com/dwelch67/raspberrypi bugün mevcut olan en popüler öğretici gibi gözüküyor.

X86'dan bazı farklılıklar şunlardır:

  • IO doğrudan sihirli adreslere yazarak yapılıyor, orada hiçbir inve outtalimatları.

    Buna hafıza eşlenmiş IO denir .

  • Raspberry Pi gibi bazı gerçek donanımlar için bellenimi (BIOS) kendiniz de disk görüntüsüne ekleyebilirsiniz.

    Bu, bellenimin güncellenmesini daha şeffaf hale getirdiğinden, bu iyi bir şeydir.

Yazılım

Gerçekte, önyükleme sektörünüz, sistemin CPU'sunda çalışan ilk yazılım değildir.

Aslında ilk çalışan , bir yazılım olan sözde ürün yazılımıdır:

  • donanım üreticileri tarafından yapılan
  • tipik olarak kapalı kaynak ancak muhtemel C-tabanlı
  • salt okunur bellekte saklanır ve bu nedenle satıcının izni olmadan değişiklik yapılması zor / imkansızdır.

İyi bilinen yazılımlar şunları içerir:

  • BIOS : eski tüm mevcut x86 bellenimi. SeaBIOS, QEMU tarafından kullanılan varsayılan açık kaynak uygulamasıdır.
  • UEFI : BIOS halefi, daha iyi standartlaştırılmış, ancak daha yetenekli ve inanılmaz derecede şişirilmiş.
  • Düzeltme : asil çapraz kemer açık kaynak girişimi

Firmware gibi şeyler yapar:

  • önyüklenebilir bir şey bulana kadar her sabit disk, USB, ağ vb.

    Biz QEMU çalıştırdığınızda, -hdao diyor main.imgdonanıma bağlı bir sabit disk, ve

    hda ilk deneniyor ve kullanılıyor.

  • ilk 512 byte'ı RAM hafıza adresine yükleyin, 0x7c00CPU's RIP'ini buraya yerleştirin ve çalışmasına izin verin.

  • önyükleme menüsü veya BIOS yazdırma çağrıları gibi şeyleri ekranda gösterin

Firmware, çoğu işletim sisteminin bağımlı olduğu işletim sistemi işlevini sunar. Örneğin, bir Python alt kümesi BIOS / UEFI'de çalışacak şekilde gösterilmiştir: https://www.youtube.com/watch?v=bYQ_lq5dcvM

Yazılımların OS'lerden ayırt edilemez olduğu ve yazılımın birinin yapabileceği tek "gerçek" çıplak metal program olduğu söylenebilir.

Bu CoreOS dev'in söylediği gibi :

Zor kısmı

Bir PC'yi çalıştırdığınızda, yonga setini oluşturan cipsler (kuzey köprüsü, güney köprüsü ve SuperIO) henüz doğru şekilde başlatılmadı. BIOS ROM, CPU'dan olabildiğince uzakta olsa bile, buna CPU tarafından erişilebilir, çünkü olması gerekir, aksi takdirde CPU'nun çalıştırması için hiçbir talimatı olmazdı. Bu, BIOS ROM'un tamamen eşlendiği anlamına gelmez, genellikle değil. Ancak önyükleme işlemini devam ettirmek için yeterli haritalama yapılır. Diğer cihazlar, unut gitsin.

Coreboot'u QEMU altında çalıştırdığınızda, daha yüksek Coreboot katmanlarını ve yükleri deneyebilirsiniz, ancak QEMU düşük seviye başlangıç ​​kodunu denemek için çok az fırsat sunar. Birincisi, RAM sadece en baştan işe yarar.

BIOS başlangıç ​​durumunu göster

Donanım çok şey gibi, standardizasyon zayıf olduğunu ve gereken şeylerden biri değil kodunuzu BIOS sonra çalışan başladığında itimat kayıtları başlangıç halidir.

Öyleyse kendinize bir iyilik yapın ve aşağıdaki gibi bazı başlatma kodlarını kullanın: https://stackoverflow.com/a/32509555/895245

Kayıt yaptırır %dsve %esönemli yan etkileri vardır, bu yüzden açıkça kullanmasanız bile bunları sıfırlamanız gerekir.

Bazı emülatörlerin gerçek donanımdan daha iyi olduklarını ve size güzel bir başlangıç ​​durumu sunduğunu unutmayın. Sonra gerçek bir donanıma gittiğin zaman her şey bozulur.

GNU GRUB Multiboot

Önyükleme kesimleri basittir ancak çok uygun değildir:

  • disk başına yalnızca bir işletim sisteminiz olabilir
  • yük kodu gerçekten küçük olmalı ve 512 bayta sığmalıdır. Bu int 0x13 BIOS çağrısı ile çözülebilir .
  • korumalı moda geçmek gibi çok fazla başlangıç ​​yapmanız gerekiyor

Bu sebeplerden dolayı GNU GRUB multiboot adlı daha uygun bir dosya formatı oluşturdu.

Minimal çalışma örneği: https://github.com/cirosantilli/x86-bare-metal-examples/tree/d217b180be4220a0b4a453f31275d38e697a99e0/multiboot/hello-world

Ayrıca USB'yi milyon kez yakmadan tüm donanımları gerçek donanımda kolayca çalıştırabilmek için GitHub örnekler depomda da kullanıyorum . QEMU'da şöyle görünüyor:

görüntü tanımını buraya girin

İşletim sisteminizi çoklu önyüklemeli bir dosya olarak hazırlarsanız, GRUB normal bir dosya sistemi içinde bulabilir.

Bu, OS görüntülerini altına koyarak, çoğu dağıtımın yaptığı şeydir /boot.

Çoklu önyükleme dosyaları temelde özel bir başlığa sahip bir ELF dosyasıdır. GRUB tarafından şu adresten belirtilir: https://www.gnu.org/software/grub/manual/multiboot/multiboot.html

Bir çoklu önyüklemeli dosyayı önyüklenebilir bir diske dönüştürebilirsiniz grub-mkrescue.

El Torito

CD'lere yakılabilecek format: https://en.wikipedia.org/wiki/El_Torito_%28CD-ROM_standard%29

ISO veya USB üzerinde çalışan karma bir görüntü üretmek de mümkündür. Bu ile yapılabilir edilir grub-mkrescue( örneğin ) ve ayrıca Linux çekirdeği tarafından yapılır make isoimagekullanarak isohybrid.

kaynaklar

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.