Retro UNIX 386 v2 için kernel programlama/geliştirme notları... (Erdoğan Tan).. Tarih sırasına göre günlük taslak notlar. ------------------------------------------------------------------------------ (Yapılmış ve yapılacak işlemleri/değişiklikleri açıklamak ve hatırlamak için.) benioku3.txt'den devam.. (O dosyanın sonunda Retro UNIX v1.2, Kernel v0.2.2.2 tamamlanmış oldu) ..burada yazdıklarım Retro UNIX v1.2, Kernel v0.2.2.3'in geliştirme notları. 12/07/2022'de ... *) Retro UNIX 386 v1.1'de IBM PC/AT (ve XT-286) ROM BIOS int13h disk fonksiyonlarını esas alan diskio proedürlerinde sadeleştirme yaptım. Retro UNIX'de kullanılmayan fonksiyonları ve fazla kodları sildim. (diskio.s, diskdata.inc ve diskbss.inc dosyalarında disket ve hard disk için reset/read/write dışındaki fonsiyonların silinmesiyle sadeleştirme ve kısalma oldu ve disket prosedürlerinde bir adet bugfix oldu) Bu değişiklikleri versiyon 1.1 ve versiyon 1.0'da denedim. Hatasız olduğunu doğrulayınca versiyon 1.2'ye uyarladım. 16/07/2022'de .. (15/07/2022 akşamı başlayarak) *) u8.s'de karmaşık ve orijinal unix v1'deki buffer handling kalıntıları taşıyan buffer handling (arabellek kullanım) kodunu özgün/original basit kodla değiştirdim. Buffer header'daki buffer status kısmında bit 0 valid buffer flag, bit 1 write/modified flag, bit 2 read flag diğerleri kullanılmıyor şeklinde basitleşti. Diske yazma veya okuma işleminden önce boş buffer (bit 0 = 0) aranıyor, bulunuyorsa kayıtlanıyor, sektör zaten bir buffer'da kullanılmışsa (status bit 0 = 1, device ve LBA aynı) o buffer ile devam ediliyor. Free (invalid) yok ise, en eski kullanılmış (en son kullanılan buffer daima buffer pointer listesinin başına alınıyor) buffer yeni sektöre atanıyor (status bit 0 = 0 yapılarak, geçersizleştiriyor). 'wslot' status bit 1'i 1 yapıyor; 'dskrd' status bit 2'yi 1 yapıyor ama validation bit 0 olarak bırakılıyor. Disk r/w işlemi başarılı olursa, 'poke' validation flag'ını yani status bit 0'i 1 diğer bitleri 0 yapıyor. Böylece o bloklar/sektörler bufferlarda hazır tutulmuş oluyor. (Okuma veya yazma hatası olursa ilgili buffer geçersizleştiriyor ki, diskteki içerik ile buffer'daki içerik farklı olmasın. Kernelde mevcut haliyle 16 adet buffer (16*520 byte) tanımlı. u8.s'ye içine yeni buffer yöntemi açıklamalarını yazdım. ux.s'deki 1 byte'lık 'active' alanını artık (u8.s'de) kullanılmadığı için iptal ettim. 17/07/2022'de ... *) diskio.s, u0.s, u1.s, u5.s, memory.s ve unix386.s içinde gereksiz 16 bit shift (shr, shl) kodlarını 32 bite dönüştürdüm (bazı gereksiz 66h prefixlerini kernel kodundan çıkarmak için) ve diskio.s içindeki gereksiz 'xor ch, ch'yi iptal ettim. 18/07/2022'de ... *) diskio.s'de 'DMA_SETUP' da iyileştirme yaptım (sadece 512 byte/sector disketler tanımlı olduğundan gereksiz kısmı iptal edip, direkt 512 byte'a göre kodu kısalttım). u2.s'de 'maknod ve 'anyi' içinde 'wslot' la ilgili gereksiz pusp-pop'ları iptal ettim (ebp artık 'wslot' içinde değişmiyor). 19/07/2022'de ... *) Orijinal unix v1 kernel kodu da dahil olamak üzere, u6.s'deki 'dskw' prosedüründe ('sioreg' içinde file ofset artırma dolayısıyla) ve u8.de'ki 'bwrite' prosedürlerinde ('dioreg' içinde file offset artırma) dolayısıyla 'dskwr' deki diske yazma işlemi error ile dönse (yazma gerçekleşmese dahi, file offset değişmiş oluyordu. Oysa write (modified) sector buffer geçersiz hale geliyordu ve bir sonraki yazmada file offset (veya disk block pointer) aynı adrese yeniden yazılması gerekirken.. (file offset yazma hatasında dahi, 'dskwr'den önce gelen 'sioreg' ve 'dioreg' prosedürleri içinde ilerletildiği için), bir sonraki sektöre veya aynı sektör içinde yanlış ofsete yazılabiliyordu. Kullanıcı programı disk yazma hatasından sonra aynı sektörü tekrar yazmayı deneyebilir veya dosya pointer'ını başa almadan ve dosyayı silmeden devam edebilir. Böyle durumlarda dosya ve disk içeriğinin (daha da) bozulmaması için, diske yazma ('syswrite') işleminde, sadece disk sektörüne yazma başarıyla gerçekleşirse, file offset pointer (yazılan byte sayısı kadar) ilerleyecek şekilde önemli düzeltmeler yaptım. u6.s'deki 'dskw' prosedüründe, 'sioreg' prosedüründe ve 'sioreg' değiştiği için 'dskr' prosedüründe u8.s'deki 'bwrite' ve dioreg' prosedürlerinde ve 'dioreg' değiştiği için 'bread' prosedüründe değişiklik yaptım. 24/07/2022'de ... *) keyboard.s içinde gereksiz int 16h kalıntılarını temizledim, interrupt emülasyonu (pushfd, push cs, near call ve iret) yerine near call return ayarları yaptım. 08/08/2022'de ... *) 'diskinit.s' içinde ekleme ve düzeltme (TRDOS 386 v2.0.2 'diskinit.s' dosyası QEMU emulator programında hard diskin tanınmasını sağlayan ek kod içeriyor, 2020 yılı kodu, o kodu Retro UNIX 386 v1 'diskinit.s' dosyasına ekledim. (Daha önce eklemem iyi olurdu, unutmuşum; TRDOS 386 kernelinin 18/04/2021 tarihli 2.0.4 versiyonunda da eksik, en son 17/03/2021 tarihli Kernrel v2.0.2'de kullanmışım !?) *** Retro UNIX 386 v1.2 (Kernel v0.2.2.3) değişiklik/düzeltme notları sonu. ***