Montaj okulu: işletim sistemi geliştirme. Sinek Kuşunun Uçuşu. Tamamen assembler ile yazılmış bir işletim sistemi neleri derleme ve derleme yeteneğine sahiptir?

Son zamanlarda montajcıyı öğrenmeye karar verdim, ancak kod satırlarını boşa harcamakla ilgilenmiyordum. Montajcı eğitimi aldıkça bazı konularda uzmanlaşacağımı düşündüm. Bu yüzden seçimim bir önyükleyici yazmaya düştü. Bulgularımın sonucu bu blogda.

Teoriyi pratikle birleştirmeyi sevdiğimi hemen söylemek istiyorum, o halde başlayalım.

İlk önce size basit bir tasarımın nasıl oluşturulacağını göstereceğim. MBR böylece mümkün olan en kısa sürede sonucun tadını çıkarabiliriz. Pratik örneklerle karmaşıklaştıkça teorik bilgiler vereceğim.

Önce bir USB flash sürücü önyükleyicisi yapalım!

Dikkat!!! İlk birleştirici programımız hem flash sürücü hem de Disket veya Disket gibi diğer cihazlar için çalışacaktır. Sabit disk. Devamında tüm örneklerin doğru çalışabilmesi için kodun farklı cihazlarda çalışmasına ilişkin bir takım açıklamalarda bulunacağım.

biz yazacağız Fasm yükleyicileri yazmak için en iyi derleyici olarak kabul edildiğinden MBR. Fasm'ı seçmenin ikinci nedeni, dosyaları derleme sürecini büyük ölçüde basitleştirmesidir. Direktif Yok Komut satırı ve benzeri. çeviriciyi öğrenmeyi ve hedeflerinize ulaşmanızı tamamen engelleyebilecek saçmalık. Bu nedenle, ilk aşamada iki programa ve bazılarına ihtiyacımız var. gereksiz küçük flash sürücü. 1 Gb'yi kazdım (hızlı bir şekilde biçimlendirildi ve eğer varsa, yazık değil). Önyükleyicimizin çalışmasından sonra flash sürücü normal şekilde çalışmayı bırakacaktır. Windows 7'im flash sürücüyü biçimlendirmeyi reddediyor. Flash sürücüyü bir yardımcı programla hayata döndürmenizi tavsiye ederim HP USB Disk Depolama biçim aracı (HPUSBFW.EXE) veya flash sürücüleri biçimlendirmek için diğer yardımcı programları kullanın.

Bunları yükleyin ve uygun kısayolları masaüstüne veya istediğiniz yere atın.

Hazırlık bitti, harekete geçelim

Fasmw.exe'yi açın ve aşağıdakileri buraya yazın. Sonucu görmek için minimum kodun taslağını çizeceğiz. Daha sonra burada nakalyakano'nun ne olduğunu analiz edeceğiz. Kısaca yorum yapacağım.

FASM kodu: ============= boot.asm ===============

org 7C00h; Programımızın adresleri bu yönergeye göre hesaplanmaktadır.

kullanım16; onaltılık kod oluşturulur

cli; bölüm kayıtlarındaki adresleri değiştirmek için kesintileri devre dışı bırakın

hareket baltası, 0

hareket hızı, 7C00h

sti ; kesintileri etkinleştir (adresleri değiştirdikten sonra)

mov ax, 0003h ; video modunu ekranda dizeyi görüntüleyecek şekilde ayarlayın

dahili 10 saat

mov ax, 1301h ; gerçek dize çıktı işlevi 13h int 10h (bununla ilgili daha sonra detaylı bilgi verilecektir)

mov bp, stroka ;çıkış dizesinin adresi

mov dx, 0000h ;metnin görüntülendiği satır ve sütun

mov cx, 15 ;çıkış dizesindeki karakter sayısı

mov bx, 000eh ;00-video sayfa numarası (dokunmamak daha iyi) 0e-karakter nitelikleri (renk, arka plan)

dahili 10 saat

jmp $ ;stalk yerinde (programı bu noktada döngüye alır)

line db "Tamam, MBR yüklendi!"

çarpı 510 - ($ - $$) db 0 ;önceki bayt ile son bayt arasındaki boşluğu sıfırlarla doldurmak

db 0x55 ,0xAA ;son iki bayt

Bu kodu (Ctrl + F9) fasm "e'ye derleyin ve elde edilen ikili dosyayı boot.bin olarak uygun bir yere kaydedin. İkili dosyamızı bir USB flash sürücüye yazmadan önce küçük bir teori.

USB flash sürücüyü bilgisayara taktığınızda, USB flash sürücüden önyükleme yapmak istediğiniz BIOS sistemi tarafından kesinlikle belli olmaz, bu nedenle BIOS ayarlarında önyükleme yapmak istediğiniz cihazı seçmeniz gerekir. Bu yüzden USB'den önyükleme yapmayı seçtik (bios arayüzünün çeşitli varyasyonları olduğundan bunu nasıl yapacağınızı kendiniz bulmanız gerekecek ... Google'a başvurabilirsiniz) BIOS ayarları senin için anakart. Kural olarak karmaşık bir şey yoktur).

Artık BIOS, flash sürücüden önyükleme yapmak istediğinizi bildiğine göre, flash sürücüdeki sıfır sektörün önyüklenebilir olduğundan emin olmalıdır. Bunu yapmak için BIOS görünüyor sıfır sektörün son iki baytı ve eğer 0x55 0xAA'ya eşitlerse, o zaman ancak o zaman yüklenecektir Veri deposu. Aksi takdirde BIOS, flash sürücünüzden kolayca geçecektir. Bu iki sihirli baytı bulduktan sonra sıfır sektörü 0000: 7C00h adresindeki RAM'e yükler ve ardından flash sürücüyü unutarak kontrolü bu adrese aktarır. Artık bilgisayar üzerindeki tüm güç önyükleyicinize aittir ve zaten RAM'den hareket ederek USB flash sürücüden ek kod yükleyebilir. Şimdi bu sektörün DMDE programında nasıl göründüğünü göreceğiz.

1. Flash sürücünüzü bilgisayara takın ve ihtiyacınız olan bilgileri içermediğinden emin olun.

2.DMDE programını açın. Resimlerdeki diğer tüm eylemleri okuyun:

Bu çizgi romanı izledikten sonra MBR'nizi bir flash sürücüye indirme becerisine sahip olacaksınız. Önyükleyicimizin uzun zamandır beklenen sonucu şu şekilde görünüyor:


Bu arada, minimum yükleyici kodundan bahsedersek şöyle görünebilir:

Kuruluş 7C00h
jmp $
db 508 çoğaltma(0)
db 0x55.0xAA

Kontrolü ele geçiren böyle bir yükleyici, bir döngüde anlamsız bir jmp $ komutunu yürüterek bilgisayarı kapatır. Ben ona durgunluk diyorum.

YouTube'da size yardımcı olabilecek bir video yayınladım:

Son olarak, önyükleyicinin çalışmasıyla ilgili birkaç kısa gerçek:

1. Bootloader, diğer adıyla bootloader, diğer adıyla MBR'nin boyutu 512 byte'tır. Tarihsel olarak,
eski medya ve cihazları desteklemek için bu koşulun karşılanması gerektiğini.
2. Önyükleyici her zaman bir flash sürücünün, disketin sıfır sektöründe bulunur. sabit disk, DMDE programı veya cihazlarla çalışmanıza izin veren diğer hex editörleri açısından. Listelenen cihazlardan birine bir ikili dosya (boot.bin'imiz) yüklemek için onların dahili fiziksel yapılarını düşünmemize gerek yok. DMDE programı bu cihazlardaki sektörlerin nasıl okunacağını bilir ve bunları LBA modunda görüntüler (basitçe 0'dan son sektöre kadar numaralandırır). LBA hakkında okuyabilirsiniz
3. Önyükleyici her zaman iki bayt 0x55 0xAA ile bitmelidir.
4. Yükleyici belleğe her zaman 0000:7C00h'de yüklenir.
5. Önyükleyici işletim sistemini başlatır.


Orijinal: AsmSchool: Bir işletim sistemi yapın
Yazarı: Mike Saunders
Yayın tarihi: 15 Nisan 2016
Tercüme: A. Panin
Transfer tarihi: 16 Nisan 2016

Bölüm 4: Serinin önceki makalelerinden öğrendiğiniz becerilerle kendi işletim sisteminizi geliştirmeye başlayabilirsiniz!

Bu ne için?

  • Derleyicilerin nasıl çalıştığını anlamak.
  • Merkezi işlem biriminin talimatlarını anlamak.
  • Kodunuzu performans açısından optimize etmek.

Birkaç ay içinde kalkınmayla başlayan zorlu bir yoldan geçtik. basit programlar Linux için Assembly dilinde yazılmış ve serinin son makalesinde, işletim sistemi olmayan kişisel bir bilgisayarda çalışan bağımsız kodun geliştirilmesiyle sona ermiştir. Şimdi tüm bilgileri bir araya toplayıp gerçek bir işletim sistemi oluşturmaya çalışacağız. Evet, Linus Torvalds'ın izinden gideceğiz ama önce şu soruları yanıtlamakta fayda var: "İşletim sistemi nedir? Onun hangi işlevlerini yeniden oluşturmamız gerekecek?".

Bu yazıda yalnızca işletim sisteminin ana işlevlerine odaklanacağız: programların yüklenmesi ve çalıştırılması. Karmaşık işletim sistemleri, sanal belleği yönetme ve işleme gibi daha birçok işlevi yerine getirir ağ paketleri ancak bunların doğru şekilde uygulanması yıllarca süren sürekli çalışmayı gerektirir, bu nedenle bu makalede yalnızca herhangi bir işletim sisteminde mevcut olan ana işlevleri ele alacağız. Geçen ay, bir disketin 512 baytlık sektörüne (ilk sektörü) sığacak küçük bir program geliştirdik ve şimdi diskten ek veri yükleme işlevini eklemek için onu biraz değiştireceğiz.

Önyükleyici Geliştirme

BIOS tarafından yüklenen disketin ilk 512 baytlık sektörüne yerleştirmek için işletim sistemimizi mümkün olduğu kadar küçük ikili tutmaya çalışabiliriz, ancak bu durumda bunu uygulayamayacağız. herhangi bir ilginç fonksiyon. Bu nedenle, bu 512 baytı, işletim sistemi çekirdeğinin ikili kodunu yükleyecek ve çalıştıracak basit bir sistem yükleyicinin ikili kodunu yerleştirmek için kullanacağız. (Bundan sonra, diğer programların ikili kodunu diskten yükleyecek ve aynı zamanda çalıştıracak olan işletim sistemi çekirdeğinin kendisini geliştireceğiz, ancak bunun hakkında biraz sonra konuşacağız.)

Bu makalede tartışılan örneklerin kaynak kodunu www.linuxvoice.com/code/lv015/asmschool.zip adresinden indirebilirsiniz. Bu da boot.asm adlı dosyadaki önyükleyicimizin kodudur:

BITS 16 jmp kısa başlangıç; Disk açıklamasını atlayarak etikete geçin nop ; Disk açıklamasından önce yapılan ekleme %include "bpb.asm" start: mov ax, 07C0h ; Yük adresi mov ds, ax ; Veri segmenti hareket ekseni, 9000 saat; Yığın mov ss, ax mov sp, 0FFFFh'yi hazırlayın; Yığın küçülüyor! cld; Yön bayrağını ayarla mov si, kern_filename çağrısı load_file jmp 2000h:0000h ; Kern_filename db "MYKERNELBIN" %include "disk.asm" çarpı 510-($-$$) db 0 ; 510 bayta kadar ikili kodun sıfır dolgusu dw 0AA55h; Önyükleme yükleyicisi ikili kod bitiş işareti arabelleği: ; Disk içerikleri için arabelleği başlat

Bu kodda, ilk CPU talimatı, NASM derleyicisine 16 bitlik modun kullanıldığını bildiren BITS direktifinden sonra yer alan jmp talimatıdır. Muhtemelen serinin bir önceki makalesinden hatırlayacağınız gibi, BIOS'un diskten yüklediği 512 baytlık ikili kodun yürütülmesi en baştan başlıyor ancak özel veri setini atlamak için etikete atlamamız gerekiyor. Açıkçası, geçen ay kodu diskin başına yazdık (dd yardımcı programını kullanarak) ve disk alanının geri kalanını boş bıraktık.

Artık uygun bir MS-DOS (FAT12) dosya sistemine sahip bir disket kullanmamız gerekecek ve bu dosya sistemiyle doğru çalışabilmek için sektörün başlangıcına yakın bir dizi özel veri eklememiz gerekiyor. Bu sete "BIOS Parametre Bloğu" (BPB) denir ve disk etiketi, sektör sayısı vb. gibi verileri içerir. Bu tür konular birden fazla makale dizisine ayrılabileceği için bu aşamada bizi ilgilendirmiyor, bu nedenle bununla ilgili tüm talimatları ve verileri bpb.asm adı verilen ayrı bir kaynak kod dosyasına yerleştirdik.

Yukarıdakilere dayanarak, kodumuzun bu direktifi son derece önemlidir:

%include "bpb.asm"

Bu, belirtilen kaynak dosyanın içeriğinin derleme sırasında geçerli kaynak dosyaya dahil edilmesine izin veren bir NASM yönergesidir. Böylece BIOS parametre bloğunun uygulanmasına ilişkin tüm detayları ayrı bir dosyaya taşıyarak sistem yükleyicimizin kodunu mümkün olduğunca kısa ve anlaşılır hale getirebileceğiz. BIOS parametre bloğu, sektörün başlangıcından üç bayta yerleştirilmelidir ve jmp talimatı yalnızca iki bayt kapladığından, nop talimatını kullanmamız gerekir (adı "işlem yok" anlamına gelir - bu hiçbir şey yapmayan bir talimattır) ancak kalan baytı doldurmak için CPU döngülerini boşa harcayın.

Yığınla çalışma

Daha sonra, kayıtları ve yığını hazırlamak için önceki makalede tartışılanlara benzer talimatların yanı sıra belirli talimatlar için yön bayrağını ayarlamanıza olanak tanıyan cld talimatını ("açık yön" anlamına gelir) kullanmamız gerekecek. Yürütüldükten sonra SI kaydındaki değeri azaltmak yerine artıran lodsb talimatı gibi.

Daha sonra stringin adresini SI yazmacına yerleştirip load_file fonksiyonumuzu çağırıyoruz. Ancak bir an düşünün; bu özelliği henüz geliştirmedik! Evet, bu doğru, ancak uygulanması disk.asm adı verilen başka bir kaynak kod dosyasında bulunabilir.

MS-DOS'ta biçimlendirilmiş disketlerde kullanılan FAT12 dosya sistemi, var olan en basit sistemlerden biridir. dosya sistemleri, ancak aynı zamanda içeriğiyle çalışmak için çok fazla kod gerektirir. Load_file altyordamı yaklaşık 200 satır uzunluğundadır ve bu makalede gösterilmeyecektir, çünkü belirli bir dosya sistemi için bir sürücü değil, bir işletim sistemi geliştirmeyi düşünüyoruz, bu nedenle günlük sayfalarında yer israf etmek pek akıllıca değildir. Böylece. Genel olarak disk.asm kaynak kod dosyasını neredeyse mevcut kaynak dosyanın bitiminden önce ekledik ve bunu unutabiliriz. (FAT12 dosya sisteminin yapısıyla hâlâ ilgileniyorsanız, http://tinyurl.com/fat12spec adresindeki mükemmel genel bakışı okuyabilir ve ardından disk.asm kaynak kodu dosyasına bakabilirsiniz - içindeki kod iyi yorumlanmış.)

Her durumda, load_file alt yordamı, ikili kodu SI kaydında verilen adla dosyadan ofset 0 ile segment 2000'e yükler, ardından yürütme için başlangıcına atlarız. Ve hepsi bu - işletim sisteminin çekirdeği yüklendi ve sistem yükleyicisi görevini tamamladı!

Kodumuzun, işletim sistemi çekirdek dosya adı olarak MYKERNEL.BIN yerine MYKERNELBIN kullandığını fark etmiş olabilirsiniz; bu, DOS'taki disketlerde kullanılan 8+3 adlandırma şemasına çok iyi uyuyor. Aslında, FAT12 dosya sistemi dosya adlarının dahili bir temsilini kullanır ve biz, bir nokta karakteri aramak ve dosya adını dosya adının dahili temsiline dönüştürmek için bir mekanizma uygulamak için load_file alt yordamımızı gerektirmeyeceği garanti edilen bir dosya adı kullanarak yerden tasarruf ederiz. dosya sistemi.

Disk.asm kaynak kod dosyasını bağlamak için yönergenin bulunduğu satırdan sonra, sistem yükleyicinin ikili kodunu 512 bayta kadar sıfırlarla doldurmak ve ikili kodunun bitiş işaretini eklemek için tasarlanmış iki satır vardır (bu, daha önce tartışılmıştır). son makale). Son olarak, kodun en sonunda, load_file alt yordamı tarafından kullanılan "buffer" etiketi bulunur. Genel olarak, load_file alt yordamının, diskte bir dosya bulma sürecinde bazı ara eylemleri gerçekleştirmek için RAM'de boş alana ihtiyacı vardır ve önyükleyiciyi yükledikten sonra yeterli boş alanımız vardır, bu nedenle arabelleği buraya yerleştiririz.

Önyükleyiciyi birleştirmek için aşağıdaki komutu kullanın:

nasm -f bin -o boot.bin boot.asm

Şimdi bir MS-DOS sanal disket görüntüsü oluşturmamız ve aşağıdaki komutları kullanarak önyükleyici ikili dosyamızı ilk 512 bayta eklememiz gerekiyor:

Mkdosfs -C floppy.img 1440 dd conv=runc if=boot.bin of=floppy.img

Bu, önyükleyici geliştirme sürecini tamamlar! Artık işletim sistemi çekirdeği ikili dosyasını mykernel.bin adlı bir dosyadan yüklememize ve çalıştırmamıza olanak tanıyan önyüklenebilir bir disket görüntüsüne sahibiz. Daha sonra işin daha ilginç bir bölümünü bekliyoruz - işletim sistemi çekirdeğinin geliştirilmesi.

işletim sistemi çekirdeği

İşletim sistemi çekirdeğimizin birçok önemli görevi yerine getirmesini istiyoruz: bir karşılama mesajı görüntülemek, kullanıcıdan gelen girişi kabul etmek, girişin desteklenen bir komut olup olmadığını belirlemek ve kullanıcı adlarını belirledikten sonra programları diskten çalıştırmak. Bu, mykernel.asm dosyasındaki işletim sistemi çekirdek kodudur:

mov ax, 2000h mov ds, ax mov es, balta döngüsü: mov si, istem çağrısı lib_print_string mov si, user_input çağrısı lib_input_string cmp bayt, 0 je döngü cmp kelimesi, "ls" je list_files mov ax, si mov cx, 32768 lib_load_file'ı çağır jc load_fail çağrı 32768 jmp döngü load_fail: mov si, load_fail_msg çağrı lib_print_string jmp döngü list_files: mov si, file_list çağrı lib_get_file_list çağrı lib_print_string jmp döngü istemi db 13, 10, "MyOS > ", 0 load_fail_msg db 13, 10, "Bulunamadı! ", 0 user_input çarpı 256 db 0 file_list çarpı 1024 db 0 %include "lib.asm"

Koda bakmadan önce web sitemizin asmschool.zip arşivinde de bulunan lib.asm kaynak kod dosyasının dahil edileceği yönergesinin bulunduğu son satıra dikkat edin. Bu, ekranla, klavyeyle, satırlarla ve disklerle çalışmak için kullanabileceğiniz kullanışlı alt yordamlardan oluşan bir kitaplıktır - bu durumda bu kaynak kod dosyasını, işletim sistemi çekirdeğinin ana kaynak kod dosyasının en sonuna sırayla ekliyoruz. ikincisini mümkün olduğunca kompakt ve güzel kılmak. için "lib.asm kütüphane rutinleri"ne bakın. Ek Bilgiler mevcut tüm rutinler hakkında.

İşletim sistemi çekirdek kodunun ilk üç satırında, ikili kodun yüklendiği 2000 segmentini işaret edecek şekilde segment kayıtlarını verilerle dolduruyoruz. Bu garanti için önemlidir doğru işlem lodsb gibi, verileri diğerlerinden değil, geçerli segmentten okuması gereken talimatlar. Bundan sonra segmentler üzerinde herhangi bir ek işlem yapmayacağız; işletim sistemimiz 64 KB RAM ile çalışacaktır!

Ayrıca kodun içinde döngünün başlangıcına karşılık gelen bir etiket vardır. Öncelikle selamlamanın çıktısını almak için lib.asm kütüphanesindeki rutinlerden biri olan lib_print_string'i kullanıyoruz. Merhaba satırından önceki 13 ve 10 baytlara atlanır Yeni hat, bu sayede selamlama herhangi bir programın çıktısından hemen sonra değil, her zaman yeni bir satırda görüntülenecektir.

Bundan sonra, lib.asm kütüphanesinden lib_input_string adlı başka bir rutin kullanırız; bu rutin, kullanıcının klavyeyi kullanarak girdiği karakterleri alır ve bunları işaretçisi SI kaydında bulunan bir arabellekte saklar. Bizim durumumuzda tampon, işletim sistemi çekirdek kodunun sonuna doğru aşağıdaki şekilde bildirilir:

Kullanıcı_giriş süreleri 256 db 0

Bu bildirim, bizimki gibi basit bir işletim sistemi için komutları tutacak kadar uzun olması gereken 256 karakterlik sıfır dolu bir ara belleğe izin verir!

Daha sonra kullanıcı girişi doğrulamasını gerçekleştiriyoruz. user_input arabelleğinin ilk baytı boşsa, kullanıcı herhangi bir komut girmeden Enter tuşuna bastı; tüm dizelerin boş karakterlerle bittiğini unutmayın. Yani bu durumda döngünün başına atlamalı ve selamlamayı tekrar yazdırmalıyız. Ancak kullanıcı herhangi bir komut girerse öncelikle ls komutunu girip girmediğini kontrol etmemiz gerekecek. Şimdiye kadar, montaj dili programlarımızda yalnızca tek baytlık karşılaştırmaları gördünüz, ancak iki baytlık değerleri veya makine sözcüklerini karşılaştırmanın da mümkün olduğunu unutmayın. Bu kodda user_input tamponundan gelen ilk makine word'ünü ls satırına karşılık gelen makine word'ü ile karşılaştırıyoruz ve eğer aynı ise aşağıdaki kod bloğuna geçiyoruz. Bu kod bloğu içinde, diskteki dosyaların virgülle ayrılmış bir listesini (file_list arabelleğinde saklanması gereken) almak, bu listeyi ekrana yazdırmak ve işleme geri dönmek için lib.asm kitaplığından başka bir rutin kullanırız. kullanıcı girişi.

Üçüncü taraf programların yürütülmesi

Kullanıcı ls komutunu girmezse program adını diskten girdiğini varsayarız, bu nedenle onu yüklemeyi denemek mantıklıdır. Lib.asm kitaplığımız, bir diskin FAT12 dosya sisteminin tablolarını ayrıştıran kullanışlı bir lib_load_file alt yordamının uygulamasını içerir: AX kaydını kullanarak dosya adı taşıyan bir satırın başına bir işaretçi alır. CX kaydını kullanarak bir program dosyasından ikili kod yüklemek için ofset değeri. Kullanıcı giriş dizesine bir işaretçiyi depolamak için zaten SI kaydını kullanıyoruz, bu nedenle bu işaretçiyi AX kaydına kopyalarız ve ardından ikili dosyayı program dosyasından yüklemek için uzaklık olarak kullanılan 32768 değerini içine koyarız. CX kaydı.

Peki neden bu değeri bir program dosyasından ikili kod yüklemek için dengeleme olarak kullanıyoruz? Bu, işletim sistemimizin hafıza haritası seçeneklerinden sadece bir tanesi. Tek bir 64KB segmentte çalıştığımız ve çekirdek ikili dosyamız 0 uzaklığında yüklendiğinden, belleğin ilk 32KB'sini çekirdek verileri için ve geri kalan 32KB'yi yüklenebilir program verileri için kullanmamız gerekiyor. Böylece ofset 32768 segmentimizin ortasında yer alıyor ve hem işletim sistemi çekirdeğine hem de yüklü programlara yeterli miktarda RAM sağlamamıza olanak tanıyor.

Bundan sonra, lib_load_file yordamı çok önemli bir işlem gerçekleştirir: eğer diskte belirtilen adda bir dosya bulamazsa veya herhangi bir nedenden dolayı onu diskten okuyamazsa, çıkar ve özel bir taşıma bayrağı ayarlar. Bu, bazı matematiksel işlemler sırasında belirlenen bir CPU durum bayrağıdır ve şu anda bizi ilgilendirmiyor olmalıdır ancak hızlı karar vermek için bu bayrağın varlığını tespit edebiliriz. Eğer lib_load_asm alt yordamı taşıma bayrağını ayarlarsa, hata mesajını yazdıran ve kullanıcı giriş döngüsünün başlangıcına dönen kod bloğuna atlamak için jc (taşınıyorsa atla) komutunu kullanırız.

Aynı durumda, transfer bayrağı ayarlanmamışsa, lib_load_asm alt yordamının ikili kodu program dosyasından 32768 adresindeki RAM'e başarıyla yüklediği sonucuna varabiliriz. Bu durumda tek ihtiyacımız olan ikili kodun yürütülmesini başlatmaktır. bu adrese yüklendi, yani kullanıcı tarafından belirtilen programı çalıştırmaya başlayın! Ve bu programda ret komutu kullanıldıktan sonra (çağıran koda geri dönmek için), kullanıcı giriş döngüsüne geri dönmemiz gerekecek. Böylece bir işletim sistemi yarattık: lib.asm kütüphanesindeki alt yordamlardan çok fazla yardım almasına rağmen, yaklaşık 40 satırlık derleme kodu içinde uygulanan, komutları ayrıştırmak ve programları yüklemek için en basit mekanizmalardan oluşur.

İşletim sistemi çekirdek kodunu birleştirmek için aşağıdaki komutu kullanın:

Nasm -f bin -o mykernel.bin mykernel.asm

Bundan sonra mykernel.bin dosyasını bir şekilde disket imaj dosyasına eklememiz gerekecek. Disk görüntülerini geridöngü aygıtlarıyla bağlama hilesine aşina iseniz, bunu kullanarak floppy.img disk görüntüsünün içeriğine erişebilirsiniz, ancak GNU Mtools'u (www.gnu.org) kullanmak olan daha kolay bir yol vardır. /yazılım /mtools). Bu, paket depolarında bulunan, MS-DOS/FAT12 dosya sistemlerini kullanan disketlerle çalışmaya yönelik bir dizi programdır. yazılım hepsi popüler Linux dağıtımları Yani yapmanız gereken tek şey dağıtımınıza yazılım paketleri yüklemek için apt-get, yum, pacman veya kullandığınız herhangi bir yardımcı programı kullanmaktır.

Uygun yazılım paketini kurduktan sonra mykernel.bin dosyasını floppy.img disk imaj dosyasına eklemek için aşağıdaki komutu çalıştırmanız gerekecektir:

Mcopy -i floppy.img mykernel.bin::/

Komutun sonundaki komik karakterlere dikkat edin: iki nokta üst üste, iki nokta üst üste ve eğik çizgi. Artık işletim sistemimizi başlatmaya neredeyse hazırız, ancak bunun için uygulamalar bulunana kadar bunun ne anlamı var? Son derece basit bir uygulama geliştirerek bu yanlış anlaşılmayı düzeltelim. Evet, artık kendi işletim sisteminiz için bir uygulama geliştireceksiniz - ineklerin saflarında otoritenizin ne kadar artacağını hayal edin. Aşağıdaki kodu test.asm adlı bir dosyaya kaydedin:

Org 32768 mov ah, 0Eh mov al, "X" int 10h ret

Bu kod, ekranda "X" karakterini görüntülemek için BIOS işlevini kullanır ve ardından kontrolü onu çağıran koda geri verir - bizim durumumuzda bu kod, işletim sisteminin kodudur. Uygulama kaynak kodunu başlatan organizasyon satırı bir CPU talimatı değil, ikili kodun RAM'e 32768 ofsetinde yükleneceğini söyleyen bir NASM assembler direktifidir, bu nedenle tüm ofsetlerin bu durumu dikkate alarak yeniden hesaplanması gerekir. .

Bu kodun da birleştirilmesi gerekiyor ve ortaya çıkan ikili dosyanın disket görüntü dosyasına eklenmesi gerekiyor:

Nasm -f bin -o test.bin test.asm mcopy -i floppy.img test.bin::/

Şimdi derin bir nefes alın, kendi çalışmanızın eşsiz sonuçlarına tanık olmaya hazırlanın ve disket görüntüsünü Qemu veya VirtualBox gibi bir PC emülatörü kullanarak önyükleyin. Örneğin bu amaçla aşağıdaki komut kullanılabilir:

Qemu-sistem-i386 -fda floppy.img

Voila: Disk görüntüsünün ilk sektörüne entegre ettiğimiz boot.img önyükleyicisi, bir selamlama görüntüleyen mykernel.bin işletim sistemi çekirdeğini yükler. Diskteki iki dosyanın (mykernel.bin ve test.bin) adlarını almak için ls komutunu yazın, ardından yürütülecek son dosyanın adını yazın ve X karakterini ekranda görüntüleyin.

Harika, değil mi? Artık ince ayar yapmaya başlayabilirsiniz komut kabuğu işletim sisteminize yeni komutların uygulamalarını ekleyin ve diske ek program dosyaları ekleyin. Bu işletim sistemini gerçek bir bilgisayarda çalıştırmak istiyorsanız serinin önceki makalesindeki "Önyükleyiciyi gerçek bir donanım platformunda çalıştırma" bölümüne başvurmalısınız - tam olarak aynı komutlara ihtiyacınız olacaktır. Gelecek ay, indirilebilir programların sistem işlevlerini kullanmasına izin vererek ve böylece kod tekrarını azaltmak için kod ayırma kavramını uygulayarak işletim sistemimizi daha güçlü hale getireceğiz. İşin büyük kısmı hâlâ devam ediyor.

lib.asm kütüphane rutinleri

Daha önce de belirtildiği gibi, lib.asm kitaplığı, çekirdeklerinizde kullanılmak üzere geniş bir dizi yararlı alt yordam sağlar. işletim sistemleri ve bireysel programlar. Bazıları henüz bu serideki makalelerde ele alınmamış talimat ve kavramları kullanıyor, diğerleri (disklerle çalışma rutinleri gibi) dosya sistemlerinin yapısıyla yakından ilgili, ancak kendinizi bu konularda yetkin görüyorsanız, uygulamalarına aşina olabilir ve çalışma prensibini anlayabilirsiniz. Ancak bunları kendi kodunuzdan nasıl çağıracağınızı anlamak daha önemlidir:

  • lib_print_string - SI kaydı aracılığıyla boş sonlandırılmış bir dizeye bir işaretçi alır ve bu dizeyi ekrana yazdırır.
  • lib_input_string - SI kaydı aracılığıyla bir arabelleğe bir işaretçi alır ve bu arabelleği, klavyeyi kullanarak kullanıcı tarafından girilen karakterlerle doldurur. Kullanıcı Enter tuşuna bastıktan sonra arabellekteki dize boş karakterle sonlandırılır ve kontrol, çağıran programın koduna geri döner.
  • lib_move_cursor - Ekrandaki imleci, DH (satır numarası) ve DL (sütun numarası) kayıtlarından geçen koordinatların bulunduğu konuma taşır.
  • lib_get_cursor_pos - sırasıyla DH ve DL kayıtlarını kullanarak geçerli satır ve sütun numaralarını almak için bu alt yordamı çağırın.
  • lib_string_uppercase - AX kaydını kullanarak boş sonlandırılmış bir dizenin başlangıcına bir işaretçi alır ve dizedeki karakterleri büyük harfe dönüştürür.
  • lib_string_length - AX kaydını kullanarak boş sonlandırılmış bir dizenin başlangıcına bir işaretçi alır ve AX kaydını kullanarak uzunluğunu döndürür.
  • lib_string_compare - SI ve DI kayıtları aracılığıyla boş sonlandırılmış iki dizenin başlangıcına işaretçiler alır ve bu dizeleri karşılaştırır. Dizeler aynıysa taşıma bayrağını ayarlar (jc taşıma bayrağına bağlı olarak bir atlama talimatı kullanmak için) veya dizeler farklıysa bu bayrağı temizler (jnc komutunu kullanmak için).
  • lib_get_file_list - SI kaydı aracılığıyla bir arabelleğin başlangıcına bir işaretçi alır ve diskten virgülle ayrılmış dosya adları listesini içeren boş sonlandırılmış bir dizeyi bu arabelleğe koyar.
  • lib_load_file - AX kaydını kullanarak dosya adı içeren bir dizenin başlangıcına bir işaretçi alır ve dosyanın içeriğini CX kaydı tarafından verilen ofsette yükler. BX kaydını kullanarak belleğe kopyalanan bayt sayısını (yani dosyanın boyutunu) döndürür veya belirtilen adda bir dosya bulunamazsa taşıma bayrağını ayarlar.

Hemen söylüyorum, “Kahretsin, bir Popov daha” düşünceleriyle yazıyı kapatmayın. Onun sadece yalanmış bir Ubuntu'su var ve bende çekirdek ve uygulamalar dahil her şey sıfırdan var. Yani kesinti altında devam.

İşletim sistemi grubu: Burada.
Öncelikle size bir ekran görüntüsü atacağım.

Artık yok ve şimdi neden yazdığım hakkında daha ayrıntılı olarak.

Perşembe günü sıcak bir nisan akşamıydı. Çocukluğumdan beri bir işletim sistemi yazmayı hayal ediyordum ve birdenbire şunu düşündüm: "Artık artılarını ve asm'ı biliyorum, neden hayalimi gerçekleştirmeyeyim?". Bu konuyla ilgili siteleri Google'da araştırdım ve Habr'dan bir makale buldum: "İşletim Sistemi yazmaya nasıl başlanır ve durdurulmaz". Aşağıdaki OSDev Wiki bağlantısı için yazarına teşekkür ederiz. Oraya gittim ve çalışmaya başladım. Tek bir makalede minimum işletim sistemiyle ilgili tüm veriler vardı. Cross-gcc ve binutils oluşturmaya başladım ve ardından her şeyi oradan yeniden yazdım. "Merhaba çekirdek dünyası!" yazısını gördüğümde sevincimi görmeliydiniz. Hemen sandalyeden atladım ve fark ettim ki pes etmeyeceğim. "Konsol" yazdım (tırnak içinde, klavyeye erişimim yoktu), ama sonra bir pencere sistemi yazmaya karar verdim. Sonuç olarak işe yaradı ancak klavyeye erişimim olmadı. Daha sonra X Pencere Sistemini temel alan bir isim bulmaya karar verdim. Googled Y Pencere Sistemi - öyle. Sonuç olarak OS365 pre-alpha 0.1'de yer alan Z Window System 0.1 adını verdi. Ve evet benden başka kimse görmedi. Daha sonra klavye desteğinin nasıl uygulanacağını buldum. Hiçbir şeyin, hatta pencere sisteminin bile olmadığı ilk versiyonun ekran görüntüsü:

Gördüğünüz gibi metin imlecini bile hareket ettirmedi. Sonra birkaç tane yazdım basit uygulamalar Z'ye dayalı. Ve işte 1.0.0 alfa sürümü. Pek çok şey vardı, hatta sistem menüsü bile. A dosya yöneticisi ve hesap makinesi işe yaramadı.

Sadece güzelliğe önem veren bir arkadaşım tarafından doğrudan terörize edildim (Mitrofan, üzgünüm). “VBE modunu 1024 * 768 * 32 yıkadım, yıkadım, yıkadım! Sarhoş oldular! Zaten onu dinlemekten yorulmuştum ve yine de onu yıkadım. Aşağıda uygulama hakkında daha fazla bilgi bulabilirsiniz.

Her şeyi önyükleyicim GRUB "ohm ile yaptım. Bununla Multiboot başlığına birkaç sihirli satır ekleyerek grafik modunu sorunsuz bir şekilde ayarlayabilirsiniz.

HİZALAMA'yı ayarla, 1<<0 .set MEMINFO, 1<<1 .set GRAPH, 1<<2 .set FLAGS, ALIGN | MEMINFO | GRAPH .set MAGIC, 0x1BADB002 .set CHECKSUM, -(MAGIC + FLAGS) .align 4 .long MAGIC .long FLAGS .long CHECKSUM .long 0, 0, 0, 0, 0 .long 0 # 0 = set graphics mode .long 1024, 768, 32 # Width, height, depth
Daha sonra Multiboot bilgi yapısından karebuffer adresini ve ekran çözünürlüğünü alıp pikselleri oraya yazıyorum. VESA her şeyi çok karıştırdı - RGB renkleri ters sırayla girilmelidir (R G B değil, B G R). Birkaç gündür anlamadım - pikseller neden görüntülenmiyor!? Sonunda 16 renk sabitinin değerlerini 0...15'ten RGB eşdeğerlerine değiştirmeyi unuttuğumu fark ettim. Sonuç olarak, onu serbest bıraktım, aynı zamanda degrade arka planı da yıkadım. Daha sonra bir konsol, 2 uygulama yaptım ve 1.2'yi yayınladım. Ah evet, neredeyse unutuyordum; işletim sistemini şu adresten indirebilirsiniz:

montajcı

montajcı(İngilizce montajdan - montaja) - montaj dilinden makine dili komutlarına kadar bir derleyici.
Her işlemci mimarisi ve her işletim sistemi veya işletim sistemi ailesi için bir Assembler vardır. Ayrıca, bir mimariye (veya bir işletim sistemi ortamında) sahip makinelerin başka bir hedef mimari veya başka bir işletim sistemi için programlar birleştirmesine ve yürütülmeye uygun bir formatta yürütülebilir kod elde etmesine olanak tanıyan "çapraz montajcılar" da vardır. hedef mimaride veya hedef ortamda.İşletim Sistemi.

x86 mimarisi

DOS için birleştiriciler

DOS işletim sistemi için en iyi bilinen derleyiciler Borland Turbo Assembler (TASM) ve Microsoft Macro Assembler (MASM) idi. Ayrıca bir zamanlar basit montajcı A86 popülerdi.
Başlangıçta yalnızca 16 bitlik talimatları destekliyorlardı (Intel 80386 işlemcinin ortaya çıkmasından önce). TASM ve MASM'nin sonraki sürümleri hem 32 bit talimatları, hem de daha modern işlemcilerde sunulan tüm talimatları ve mimariye özgü talimat sistemlerini (örneğin, MMX, SSE, 3DNow!, vb.) destekler.

Microsoft Windows

Microsoft Windows işletim sisteminin gelişiyle birlikte, TASM32 adlı bir TASM uzantısı ortaya çıktı ve bu, Windows ortamında çalışacak programlar oluşturmayı mümkün kıldı. Tasm'ın bilinen en son sürümü, MMX talimatlarını destekleyen ve şu anda Turbo C++ Explorer'da bulunan 5.3'tür. Ancak resmi olarak programın gelişimi tamamen durduruldu.
Microsoft, Microsoft Macro Assembler adlı bir ürüne sahiptir. DDK'larda yer alan en son sürümlerle günümüze kadar gelişmeye devam etmektedir. Ancak programın DOS için programlar oluşturmayı amaçlayan sürümü geliştirilmiyor. Ayrıca Stephen Hutchesson, "MASM32" adlı bir MASM programlama paketi oluşturdu.

GNU ve GNU/Linux

GNU işletim sistemi, Intel sözdizimini kullanan diğer popüler derleyicilerin çoğunun aksine, AT&T sözdizimini kullanan gaz birleştiriciyi (GNU Assembler) içeren gcc derleyicisini içerir.

Taşınabilir montajcılar

Çeşitli işletim sistemleri için versiyonları mevcut olan ve bu sistemler için nesne dosyaları elde etmenizi sağlayan açık bir assembler projesi de bulunmaktadır. Bu çeviriciye NASM (Netwide Assembler) denir.
YASM, NASM'nin sıfırdan lisanslanan yeniden yazılmış bir sürümüdür (bazı istisnalar hariç).
FASM (Düz Assembler), yeniden lisanslamayı yasaklayacak şekilde değiştirilmiş BSD lisansı altındaki genç bir montajcıdır (GNU GPL kapsamında). KolibriOS, GNU/Linux, MS-DOS ve Microsoft Windows sürümleri mevcuttur, Intel sözdizimini kullanır ve AMD64 talimatlarını destekler.

RISC mimarileri


MCS-51
AVR
Şu anda 2 Atmel derleyicisi var (AVRStudio 3 ve AVRStudio4). İkinci versiyon, ilkinde pek başarılı olmayanı düzeltmeye yönelik bir girişimdir. WinAVR'da ayrıca bir derleyici de bulunmaktadır.
KOL
AVR32
MSP430
PowerPC

Montaj ve derleme

Bir montaj dili programını nesne koduna çevirme işlemine montaj adı verilir. Derlemenin aksine montaj, az çok kesin ve geri döndürülebilir bir süreçtir. Montaj dilinde her anımsatıcı bir makine talimatına karşılık gelirken, üst düzey programlama dillerinde her ifadenin arkasına çok sayıda farklı talimat gizlenebilir. Prensip olarak, bu bölüm oldukça keyfidir, bu nedenle bazen montajcı programların çevirisine derleme de denir.

derleme dili

derleme dili- insan algısına uygun, makine talimatlarını kaydetmeye yönelik bir format olan bir tür düşük seviyeli programlama dili. Kısaca söylemek gerekirse, buna genellikle montajcı denir ve bu doğru değildir.

Montaj dili komutları, işlemci komutlarına bire bir karşılık gelir ve aslında, komutların ve bunların argümanlarının uygun bir sembolik notasyon biçimini (anımsatıcı kod) temsil eder. Montaj dili aynı zamanda temel yazılım soyutlamaları da sağlar: programın bölümlerini ve verileri sembolik adlara sahip etiketler aracılığıyla bağlamak (montaj sırasında her etiket için bir adres hesaplanır, ardından etiketin her geçtiği yerde bu adres değiştirilir) ve direktifler.
Montaj direktifleri, veri bloklarını (açıkça açıklanan veya bir dosyadan okunan) programa eklemenizi sağlar; belirli bir parçayı belirli sayıda tekrarlamak; parçayı duruma göre derleyin; parça yürütme adresini bellek konum adresinden farklı olacak şekilde ayarlayın[belirtin!]; derleme sırasında etiket değerlerini değiştirin; parametreler vb. ile makro tanımlarını kullanın.
Prensip olarak her işlemci modelinin kendi talimat seti ve karşılık gelen montaj dili (veya lehçesi) vardır.

Avantajlar ve dezavantajlar

Assembly dilinin avantajları

Minimum yedek kod miktarı, yani daha az talimat ve bellek erişiminin kullanılması, programın hızını artırmanıza ve boyutunu azaltmanıza olanak tanır.
İstenilen platformun yeteneklerinin tam uyumluluğunun ve maksimum kullanımının sağlanması: bu platformun özel talimatlarının ve teknik özelliklerinin kullanılması.
Çeviricide programlama yaparken özel özellikler kullanılabilir hale gelir: donanıma, G / Ç bağlantı noktalarına ve özel işlemci kayıtlarına doğrudan erişimin yanı sıra kendi kendini değiştiren kod yazma yeteneği (yani metaprogramlama ve bir yazılım yorumlayıcısına ihtiyaç duymadan) .
İşletim sistemlerinde uygulanan en son güvenlik teknolojileri, talimatların eşzamanlı olarak yürütülmesi ve aynı bellek alanına yazılması olasılığını (BSD sistemlerinde W^X teknolojisi, Windows'ta DEP) dışladığından, kendi kendini değiştiren kod oluşturmaya izin vermez.

Assembly dilinin dezavantajları

Çok miktarda kod ve çok sayıda ek küçük görev, kodun okunmasının ve anlaşılmasının çok zor hale gelmesine ve dolayısıyla programda hata ayıklamanın ve iyileştirmenin yanı sıra programlamayı uygulamanın zorluğuna yol açar paradigmalar ve diğer sözleşmeler. bu da işbirlikçi gelişimin karmaşıklığına yol açar.
Daha az kullanılabilir kütüphane, birbirleriyle düşük uyumluluk.
Diğer platformlara taşınabilir değildir (ikili uyumlu olanlar dışında).

Başvuru

Avantaj ve dezavantajları doğrudan takip eder.
Büyük programları assembler'da yazmak son derece sakıncalı olduğundan, üst düzey dillerde yazılırlar. Çeviricide kritik önem taşıyan küçük parçalar veya modüller yazarlar:
performans (sürücüler);
kod boyutu (önyükleme sektörleri, mikro denetleyiciler ve sınırlı kaynaklara sahip işlemciler için yazılım, virüsler, yazılım koruması);
özel özellikler: donanım veya makine koduyla, yani işletim sistemi yükleyicileriyle, sürücülerle, virüslerle, koruma sistemleriyle doğrudan çalışma.

Montaj kodunu diğer dillere bağlama

Programın yalnızca parçaları çoğunlukla çeviricide yazıldığından, bunların diğer dillerdeki geri kalan parçalarla ilişkilendirilmesi gerekir. Bu 2 ana yolla elde edilir:
Derleme zamanında- montajcı dilinde yazma prosedürleri de dahil olmak üzere, özel dil direktifleriyle programa montajcı parçalarının (eng. satır içi montajcı) eklenmesi. Yöntem, basit veri dönüşümleri için uygundur, ancak yüksek seviyeli diller tarafından desteklenmeyen birçok giriş ve çıkışa sahip alt rutinler de dahil olmak üzere veri ve alt rutinlere sahip tam teşekküllü birleştirici kodu, bu yöntem kullanılarak yapılamaz.
Yapım aşamasında veya ayrı bir derleme. Bağlantı modüllerinin etkileşime girmesi için bağlantı işlevlerinin gerekli çağrı kurallarını ve veri türlerini desteklemesi yeterlidir. Ayrı modüller, montaj dili de dahil olmak üzere herhangi bir dilde yazılabilir.

Sözdizimi

Montaj dillerinin sözdizimi için genel kabul görmüş bir standart yoktur. Ancak çoğu montaj dili geliştiricisinin uyduğu standartlar vardır. Bu standartların başlıcaları Intel sözdizimi ve AT&T sözdizimidir.

Talimatlar

Talimat yazmanın genel formatı her iki standart için de aynıdır:

[etiket:] işlem kodu [işlenenler] [;yorum]

burada işlem kodu doğrudan işlemciye verilen talimatın anımsatıcısıdır. Üzerine önekler eklenebilir (tekrarlamalar, adresleme türü değişiklikleri vb.).
İşlenenler sabitler, kayıt adları, RAM adresleri vb. olabilir. Intel ve AT&T standartları arasındaki farklar esas olarak işlenenlerin listelenme sırası ve farklı adresleme yöntemleri için sözdizimiyle ilgilidir.
Kullanılan anımsatıcılar genellikle aynı mimariye veya mimari ailesine ait tüm işlemciler için aynıdır (yaygın olarak bilinen anımsatıcılar arasında Motorola, ARM, x86 işlemciler ve denetleyiciler bulunur). Bunlar işlemci özelliklerinde açıklanmıştır. Olası istisnalar:
Birleştirici platformlar arası AT&T sözdizimini kullanıyorsa (orijinal anımsatıcılar AT&T sözdizimine dönüştürülür)
Başlangıçta anımsatıcı yazmak için iki standart olsaydı (talimat sistemi başka bir üreticinin işlemcisinden miras alındı).
Örneğin, Zilog Z80 işlemci, Intel i8080 komut setini devraldı, genişletti ve anımsatıcıları (ve kayıt tanımlarını) kendi yöntemiyle değiştirdi. Mesela Intel'in mov'unu ld olarak değiştirdim. Motorola Fireball işlemcileri, Z80 komut setini devraldı ve onu biraz kısalttı. Ancak Motorola resmi olarak Intel anımsatıcılarına geri döndü. Ve şu anda Fireball birleştiricilerinin yarısı Intel anımsatıcılarıyla, yarısı da Zilog anımsatıcılarıyla çalışıyor.

direktifler

Talimatlara ek olarak program, direktifler içerebilir: doğrudan makine talimatlarına çevrilmeyen ancak derleyicinin çalışmasını kontrol eden komutlar. Kümeleri ve sözdizimleri önemli ölçüde farklılık gösterir ve donanım platformuna değil, kullanılan derleyiciye bağlıdır (aynı mimari ailesi içindeki dillerin lehçelerine yol açar). Bir "beyefendiler dizisi" olarak şunları ayırt edebiliriz:
verileri tanımlama (sabitler ve değişkenler)
programın bellekteki organizasyonunu ve çıktı dosyasının parametrelerini yönetmek
derleyici modunu ayarlama
prosedür ve işlevlerin tasarımından (prosedürel programlama paradigmasının uygulanmasını basitleştirmek için) koşullu yapılara ve döngülere (yapılandırılmış programlama paradigması için) kadar her türlü soyutlama (yani üst düzey dillerin unsurları)
makrolar

Program örneği

TASM lehçesindeki x86 mimarisi için MS-DOS'a yönelik Merhaba dünya programının bir örneği:

.MODEL KÜÇÜK KOD SEGMENTİ VARSAYIN CS:CODE, DS:CODE ORG 100h START: mov ah,9 mov dx,OFFSET Msg int 21h int 20h Msg DB "Merhaba Dünya",13,10,"$" KOD SON SON BAŞLANGIÇ

"Montaj dili" teriminin kökeni ve eleştirisi

Bu dil türü, adını bu dillerden çevirmenin (derleyici) adından almıştır - montajcı (İngilizce montajcı - montajcı). İkincisinin adı, ilk bilgisayarlarda daha yüksek seviyeli dillerin bulunmamasından ve çevirici kullanarak program oluşturmanın tek alternatifinin doğrudan kodlarla programlama olmasından kaynaklanmaktadır.
Rusça'daki montaj diline genellikle "montajcı" (ve bununla ilgili bir şey - "montajcı") denir; bu, kelimenin İngilizce çevirisine göre yanlıştır, ancak Rus dilinin kurallarına uygundur. Bununla birlikte, birleştiricinin (programın) kendisi de "birleştirici dili derleyicisi" değil, yalnızca "birleştirici" olarak adlandırılır.
"Assembly dili" teriminin kullanılması aynı zamanda tek bir düşük seviyeli dilin veya en azından bu tür diller için bir standardın olduğu yanılgısına da yol açabilir. Belirli bir programın yazıldığı dili adlandırırken, hangi mimariye yönelik olduğunu ve dilin hangi lehçesinde yazıldığını belirtmek istenir.

Bugün Kunstkamera'mızda, saf çevirici ile yazılmış bir işletim sistemi ilginç bir örnektir. Sürücüler, grafiksel kabuk, düzinelerce önceden yüklenmiş program ve oyunla birlikte bir buçuk megabayttan az yer kaplar. Olağanüstü hızlı ve ağırlıklı olarak Rus işletim sistemi Hummingbird ile tanışın.

Hummingbird'ün gelişimi 2009 yılına kadar oldukça hızlı ilerledi. Kuş, minimum ilk Pentium ve sekiz megabayt RAM gerektiren farklı donanımlarla uçmayı öğrendi. Hummingbird'ün minimum sistem gereksinimleri şöyle:

  • CPU: 100 MHz'de MMX'siz Pentium, AMD 5x86 veya Cyrix 5x86;
  • RAM: 8MB;
  • Grafik Kartı: VESA uyumlu, VGA modu desteği (640 × 480 × 16).

Modern Hummingbird, 2009'un sonunda piyasaya sürülen en son resmi sürümün düzenli olarak güncellenen "gece sürümüdür". 20 Ağustos 2017 tarihli 0.7.7.0+ sürümünü test ettik.

UYARI

Varsayılan ayarlarda KolibriOS'un BIOS üzerinden görülebilen disklere erişimi yoktur. Bu ayarı değiştirmeden önce dikkatlice düşünün ve yedekleme yapın.

Gecelik yapılanmalardaki değişiklikler küçük olsa da yıllar içinde yeterince birikmiştir. Güncellenen Hummingbird, FAT16-32 / ext2 - ext4 bölümlerine yazabilir ve okuma modunda diğer popüler dosya sistemlerini (NTFS, XFS, ISO-9660) destekler. USB ve ağ kartları için destek eklendi, TCP / IP yığını ve ses codec bileşenleri eklendi. Genel olarak, GUI'li ultra hafif işletim sistemine bir kez bakıp başlatma hızından etkilenmek yerine, içinde zaten bir şeyler yapabilirsiniz.



Önceki sürümler gibi, en yeni Hummingbird de düz birleştiricide (FASM) yazılmıştır ve bir disket kaplar - 1,44 MB. Bu sayede tamamen özel bir hafızaya yerleştirilebilir. Örneğin zanaatkarlar KolibriOS'u doğrudan Flash BIOS'a yazdılar. Çalışma sırasında tamamen bazı işlemcilerin önbelleğinde bulunabilir. Bir düşünün: tüm işletim sistemi, programlar ve sürücülerle birlikte önbelleğe alındı!

BİLGİ

kolibrios.org sitesini ziyaret ederken tarayıcı tehlikeye karşı uyarıda bulunabilir. Görünüşe göre bunun nedeni dağıtımdaki montajcı programlarıdır. Artık VirusTotal siteyi tamamen güvenli olarak tanımlıyor.

"Hummingbird" bir disketten, sabit sürücüden, flash sürücüden, Canlı CD'den veya sanal bir makineden kolayca yüklenir. Öykünme için işletim sistemi türünü “diğer” olarak belirtmek, ona bir işlemci çekirdeği ve bir miktar RAM tahsis etmek yeterlidir. Bir disk bağlamanıza gerek yoktur ve DHCP'li bir yönlendirici varsa Hummingbird anında İnternet'e ve yerel ağa bağlanacaktır. İndirdikten hemen sonra bir bildirim göreceksiniz.


Bir sorun, HTTPS protokolünün yerleşik Hummingbird tarayıcısı tarafından desteklenmemesidir. Bu nedenle içindeki siteye bakmak, Google, Yandex, Wikipedia, Sberbank sayfalarını açmak mümkün değildi ... aslında alışılagelmiş bir adres yoktu. Herkes uzun zaman önce güvenli bir protokole geçti. Karşılaştığım eski usul saf HTTP'ye sahip tek site "Rusya Hükümeti portalı" idi, ancak bir metin tarayıcısında pek iyi görünmüyordu.



Hummingbird'ün görünüm ayarları yıllar geçtikçe iyileşti ancak hala ideal olmaktan uzak. a tuşuna bastığınızda Hummingbird açılış ekranında desteklenen video modlarının bir listesi görüntülenir.



Mevcut seçeneklerin listesi küçüktür ve istenilen çözünürlük bu listede olmayabilir. AMD (ATI) GPU'lu bir grafik kartınız varsa, hemen özel ayarlar ekleyebilirsiniz. Bunu yapmak için -m parametresini ATIKMS önyükleyicisine iletmeniz gerekir. X X , Örneğin:

/RD/1/SÜRÜCÜLER/ATIKMS -m1280x800x60 -1

Burada /RD/1/DRIVERS/ATIKMS, önyükleyicinin (RD - RAM Disk) yoludur.

Sistem çalışırken seçilen video modu vmode komutu ile görüntülenebilir ve (teorik olarak) manuel olarak değiştirilebilir. Hummingbird sanal bir makinede çalışıyorsa bu pencere boş kalacaktır, ancak temiz bir önyükleme ile Intel video sürücüleri i915'ten Skylake dahil olmak üzere eklenebilir.

Şaşırtıcı bir şekilde KolibriOS'a çok sayıda oyun sığıyor. Bunların arasında mantıksal ve atari oyunları, etiketler, bir yılan, tanklar (hayır, WoT değil) - tam bir "Oyun Merkezi" var! Doom ve Quake bile Hummingbird'e taşındı.



Bir diğer önemli şey de FB2READ okuyucusuydu. Kiril alfabesiyle doğru şekilde çalışır ve metin görüntüleme ayarlarına sahiptir.



Tüm kullanıcı dosyalarını bir USB flash sürücüye kaydetmenizi öneririm, ancak bunun bir USB 2.0 bağlantı noktası aracılığıyla bağlanması gerekir. NTFS dosya sistemine sahip 16 GB kapasiteli USB 3.0 flash sürücümüz (USB 2.0 bağlantı noktasında) hemen belirlendi. Dosya yazmanız gerekiyorsa, FAT32 bölümlü bir USB flash sürücüyü bağlamanız gerekir.



Hummingbird dağıtımı üç dosya yöneticisi, resim ve belgeleri görüntülemeye yönelik yardımcı programlar, ses ve video oynatıcılar ve diğer kullanıcı uygulamalarını içerir. Ancak odak noktası montaj dilinin geliştirilmesidir.



Yerleşik metin düzenleyicide ASM sözdizimi vurgulaması bulunur ve hatta yazılan programları anında çalıştırmanıza olanak tanır.



Geliştirme araçları arasında i386 Windows, Linux ve KolibriOS için Oberon-07/11 derleyicisinin yanı sıra düşük seviyeli emülatörler de bulunmaktadır: E80 - ZX Spectrum emülatörü, FCE Ultra - en iyi NES emülatörlerinden biri, DOSBox v.0.74 ve diğerleri. Hepsi özel olarak Hummingbird'e taşındı.

KolibriOS'tan birkaç dakika ayrılırsanız ekran koruyucu başlayacaktır. MenuetOS'a bir referans görebileceğiniz ekranda kod satırları çalışacaktır.

Devamı yalnızca üyelere açıktır

Seçenek 1. Sitedeki tüm materyalleri okumak için "site" topluluğuna katılın

Belirtilen süre boyunca topluluğa üye olmak, TÜM Hacker materyallerine erişmenizi sağlayacak, kişisel kümülatif indiriminizi artıracak ve profesyonel bir Xakep Skoru puanı biriktirmenize olanak tanıyacak!


Tepe