Pek çok insan bilgisayarın nasıl başlatıldığıyla ilgileniyor. Sihrin başladığı ve cihaz açık olduğu sürece devam ettiği yer burasıdır. Bu makalede, çeşitli aşamaları, ilgili temel bileşenleri ve süreç sırasında karşılaşılan zorlukları da içeren önyükleme sürecine genel bir bakış sunacağız.
Öncelikli odak noktamız x86 mimarisi (en yaygın kullanılanı) olacak olsa da, diğer mimarilerin de önyükleme süreçlerinde birçok benzerliği olacaktır. Bu makalenin bu alanda bilgilerini derinleştirmek isteyen herkes için değerli bir kaynak olacağını umuyorum. İşte başlıyoruz!
Anakart üzerinde bulunan ve bilgisayarın başlatılmasından sorumlu ürün yazılımı kodunu saklayan entegre devreye (yonga) BOOT ROM adı verilir. Bu ad standartlaştırılmamıştır, bu nedenle diğer geliştiriciler buna sıklıkla FLASH ROM , BIOS FLASH , BOOT FLASH , SPI FLASH vb. adını verirler (bu tür adlar onlara teknoloji, arayüz ve amaç adlarından dolayı verilmiştir). Endişelenmeyin, bu terimler birbirinin yerine kullanılabilir. BOOT ROM'daki ürün yazılımı kodu, bilgisayar açıldığında ilk olarak yürütülür. Temel testleri gerçekleştirir, donanımı başlatır ve ardından işletim sistemi yükleyicisini sabit sürücü veya USB sürücü gibi önyüklenebilir bir aygıttan belleğe yükler. Bu çip kalıcı bellekten (NVM) yapılmıştır.
Kalıcı bellek , güç kapatıldığında bile içeriğini koruyan bir tür bilgisayar belleğidir. Bu tür bir belleği, bilgisayar kapatıldığında bile korunması gereken önemli verileri depolamak için ideal hale getirir. Ayrıca tartışma yalnızca ürün yazılımı kodunu tutan belleğe odaklanacaktır. Sabit Disk Sürücüleri (HDD), Katı Hal Sürücüleri (SSD), disketler vb. depolama alanlarından bahsetmeyeceğiz.
Temel olarak bu tür hafızayı aşağıdaki gruplara ayırabiliriz.
Elektriksel Olarak Silinebilir Programlanabilir (EEPROM): Elektrik sinyalleri kullanılarak birden çok kez yeniden programlanabilir.
NOR Flash bellek : Verilerin blok düzeyinde silindiği ve bayt düzeyinde okunup yazılabilen bloklar halinde mimari olarak düzenlenmiştir. NOR belleğine bayt paralel, I2C veya SPI gibi standart bir arayüz kullanılarak doğrudan erişilebilir.
Endüstride, EEPROM terimini blok bazında silinebilir flash belleklerle karşılaştırıldığında bayt bazında silinebilir belleklere ayırmak için bir gelenek vardır.
Programlanabilir hafıza bir kuralla birlikte gelir; yazmadan önce silme . Böyle bir hafızada, yeni veri yazmak daha karmaşıktır çünkü veri, kayan bir geçitte yük olarak depolanır (bunun nedeni, çoğunun sadece bellek hücrelerinin fiziğinde yatmasıdır). Kapıdaki yük miktarı hücrenin "0" mı yoksa "1" mi depolayacağını belirler.
Bir flash bellek yongasını sildiğinizde, üzerinde depolanan tüm veri bitlerini bilinen (varsayılan) bir duruma, genellikle "1" mantığına ayarlarsınız. Bu, tabiri caizse temiz bir sayfayla başlamanıza ve üzerinde hâlâ depolanan eski verilerden herhangi bir kalıntı olmadan çip üzerine yeni veriler programlamanıza olanak tanır. Çipe yeni veri yazıldığında, tek tek bitlerin durumu, yeni veriyi temsil edecek şekilde "1"den "0"a değiştirilir.
Çipe silmeden yeni veri yazarsanız, yeni veriler eski verilerle birleşerek öngörülemeyen sonuçlara yol açacaktır. Örneğin, "0110 0010" değerini saklayan 8 bit belleğe sahip bir flash bellek yongasını düşünün. Çipe silmeden yeni veri "1100 1001" yazarsanız, çipin ortaya çıkan durumu "0100 0000" olur ve bu sizin istediğiniz gibi olmayabilir.
Asıl karışıklık, Salt Okunur Bellek anlamına gelen ROM kelimesiyle ilgilidir. "Salt Okunur Bellek" terimi geçmişte kalıcı olan ve kullanıcı tarafından değiştirilemeyen belleği ifade etmek için kullanılmıştır. Ancak teknoloji ilerledikçe ROM'un tanımı değişti ve artık sıklıkla fabrikada önceden programlanan ve son kullanıcı tarafından kolayca değiştirilemeyen hafızayı ifade etmek için kullanılıyor. Ancak kullanıcı istenilen becerilere ve özel donanıma sahipse (örneğin bir programcı), çipi yeniden programlayabilir. Tanımı değişse de ROM adı, belleğin orijinal amacına tarihsel bir referans olarak kaldı.
Yazma koruması uygulanarak bazı yeniden programlanabilir ROM türleri geçici olarak salt okunur bellek haline gelebilir.
Bunların TÜM mevcut geçici olmayan bellek türleri DEĞİLDİR, ancak tesadüfen duyabileceğiniz popüler olanların çoğu. Günümüzde çoğu anakartta bu yongalar NOR Flash teknolojisi kullanılarak yapılıyor.
Yerinde Yürütme (XIP), işlemcinin kodu önce geçici belleğe ( RAM gibi) kopyalamadan doğrudan flash bellekten yürütmesine olanak tanıyan bir yöntemdir. Bu, flaş belleğin işlemcinin adres alanına eşlenmesiyle elde edilir, böylece kod yürütme doğrudan flaştan gerçekleştirilebilir. Böylece sistem, ilk önce RAM'in başlatılmasını beklemek zorunda kalmadan, mümkün olan en kısa sürede kod çalıştırmaya başlayabilir.
Bekle... CPU, BOOT ROM ile SPI/Paralel/etc protokolü aracılığıyla iletişim kurabilir mi? Tabii ki hayır, bu sadece sistem belleğinden talimatların alınmasıdır, bu bellek bölgesine yapılan istekler Intel Direct Media Interface'e (DMI ) veya AMD Infinity Fabric (IF) / Unified Media Interface'e (UMI) (önceki) yönlendirilir. CPU ile anakarttaki yonga seti arasındaki bağlantıdır. Bu noktada adresin kod çözümü yonga setinde bulunan kod çözücüler aracılığıyla gerçekleştirilir ve çipteki veriler işlemciye geri gönderilir.
Çip, rastgele erişimli okumaları destekleyen ancak rastgele erişimli yazmaları desteklemeyen NOR flash bellekten yapıldığında bir sorun ortaya çıktı. Yazılabilir bellek mevcut olmadığı sürece tüm hesaplamaların işlemci kayıtları içerisinde yapılması gerekir. Bu noktada kod yalnızca montaj dilinde yazılabilir ve ortamı üst düzey dil (tipik olarak C dili için) hazırlama eğilimindedir. Bunun nedeni, belleğin başlatılmasının çok karmaşık hale gelmesi ve yalnızca derlemede yazmanın zor olmasıdır. Bu tür diller en azından bir yığın ve yığın gerektirdiğinden yazılabilir belleğe ihtiyacımız var. Bazı işlemcilerde çipin içine gömülü SRAM bulunur, ancak daha modern bir yaklaşım yerleşik Önbellek belleğini RAM (CAR) olarak kullanmaktır.
CPU önbelleği, ana bellekten sık kullanılan verilerin ve talimatların bir kopyasını saklayan yüksek hızlı bir bellektir. Bir önbellek işlemciye daha yakın bir yerde bulunur ve her biri bir öncekinden daha büyük ve daha yavaş olacak şekilde birden çok düzeye (L1, L2, L3, ...) göre düzenlenir.
Veriler önbellekteyse, CPU istenen verileri önbellekten alabilir (buna önbellek isabeti denir). CPU önbelleği gerekli verileri bulamadığında, önbellek kaçırma durumuyla sonuçlanır. Bu durum, verilerin hiçbir zaman önbellekte depolanmamasından veya verilerin daha önce depolanmış olmasına rağmen önbellekten çıkarılmış olmasından kaynaklanabilir. Her neyse, işlemcinin verilere erişmek ve onu önbelleğe kopyalamak için ana belleğe kadar gitmesi gerekiyor.
Önbellek tahliyesi , yeni veriler için yer açmak amacıyla verileri önbellekten kaldırma işlemidir. Verilerin çıkarılması, önbellekleme sistemi tarafından (genellikle bir önbellek dolduğunda ve yeni verilerin depolanması gerektiğinde veya verinin yaşam süresi politikasının süresi dolduğunda) veya açık taleple başlatılabilir.
Ancak CPU Önbelleğini RAM olarak kullanmak istiyorsak, önbelleği Doldurma Modu olarak da adlandırılan Tahliye Dışı Modda çalışacak şekilde ayarlamamız gerekir. Bu teknik, önbellek eksikliği nedeniyle tahliyeyi önler. Bunun yerine, önbellek normal bir SRAM olarak kabul edilir ve tüm erişimler (okuma/yazma) önbelleğe ulaşır ve ana belleğe ulaşmaz . Mod, satıcıya özel CPU talimatları kullanılarak etkinleştirilebilir.
Gerçekte, BOOT ROM çeşitli türde bellenimler içerir. BOOT ROM'da bir grup ürün yazılımı depolandıktan sonra, bunları birbirinden ayırt edecek şekilde organize edilmesi gerekir. Nasıl yapıldığını öğrenelim.
Başlangıçta yonga seti tüm BOOT ROM içeriğinin doğrudan belleğe eşlenmesini sağlar (4 GB'tan 4 GB'a - 16 MB). Genellikle BOOT ROM'un boyutu 16 MB'tan küçükse içerik tekrar tekrar eşlenir. CPU ve donanım yazılımı herhangi bir kısıtlama olmaksızın flaşa okuyabilir/yazabilir.
Tanımlayıcı Olmayan Mod artık yeni yonga setlerinde desteklenmemektedir.
Sonunda ICH8'de Intel, BOOT ROM için özel bir düzen sunuyor. Flaş aşağıdaki bölgelere ayrılmıştır:
Flash Tanımlayıcı (FD) - bu veri yapısı cihazın başında 0x10
ofsetle bulunmalıdır. Aşağıdaki şekilde gösterildiği gibi on bir bölümden oluşur:
Tanımlayıcı MAP, diğer bölgelere ve her birinin boyutuna işaret eden işaretçilere sahiptir.
Bileşen bölümü, sistemdeki flaş(lar) hakkında bilgi içerir (bileşen sayısı, her birinin yoğunluğu, geçersiz talimatlar vb.).
Master's bölümü bölgeler için okuma/yazma izinlerini tanımlar. Okuma/yazma söz konusu olduğunda izinler Salt Okunur olarak ayarlanmalıdır, bu bölgede saklanan bilgiler yalnızca üretim süreci sırasında yazılabilir.
Flash Tanımlayıcı ve Intel ME gerekli olan tek bölgelerdir.
FIT, BIOS bölgesinin içindeki bir veri yapısıdır ve platform yapılandırmasını tanımlayan çeşitli girişler içerir. Tablodaki her girişin boyutu 16 bayttır. Birincisine FIT başlığı , diğerine ise FIT girişi denir. FIT işaretçisi tarafından 0xFFFFFFC0
(4GB - 0x40) fiziksel adresinde bulunur.
Bu bileşenlerin sıfırlama vektöründen ilk CPU talimatını yürütmeden önce işlenmesi gerekir. Girişler CPU mikrokod güncellemelerini, Başlangıç ACM'sini, Platform Önyükleme/TPM/BIOS/TXT ilkelerini ve diğer şeyleri içerir. Ancak en azından FIT, FIT Başlığı ve Mikro Kod Güncelleme girişlerini içermelidir. Dolayısıyla FIT'in yaygın kullanımı, sıfırlama vektörünü çalıştırmadan önce mikro kodu güncellemektir.
Bellek haritası şöyle görünür:
Ne yazık ki çok daha az bilgi var, düzenleriyle ilgili ayrıntıları içeren sızdırılmış herhangi bir AMD yonga seti belgesi bulamadım. Bu yüzden size coreboot belgelerinin söylediğinden daha iyisini söyleyemem. Yalnızca Gizlilik Sözleşmesi kapsamında mevcut olan AMD belgelerine dayanılarak yazılmıştır.
Aslında Flash Tanımlayıcının AMD analogunun Gömülü Firmware Yapısı olduğunu ve PSP Dizin Tablosu , BIOS Dizin Tablosu ve diğer bellenimlere yönelik işaretçiler içerdiğini bilmek yeterli olacaktır.
Modern belleğin ve CPU'nun tam olarak nasıl başlatıldığına bir göz atmak istiyorsanız, sizi üzmek zorundayım. Intel ve AMD, Silikon Başlatma Kodunu topluluğa yayınlamak için acele etmiyorlar. Bu tür bilgiler kamuya açık olmadığı sürece, gerekli silikon başlatma kodunun ikili dağıtımını sunarlar. Bu, ürün yazılımı geliştiricileri için bir kitaplık olarak düşünülmelidir ve bellek denetleyicisini, yonga setini, CPU'yu ve sistemin diğer farklı bölümlerini başlatmak için ikili kod içerir.
Bu ikili 4 bileşene ayrılabilir:
İşte Intel tarafından yayınlanan ve GitHub'da bulabileceğiniz Intel FSP ikili dosyalarının Deposu . FSP Spesifikasyonu v2.1, Intel web sitesinden edinilebilir.
Aile 17h'den önceki ürünler için AGESA, v5 veya Arch2008 olarak bilinir. O zamanlar AGESA açık kaynaklıydı ve kod coreboot deposunda mevcuttu (4.18 sürümünden sonra kullanımdan kaldırıldı). Arch2008 spesifikasyonu AMD web sitesinde bulunabilir.
Family 17h (Zen mikro mimarisi) ürünlerinin piyasaya sürülmesiyle AMD, AGESA kaynak kodunu yayınlamadı, yalnızca önceden oluşturulmuş ikili çözümler yayınladı. Böyle bir halefe AGESA v9 adı verilir ve Aile 17h ve sonrasını destekler.
Detaylı bilgi mevcut değil, sadece haberler var .
Modern x86 önyükleme işleminin ayrılmaz bir parçası; bu olmadan x86 çekirdekleri asla etkinleştirilemez. Bu nedenle bunları tamamen devre dışı bırakmak imkansızdır . Bu teknolojiler donanımın başlatılmasından, sistem bütünlüğünün doğrulanmasından, güç yönetiminden ve CPU'nun başlatılmasından sorumludur. Bu alt sistemlerin donanım yazılımı, ana işlemci kendi donanım yazılımını çalıştırmaya başlamadan önce yüklenir ve yürütülür. Bu tür sistemlerdeki kod, platformun CPU çekirdeklerinden bağımsız olarak çalışır.
Pek çok donanım şirketi gizlilik yoluyla güvenlik ilkesini benimsediği sürece, bu alt sistemlerin ne kaynak kodu ne de belgeleri mevcuttur. Neyse ki bunun önyükleme sürecini nasıl etkilediğini biliyoruz - bkz . Donanım Güç Dizileri .
Detaylara girmeyeceğiz çünkü internette zaten dünyanın her yerindeki araştırmacıların yazdığı kapsamlı makaleler var. Ama size bunun ne olduğuna dair kısa bir açıklama yapacağım.
Intel ME, 2008'den beri Intel yonga setine (PCH) entegre edilmiş ayrı bir i486/80486 mikroişlemcidir. Kendi RAM'ine, yerleşik ROM'una ve yonga seti içindeki tüm veri yollarına giden veri yolu köprülerine sahiptir (bunun sonucunda ağa erişebilir) ve hatta CPU'daki ana RAM) vb. MINIX'i temel alan özel bir işletim sistemi çalıştırır.
AMD PSP, CPU kalıbına yardımcı işlemci olarak yerleştirilen Trustzone uzantısına dayanan bir ARM çekirdeğidir. Bu çip, 2013'ten beri çoğu AMD platformuna entegre edilmiştir. Belgelenmemiş ve tescilli bir işletim sistemi çalıştırır.
Aynı zamanda Güç Açma Sıralaması veya Güç Sıralaması olarak da bilinen bu işlem, platformda ihtiyaç duyulan belirli bir sırayla türetilmiş bir dizi voltaj seviyesi ve/veya güç kaynağı rayları sağlar. Daha basit bir ifadeyle, bir dizi platform bileşenini belirli bir sırayla çalıştırır. Süreç, sistem veya platform tasarımına bağlı olarak değişiklik gösterir ancak genellikle standart bir bilgisayar aşağıdaki adımları içerir:
AMD tabanlı sistemler (Aile 17 saat ve sonrası için)
PSP, çip BOOT ROM'unda yürütülür.
PSP, çip dışı BOOT ROM'da Yerleşik Firmware Tablosunu bulur ve PSP firmware'ini çalıştırır.
PSP, ABL aşamalarını bulmak için PSP Dizin Tablosunu ayrıştırır ve bunları yürütür.
ABL aşamaları ana belleği başlatır, BIOS görüntüsünü BOOT ROM'da bulur ve onu DRAM'e yükler (görüntü sıkıştırılmışsa sıkıştırmayı açar).
Bu platformun CAR'ı kullanması için hiçbir neden yok çünkü DRAM zaten mevcut ve PSP ürün yazılımı görüntüsünü buna yüklüyor.
CPU ilk kez açıldıktan sonra gerçek modda çalışır. Kayıtların çoğu, Talimat İşaretçisi (IP), Kod Segmenti (CS) ve segment belleğine hızlı erişime izin vermek için işlemci içindeki her segment tanımlayıcısının bir kopyası olan Tanımlayıcı Önbelleği dahil olmak üzere iyi tanımlanmış değerlere sahiptir.
Segment Tanımlayıcı, Global Tanımlayıcı Tablodaki (GDT) bir giriştir ve temel adresi, segment sınırını ve erişim bilgilerini içerir (gerçek modun, korumalı mod gibi erişim kontrolü olmadığı için bu bölüm göz ardı edilir). Her bellek erişimi için GDT'ye (bellekte bulunan) erişmek yerine, bilgiler bir tanımlayıcı önbellekte saklanır.
Ancak GDT gerçek modda yer almadığından işlemci girdileri dahili olarak oluşturur. Segment tanımlayıcıya erişmek için kullanılan CS seçici kaydı 0xF000
ile yüklenir. CS temel adresi 0xFFFF_0000
olarak başlatıldı. IP 0xFFF0
olarak başlatıldı.
Bu nedenle işlemci, 0xFFFF_FFF0
( 0xFFFF_0000
+ 0x0000_FFF0
) fiziksel adresinde bulunan bellekten talimatları almaya başlar. Bu adreste yürütülen ilk talimata sıfırlama vektörü adı verilir.
NOT: Bu hile yüksek adres alanına erişmenizi sağlar ancak 0xFFFF_0000
adresinin altındaki koda erişemezsiniz. CS temel adresi, CS seçici kaydı ürün yazılımı tarafından yüklenene kadar bu başlangıç değerinde kalır. Uzak bir sıçrama yapılarak yapılabilir.
Bu noktada en doğru karar 4 GB adreslenebilirliğe sahip korumalı moda geçmek olacaktır. Ürün yazılımı bunu yapmazsa, gerçek modun çalışabilmesi için yonga setinin 1 MB'ın altındaki bir bellek aralığını 4 GB'nin hemen altındaki eşdeğer bir aralığa takma ad verebilmesi gerekir. Bazı yonga setlerinde bu takma ad yoktur ve ilk uzun atlama gerçekleştirilmeden önce başka bir çalışma moduna geçilmesi gerekebilir.
Örnek olarak ASUS P9X79 anakart kullanılarak işlemin anlatıldığı açılış sırasını anlatan aşağıdaki videoyu izlemenizi tavsiye ederim. Rusça olmasına rağmen otomatik olarak oluşturulan İngilizce altyazıları açarsanız her şeyi anlayabileceksiniz.
Bu makale, önyüklemenin nasıl çalıştığına ilişkin birçok teorik bilgi sağlamıştır. Ancak bu süreci gerçekten anlamak için mevcut donanım yazılımının kaynak koduna ve mimarisine daha yakından bakmamız gerekiyor.
Bir sonraki yazımızda BIOS , UEFI ve coreboot konularını daha derinlemesine inceleyerek bunları detaylı bir şekilde inceleyeceğiz.