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.) 25/03/2021 (Boğazköy) iopen çağrılarına bakılacak iopen içinde access'e dx'in gelmesi lazım... ayrıca sysopen, syscreate, maknod'da flags kısımlarında düzeltme lazım... namei'de de flags kısmı düzeltme lazım, directory flag aynı zamanda regular file şartına da bağlı... bu bakımdan düzeltilecek... 26/03/2021 access, sysexec ve namei tamam tüm prosedürlerde hem access (dx ile giriş olmalı), hem iopen hem iclose hem de flaglar kontrol edilecek. ; 01/04/2021 maknod içi imap tamam.. mkdir kontrol edilecek ; 02/04/2021 maknod ve mkdir tamam sysmkdir tamam... ; 04/04/2021 _fclose ve anyi tamam (imap update flagları tamam) fakat anyi ile ilgili 'itrunc' içinde 'free' sb, fbm bufferları ile ilgili olarak eski tip işlem yapıyor ve sync'yi zorluyor.. sync anyi içinde olursa daha iyi (aslında bir sonraki versiyonda sblock içine 'last inode' kayıtı atılırsa last inode varsa düzeltme işlemleri gerekir sync'nin last inode'u sıfırlaması gerekir.) sysclose ve iclose ile devam iclose özel dosyalarda external device driver durumuna göre chdev ve bdev duruma göre ilgili prosedürleri çağıracak... regular dosya ise hiç bir şey yapmadan çıkacak... iclose içinde 'iget' çağırılması lazım ki, flags, major, minor ve öteki parametrelere göre kapatma yapılabilsin. internal device open ve close işlemlerinde error prosedürüne sadece sysopen ve syslose'da dallanacak. iopen ve iclose içinden sadece error code (eax için ve cf=1 ise döndürülecek) yani hiç bir open ve close prosedürü error'e dallanmayacak. stc ve eax'de error kodu ile dönecek. 10/04/2021 iclose, sysclose, sysstty tamam.. 11/04/2021 TRDOS 386 v2.0.3'e göre kontroller... diskbss.s tamam diskdata.s tamam diskinit.s tamam diskio.s tamam 12/04/2021 ifs.s şimdilik kontrol edilmeyecek keyboard.s tamam video.s kısmen tamam, 32 bit push/pop tamam 16/04/2021 video.s tamam (VGA hariç) vidata.s tamam kbdata.s tamam 17/04/2021 memory.s tamam (NOT: TRDOS 386 v2'den eksik kısımlar var) 18/04/2021 stddev.s tamam sysdefs.s tamam u0.s de kaldım. pdrv_init gerekiyor buffer init'te önemli değişiklik olmalı. 19/04/2021 prdv_init tamam root file system için ldrv0 oluşturulması kısmen tamam 20/04/2021 rdrv_init tamam 23/04/2021 ldrv_init kod yazma devam ediyor 24/04/2021 system buffer'ları yeniden düzenlendi (sblock, mbr, bsbuf, imap, itable) u5.s 'imap' içindeki 'imapbuf' 'im.buffer' olarak değiştirildi rdrv_init değişen buffer yapısı dolayısıyla değiştirildi ldrv_init tamam u0.s tamam u1.s'den devam edeceğim 25/04/2021 u0.s de 'rdrv_init' ve 'ldrv_init' düzeltmesi tamam u0.s'ye 'get_ldrvt' eklendi u5.s modifikasyonları ('alloc', 'set_sysbuf_hdr') yapıldı u0.s düzeltmeleri devam ediyor ; 27/04/2021 u0.s'de file buffer'larının diske yazılması ('flush_db') tamam 'sync' prosedürü değişti, file buffer header'lar değişti (ux.s) u5.s'de değişiklik gerekiyor (değişen file buffer header'lardan dolayı) u2.s'deki 'fclose' içinde 'iclose' var, oradan file buffer flush olması lazım çünkü sysexit fclose kullanıyor veya sysexit içinde sync olması lazım. (o prosese ait bufferlar diske yazılmalı... (ilgili ldrv diskleri senkronize edilmeli) ; 30/04/2021 u1.s 'sysret' deki 'sync' (u0.s) değişiklilerini yaptım ve u1.s sysexit' deki 'sync_u' (u0.s) kodunu yazdım. 'sync_u' [u.uno] için önce file buffer'ları sonra system buffer'ları LDRV'lere yazıyor (diğer processlerin buffer'ları yazılmıyor) 'sync' ise [ii] için önce file buffer'ı sonra o LDRV'ye ait system buffer'ları diske yazıyor. Diğer 'inode'lar için yazma yapılmıyor. 'sysret' modifiye edilmiş inode'ın buffer'larını temizlemiş oluyor. 'sysexit' ise 'sysret' deki' sync'den geri kalan bufferları temizlemiş oluyor. (dosya açık iken 'sysexit' çağrısı gelirse faydalı olur, diğer tüm çağrılarda 'error' veya 'sysret' devreye giriyor.). ; 01/05/2021 u1.s'de 'syswait' gözden geçirmesi tamam. u1.s tamam ux.s de u.cdrv'i 1 byte'a indirdim u2.s değişikliklerinde 'systime' da kaldım ; 02/05/2021 u2.s 'sysexec' set UID, set GID düzeltmesi yaptım u5.s 'access' owner/group düzeltmesi yaptım (owner için UID ve GID aynı olmalı kuralı) ux.s super block structure'na FmapIndex, ImapIndex, ItableIndex ekledim. Bunlar buffer'ların hangi sektörü içerdiğine ilişkin. u0.s'de '_smod_' FmapIndex, ImapIndex, ItableIndex düzeltmeleri yaptım. u5.s de 'imap' düzeltmeleri yapıldı. (her ldrv için ayrı imap bufferı) u2.s 'maknod' tamam (aşağıya doğru devam) ; 06/05/2021 u2.s tamam ('anyi' tamam) u3.s tamam (hiç bir değişiklik yapılmadı) u4.s tamam (hiç bir değişiklik yapılmadı) ux.s 'ldrv' ve 'pdrv' structure'larındaoık değişiklik yapıldı ('pdrv' de bir önceki duruma dönülürken, 'ldrv' de değişiklik oldu) ('imap', 'itable', 'fbmap' sector indexleri 'ldrv' talosuna taşındı) u0.s 'ldrv_init' değişikliği yapıldı (yeni 'ldrv' tablo yapısına göre) u0.s, u1.s ve u2.s de düzeltmeler yaptım. u5.s değişiklikleri yapılacak ; 07/05/2021 u5.s ve u8.s'de buffer düzenlemeleri devam ediyor ; 08/05/2021 u8.s 'bufaloc' değişiklikleri iptal edildi, 'bufaloc' doğrulandı (sadece fiziksel disk numarası ve fiziksel sektör esaslı buffer kontrol yapılacak...) ; 09/05/2021 ux.s 'ldrv' structure değişti, herşey superblock içinde superblock hariç tüm buffer'lar disk okuma yazma esnasında kullanılacak, sadece superblock diske direkt yazılacak u0.s 'rdrv_init', 'ldrv_init', 'bf_init'düzeltmeleri tamam ; 10/05/2021 u0.s 'pdrvmount' eklendi (fiziksel diskleri raw erişime açıp/kapamak için) ux.s pdrv.status bit 0, 1 ise fiziksel diskin mounted olduğunu gösterecek root (fiziksel) diski, rdev içine kayıtlanıyor (index numarası olarak) (fiziksel disk mount olmadan logical disk kurulamayacak) ; 11/05/2021 ux.s 'SB.status' düzenlemesi (sistem buffer'larının durumu) u0.s 'flush_bufs' tamam, 'sync', 'sync_u' düzeltmesine devam ; 12/05/2021 ux.s Superblock structure'ına son değişikliği yapan kullanıcı/process no eklendi (değişikliği yapan process 'sysnc_u' ile diske yazdıracak) ayrıca fiziksel sürücü indeks numarası alanı eklendi. (dword olan SB.Status byte'a dönüştürüldü) u0.s tamam ('sync' ve 'sync_u' düzeltmeleri yapıldı) ; 13/05/2021 u0.s'de küçük düzeltmeler yaptım ; 14/05/2021 u0.s 'sync_all', 'flush_all', 'abort' prosedürlerini yazdım u1.s 'sysabort' and 'syssync' yeni sistem çağrılarını yazdım 'sysexit' system çağrısı içine 'abort' ekledim (Abort'un amacı diske yazılırken hata veren ve kilitlenen buffer'ları geçersizleştirerek serbest bırakmak, sadece buffer'ın sahibi veya 'sysexit' içinden yapılabilir. Sadece buffer'ın sahibi yapabilir çünkü syswrite içinden dönecek hataya retry veya abort olarak tepki vermesi gerekiyor. Yazma işlemini yeniden denemeyecekse, 'sysabort' çağrısı gerekir yoksa buffer'ı meşgul bırakır.) ; 15/05/2021 u0.s, u1.s, ux.s değişiklikleri buffer error-lock iptal edildi diske yazma hatası olursa buffer iptal ediliyor, yazma (syswrite) o sektörde iptal oluyor ve o sektör yazılmamış gibi yazma byte sayısı döndürülüyor. kulanıcı istertse aynı sektörü aynı dosya pozisyonundan tekrar yazmayı deneyebilir (file pointer ilerlemediği için) Bu durumla ilgili olarak 'sysabort' sistem çağrısı da gerek kalmadığı için iptal edildi. 'Abort' prosedürünü sildim. ; 16/05/2021 disk buffer işlemlerinde çok karışıklık olduğu için unix v7 x86 (Robert Nordier, 1999) koduna göre bir çok şeyi yeniden yazıyorum sysread ve syswrite'ı yeniden yazıyorum, inode ve file structure'larında unix v7'ye göre değişiklikler yapıyorum; readi, writei ve buffer prosedürleri değişecek.. Asıl olarak buffer (disk write) işlemlerinde sağlama ve tutarlı olması için bu değişikliklere başladım. Eski kod büyük ölçüde değişecek. (Bir çok yerde unix v1'den kalma kod parçaları ve yapılar iptal olacak). plock, prele, readi, writei, readp, writep prosedürleri yazılacak... ; 17/05/2021 u6.s 'plock', 'prele', 'readp', 'writep' tamam bunların içinde sleep, wakeup ve psignal yazılacak bu prosedürlerin içinde EDX register'ının değilmemesi gerekiyor. ayrıca diğer register'larında korunuyor olması kontrol edilecek. ; 20/05/2021 ; 21/05/2021 u4.s coherent 4.2 (MWC) kaynak kodundan da (proc.c) yararlanarak sleep ve wakeup prosedürlerini yazıyorum. ('sphi', 'splo' ve 'spl' coherent'ten) ; 22/05/2021 u6.s readp, writep, plock, prele düzeltmeleri yaptım (özellikle push/pop) u4.s psig'de kaldım, psig'deki 'resume' retro unix'e özgü olmak durumunda (unix v7 ve coherent resume/restore kodları uyumsuz ve çok iyi değil) (uyumsuzluk sebebi özellikle retro unix'in 'sysentry' push, pop kernel page table vs daha basit olmasından kaynaklı, v7'de çok maksatlı save/resume var, u.q_save, u.s_save, u_rsave gibi) 'sleep' kısmen tamam . (sleep'de ve wakeup'ta eax, ebx, ecx ve edx değişebilir) alt prosedürler esi, edi ve ebp'yi kullanımor 'issig' tamam. 'sphi', 'splo' ve 'spl' (coherent 4.2'den uyarlama) u4.s içine yazılacak. HASH prosedürü tamam (farkı 'getc' adresden multiscreen özelliği gözetildiği için HASH getc'h dışında 10' ve daha büyük sayı/index üretiyor.. Sonra 2 bit sola kaydırılıp 'slpque' pointer ofset'i haline getiriliyor. 'sleep' 'getc' için HASH kullanmayıp sanal tty ekranlara göre [u.ttyn] değerinden 0-9 arası index veriyor ve bu [slpque+0]..[slpque+36] şeklinde ilk 10 pointer'ı veriyor Toplam 26 sleep kuyruğu pointer'ı var ve diğerleri 10-25 arası... u1.s'de 'rdwr' prosedürüne unix v7'deki 'rdwr' prosedürünün c kaynak kodundan açıklamalar ekledim, ufak düzeltme yaptım. ; 23/05/2021 u4.s'de 'sleep', 'issig' düzeltmeleri yaptım. 'sleep' tamamlanmadı. ; 24/05/2021 u4.s ve u6.s'de 'sleep' 'wakeup' değişiklileri tamamlandı. issig, psig düzeltmeleri yaptım. ; 28/05/2021 u4.s'de 'sleep' ve 'wakeup' düzeltmeleri yaptım. u1.s'de 'sysent', 'sysret' ve 'error' de önemli değişiklikler yaptım. ('sleep' ve 'wakeup' dönüşlerinde stack ptr'ın doğru olması için v.s.) u4.s'de 'psig' ve 'resume' prosedürlerini düzelttim, ; 29/05/2021 u4.s de 'psig' içinde signal resetleme islemi var. (işlem gören signal'in 'p.signal' word'ü içindeki bit'i temizlenir/sıfırlanır.) Bugün itibarı ile Retro UNIX 386 v2 signal/sinyal işleme açıklaması: Default (Kullanıcı belleğinde ayarlanmamış) signal işleme için ([u.srb]=0) daima son signal'in numarası ve zamanı kayıtlanır. Bu durumda sadece bir signal/sinyal tipi için sinyal kabulünün aktif olması mantıklıdır. Kill signal'i için proses 'sysexit' e yönlendirilir. Tüm signal'lerde signal numarası 'u.snum' ve zaman 'u.s_time' kaydedilir ama daima son aktif sinyal için kayıt yapılmış olur. SRB ve signal handler (callback) yöntemlerinde handler adresi 'u.s_addr'den alınır. 'u.signal' bit esaslı olarak 16 signal'in enabled/aktif durumunu flag olarak kayıtlamak için kullanılır. Ve 'issig' prosedürü sadece o prosesin aktifleştirdiği yani kabul ettiği signalleri 'psig:' adresine yönlendirir. Unix v7'den farklı olarak, değeri 1 olan bitler 'enabled' signallere/sinyallere ve değeri 0 olan bitler işlem görmeyecek ignored/pasif signal/sinyal numaralarına karşılık gelir. 'SIGKIL' kill signal'i aktif/pasif durumuna bakılmaksızın uygulanır. u4.s'de 'setrun' ve 'setrq' prosedürlerini yazdım. Unix v7'de kullanılan 'runin' ve 'runout' parametrelerini kullanmıyorum. Retro UNIX 386 v2'de process'ler değilde sadece memory page'ler swaplanlandığı için (yani bir proses bellekte iken, onun onun page table'ları swap diskinde veya dosyasında page içerebiliyor. Bu page fault durumunda geri yükleniyor) 'runin' ve 'runout'a gerek kalmıyor. (Fakat bellek'te atanacak sayfa kalmazsa yeni bir proses başlatılamaz veya bellek yetersiz hatası oluşur. (swap diskine atılabilecek yeterli sayıda bellek sayfası da kalmazsa..) ; 30/05/2021 u3.s'de 'switch', 'qswitch' prosedürlerini yazdım.. 'rswap' ve 'wswap' prosedürlerinde düzeltme yaptım, 'idle' prosedüründe değişiklik yaptım. Önceki runix versiyonunun 'swap' ve 'tswap' prosedürlerini silmeden devre dışı bıraktım ('%if 0' ile '%end if' direktifleri arası kodlar derlenmez) ux.s'de user ('u') area'da u.fpregs düzeltmesi yaptım, 94 yerine 108 byte olması lazımdı (32 bit çalışmada floating point registerlerinin save/restore işlemleri 108 byte yer kullanır) ; 05/06/2021 (Kamiloba) u4.s'de 'clock' prosedürünü yazmaya devam (1 haziran 2021'de başladım) unix v7 clock ile TRDOS 386 v2 (2.0.4) clock prosedürünün karması şeklinde tasarlıyorum. (clock prosedürü içinde kontrole edilen timer events, 'timer_set' alanları ve 'timer_set' yapısının açıklaması ux.s'de) ux.s'de 'timer_set', timer events (TRDOS 386 v2'den alma) yapısını az değiştirerek Retro UNIX 386 v2'ye uyarlıyorum. (Retro Unix v2'ye unix v7'de yakın karşılığı 'callouts' olan spesifik özellik ekliyorum, öncelikli referans TRDOS 386 v2.) ; 06/06/2021 (Kamiloba) u4.s'de 'clock' prosedüründe değişiklikler yaptım. unix386.s'de 'rtc_int' ve 'timer_int' değişiklikleri yaptım. (TRDOS 386 v2'deki ek özelliklere göre değişiklikler.) CMOS_READ prosedürünü u0.s'ye taşıdım (CMOS_WRITE'ın yanına). Multi screen ve multi tasking testi niteliğinde olan, 2. video sayfasına Tarih ve saat bilgisi yazan geçici kodu iptal ettim. Saniyede 2 kez çağrılan rtc_int içinde, her 1 dakika'da 'epoch' çağırıp, oradan 'R_TIME' güncelleyen kod ekledim. Saniyede bir kez R_TIME artırıyor. Motor çalışıyorsa 200 tick sonunda motor durduruluyor (100 Hz'den 2 saniye çalışma süresi). ; 07/06/2021 (Boğazköy) unix386.s 'timer_int' ve 'rtc_int' düzeltmeleri yaptım. ; 10/06/2021 (Boğazköy) NASM v2.15 ile derleme kontrolü ve gereken düzeltmeleri yaptım. ; 16/06/2021 NASM v2.15 hata mesajı satır numaralarını hatalı verdiği için, NASM v2.11 ile, geçici kodlar ekleyerek 11 Haziran'dan itibaren derleme kusurlarını düzeltip, ilk unix386 kernel dosyasını oluşturdum. Bundan sonra unix v7 x86 kodunu referans alarak ama Retro UNIX v1.1 ve v2 taslak yapısını çok bozmadan, dosya sistemini "file/inode write block", "inode table" "inode map", "free blocks map" ve "super block" write/modification flag/bayrak değerinden birbirne kilitleyerek diske yazdıracağım. (Yani kritik sistem sektörlerinde aynı inode'a ait olmayan veya aynı u.uno'ya ait olmayan bir değişiklik olursa veya buffer'daki kritik sistem sektörü değişirse kritik sektörler birlikte yazılacak (update) olacak. ; 18/06/2021 (Boğazköy) unix386.s'de TRDOS 386 v2'den alma 'fpready' fpu hazır kontrolü, u1.s'de ve u2.s'de 'sysver' (39) ve 'sysfpstat' sistem çağrıları (fpu hazır ise 'u.fpsave' set edilebiliyor) u0.s'de 'sysinit' de kontrol ve düzeltmeler. 'unix386.s' de PIT'ın 100 HZ'e ayarlanması. 'ux.s', 'sysdefs.s' ekleme ve düzeltmelerini yaptım. 'rtc_int' de düzeltme yaptım. (Unix v7 x86 'main.c' ve 'machdep.c' ile kıyasladım.) ; 21/06/2021 (Kamiloba) ux.s'de 'pdrv.mountcount' değişikleri u7.s'de ufak düzeltmeler ; 22/06/2021 (Kamiloba) u0.s'de 'pdrvmount' değişikliği/düzeltmesi ve 'mntc' eklemesi (mount table mntc -mount count- üzerinden kontrol edilecek, 'pdrv.mntcount' ise fiziksel diskin kaç adet logical disk mount'u olduğunu gösterecek, böylece o kadar logical disk sektörleri için raw erişim engelleme kontrolü yapılacak. Mounted ldrv sektörlerine denk gelen pdrv sektörlerine raw olarak yani block device inode üzerinden yazılamayacak. ; 24/06/2021 (Kamiloba) u5.s'de 'iget' yeniden yazıldı (mount kontrolü eklendi) ve mounttab yapısında değişiklik oldu, LDRV adresi yerine LDRV numarası kullanılacak... ; 26/06/2021 (Kamiloba) u0.s'de 'rdrv_init' ve 'ldrv_init' düzeltmesi, u5.s'de 'icalc' da değişikliği. ; 29/06/2021 (Kamiloba) u5.s'de 'get' ve 'icalc' düzeltmeleri u8.s'de '_dskrd', '_dskwr' and '_poke' düzeltmeleri ux.s'de 'ldrvtable:' buffer size düzeltmesi ; 05/07/2021 (Kamiloba) ux.s'de 'sync_i' error kodlarının eklenmesi u0.s'de 'sync_i' prosedürünün yazılması u8.s'de 'get_phy_drv' içinde ldrv tablo boyutu düzeltmesi ; 12/07/2021 (Kamiloba) u0.s'de 'sync_i' ye devam ettim u8.s'de _dskwr_ ekledim, '_dskwr_', 'poke' ufak değişiklik yaptım. ; 15/07/2021 (Boğazköy) u0.s'de'sync_i' yi tamamladım ux.s'de 'sync_i' ile ilgili değişiklik u5.s'de 'set_sysbuf_hdr' düzeltmesi ve 'sync_i' açıklaması ; 16/07/2021 (Boğazköy) u0.s'de 'sync_i' düzeltmesi ; 18/07/2021 (Kamiloba) ux.s'de SuperBlock parametre ekleme (system buffer'ları). Böylece dosya yazarken itab, imap, fbm buffer ve sektörleri superblock üzerinden ldrv'den takip edilecek. u5.s'de 'icalc' düzeltmesi (system buffer'ları süper blok üzerinden takip edilecek) u0.s'de 'sync_i' düzeltmesi yaptım u8.s'de 'bufaloc' düzeltmesi (sistem buffer'larının başka maksatla kullanılmasını önlemek için) yaptım 20/07/2021 (Boğazköy) u8.s'de 'bufaloc' düzeltmesi (sistem buffer'larının aynı sektörü göstermesi durumunda, bir kullanıcı tarafından kullanılmakta iken, başka bir kullanıcı tarafından sahiplenilmemesi ve böylece sistem buffer'larının yazma bütünlüğünü -kullanıcı esaslı- korumak için ekleme) yaptım. [Başka kullanıcı sistem buffer'ını başka maksatla okuyup, yazabilirdi fakat buna 'access error' verdirseydim, bu kez sistem buffer'ı olarak kullanılması durumunda da erişim olamazdı, o nedenle 'access error' verdirmedim. Yine de, kernel kodunda, mantıksal sürücüde sadece bir inode'a göre bufferları kullanıldığı için, inode değişince 'sync _i' ile sistem bufferları yazılıyor. Başka kullanıcı bu arada başka inode'la çalışacak ise, 'sync_i'yi bypass edip sistem bufferlerını ve dosya sektör buffer'ını değiştiremez. Raw olarak diske yazılması için de diskin 'umount' durumunda olması veya en azından 'root drive' için raw access koruması gerekiyor ki, o durumda, zaten sistem buffer'ları 'bufaloc' dışından korunmuş olur. Dolayısıyla 'bufaloc' içinde '20/07/2021' işaretli kod eklemesi gereksiz olabilir.] 21/07/2021 ux.s'de open file structure düzeltmesi yaptım. unix v7'deki gibi bellekte yüklü inode adresine değil diskteki inode number'ı içeriyor. Ve mantıksal sürücü index numarasını içeriyor (monte edilmiş dosya sistemi ise, bunun mantıksal sürücü numarası 1 veya daha büyüktür, bu durumda inode number bu sürücüdekidir yani root fs'deki inode number değildir. Monte tablosu hangi dizine monte edildiğini gösterir. Open file yapısındaki reseved byte alanı monte tablosu indexinin 1 fazlası olabilir. 22/07/2021 ux.s'de file structure düzeltmesi. unix v7deki, gibi değil runix v2'ye özgü open file structure'a az değişikle dönüş yaptım. u2.s'de 'fclose' kodunda değişiklik yaptım. u1.'s de 'sysclose' kodunu kontrol ettim, sync işlemini '_fclose' içinde yaptırdığımdan değişiklik gerekmedi. 'sysexit' de 'sync_u' vardı, değişiklik gerekmedi. 'sync_x' dosya kapanırken sistem blok buffer'larını diske yazdırıp eşitliyor ve sistem blok pointer'larını ve status flaglarını geçersiz hale getiriyor. Hata alınsa bile bunu yapıyor, çünkü dosya kapatılıyor. 'sync_u' ise kullanıcıya ([u.uno]'ya) ait buffer'ları diske yazdırıyor, 'system buffer' flag 1 ise pas geçiyor. (Çünkü sistem blok buffer'larının tek tek karışık sırayla değilde birlikte ve sırayla yazılması gerekir.. file buffer, itab, imap, fbm, superblock sırasını uyguluyorum. Dosya yazılırsa, inode, inode yazılarsa inode map, bu da yazılmışsa free block map ve fbm değiştiği için ona göre kayıt içeren superblock yazılıyor. Bir aşamada başarısızlık olursa devam eden aşama tutarsızlık artmasın diye yazılmıyor, iptal geçersiz duruma getiriliyor. Böylece sistem blokunun diskteki bir önceki hali nispeten daha tutarlı olacaktır. Aksi takdirde diske başarıyla yazılamamış değişiklikler yazılmış gibi sistem blokları, free block map ve süper bloktaki free block count, inode structure ve inode map v.s. hatalı olurdu. Bir önceki aşamada yazma hatası olursa sırası gelen sistem bloklarını yazmayı durdurmanın sebep olacağı tutarsızlık, yazılmasına kıyasla daha az olur ve superblock'taki 'SB.LastInode' alanındaki inode numarasına göre tutarlılık kontrolü yapılabilir.) u0.s'de 'sync_u' yazılacak... 23/07/2021 u8.s'de 'dskwr' içinde değişiklik yaptım. ([pdn] yerine [ebx+bufhdr.phydrv] kullanılacak.) u0.s'de 'sync_u', 'flush_bufs_u', 'flush_bufs' ve '_smod_' prosedür düzeltmeleri yaptım. u2.s'de 'fclose' düzeltmesi yaptım. u1.s'de 'sysexit' ve 'sysclose' düzeltmesi yaptım. u0.s'de 'rdrv_init' ve 'ldrv_init' ortak koduna/prosedürüne superblock buffer pointerlerini ve 'SB.LastInode' alanını temizleme kodu ekledim. (Diskte bu alanlar bir önceki kapanışta veya 'sysexit' te dolu bırakılmış ise bu şekilde temizlemek iyi olacaktır.) u5.s'de 'alloc' prosedüründe düzeltmeler devam ediyor.. 27/07/2021 u5.s'de 'alloc' prosedüründe düzeltmeler devam ediyor.. 28/07/2021 u5.s'de 'alloc' prosedüründe düzeltmeler devam ediyor.. 30/07/2021 u5.s'de 'alloc' prosedüründe düzeltmeler tamamlandı. 03/08/2021 u5.s'de 'alloc' prosedüründe sıralama düzeltmesi yaptım. 08/08/2021 u5.s'de 'alloc' prosedüründe 'sync_i_x' düzeltmesi yaptım. u0.s'de 'sync_i' ye 'sync_i_x' eklemesi yaptım. 14/08/2021 u5.s'de 'free' prosedürünü 'alloc' prosedürünün tersi olarak yeniden yazdım. 15/08/2021 u5.s'de 'imap' prosedürünü düzelttim. ('sync_i' ve diğer yeni özellikleri uyguladım) u2.s'de 'maknod' da ufak değişiklikler, düzeltmeler yaptım. u0.s'de 'flush_bufs' da ve 'flush_all' da system special buffer flag düzeltmeleri yaptım. (system special block buffer'ları da 'sync' ve 'sync_all' prosedürleri esnasında diske yazılmalı.) u5.s'de 'anyi' de 'sync_i' ve 'imap'a göre düzeltmeler yaptım. ('itrunc' prosedürünü kontrol ettim, yanlış yok.) 16/08/2021 u5.s'de 'icalc' prosedüründe hata düzeltmesi. 17/08/2021 u5.s'de 'icalc' prosedüründe 'SB.Status' kod düzeltmesi. u0.s'de 'sync_i' prosedüründe 'SB.Status' kodları düzeltmesi. 'sync_i' içinde hata düzeltmesi ve iyileştirme. 20/08/2021 (Kamiloba) u5.s'de 'mget' (sector offset hesabı) düzeltmesi yaptım. 21/08/2021 u5.s'de 'imap' düzeltmesi (kısaltma yaptım, 'sync_x'). u6.s'de 'readi' prosedürünün 'dskr' kısmının yeni sync (buffer-disk senkronlama) mantığına uyarlanması.. 22/08/2021 u5.s'de 'mget' düzeltmesi. u8.s'de 'dskrd' (existing sector buff, 'dkrd_1') düzeltmesi. u6.s'de 'readi' içinde 'dskr' kısmında 'sync' ile ilgili ekleme, düzeltmeleri yaptım (buffer-disk senkronlama tamam). 23/08/2021 u6.s'de 'writei' prosedürünün 'dskw' kısmını yeni sync (buffer-disk senkronlama) mantığına uyarladım. 24/08/2021 (Boğazköy) u6.s'de 'writei' içinde 'dskw' kısmındaki sync ve buffer flag ile ilgili ekleme ve düzeltmeleri tamamladım. ((Gerekli ekleme ve değişiklikler tamamlandı.)) 02/10/2021 (Boğazköy) Geçtiğimiz hafta yaptığım kernel derlemelerinde hatalar alınca, en son 27/09/2021 olan kaynak kodu versiyonunu kayıtlayıp, 1.1 versiyonu esaslı (ama 2.0 dosya sistemli) basitleştirmeye karar verdim. (İlk başarılı çalışmadan sonra 2.0 versiyonunun özellikleri aşamaları olarak tekrar ekleyeceğim.) 03/10/2021 (Boğazköy) 32K'dan büyük retro unix (386 v2) kernelinin hata vermesi sebebi olarak (stack overwrite) boot (boot5.asm) dosyası içinde stack segmenti son olarak kernel'e dallanmadan önce ayarlayan kodun ([Extra_Segment] değişkeninden bx ve ss'ye aktarma yaparken yanlışlıkla 1000h yerine 800h geliyordu, kernel yüklendikden sonra 800h'ye resetlenmesini iptal ederek boot kusurunu düzelttim. 32K'dan büyük retro 'unix' kernel dosyası çalışıyor. Fakat, kernel'in halen çalışmama sebebi henüz 'init' dosyasının yüklenmesi aşamasına doğru gelinememesi. Dolayısıyla memory ve disk hazır mesajından sonraki aşamalarda retro unix 386 v2 kernel düzeltmesine devam ediyorum. 04/10/2021 unix386.s dosyasında ufak düzeltmeler yaptım. keyboard.s, u4.s, u9.s'de 'sleep', 'wakeup', 'getc', 'sndc' prosedürlerinde yeni tip channel esaslı ve multiscreen tty num ayrıcalıklı düzeltmeleri yaptım. 'readi' ve 'writei' deki sleep cağrılarını da değiştirdim. Sleep'de priority kullanılıyor, bunu geçici olarak PZERO olarak ayarladım. 'syssleep'deki 'sleep' çağrısında da PZERO priority kullandım. (Bunun değişmesi gerekebilir. Farklı priority değişkenleri var, buradaki priority p.pri, [curpri] olup unix v7'den uyarlama Retro UNIX'e özgü priority değişkeni var onunla çelişebilir. İleride düzenleme gerekecek.) 08/10/2021 unix386.s ve u0.s'de düzeltmeler, hata yerini bulmak için geçici (temporary) kodlar. 09/10/2021 unix386.s ve u0.s'de düzeltmeler, hata yerini bulmak için geçici (temporary) kodlar. u8.s'de diskio (chs r/w) düzeltmesi. 11/10/2021 u8.s'de 'diskio' prosedüründe giriş düzeltmesi. 15/10/2021 u0.s'de 'ldrv_init' prosedüründe düzeltme. 17/10/2021 (Boğazköy) Kerneli başlatmaktaki başarısızlıkları düzeltemediğim için tekrar v1.1'den değiştirmeye başladım. Geçici (veya kısmen kalıcı olacak şekilde) unix386.s'yi Version 1.1'e göre az değiştirdim. u0.s'deki 'sysinit'i ve u1.s'deki sysret'i ve u8.s'deki 'diskio' ve ilgili prosedürleri değiştirdim. (sb0 ve sb1 superblock'larını kullanmaya başladım, yeni superblock structure, yeni inode, yeni buffer headers ama eski tip process yapısını kullanıp, en basitiyle kerneli çalıştırıp, init dosyasını yüklemek istiyorum.) Bu önemli değişikler devam ediyor. (Sonradan, önceki kernel kodu include dosyalardan yeni tip kodu eklemeye başlayacağım. Önce kerneli başarıyla çalıştırmam gerekiyor.) 18/10/2021 u2.s'de 'namei' düzeltmesi/iyileştirmesi. ux.s'de 'namei' ile ilgili 16->32 bit değiklikleri. u6.s'de 'readi' basitleştirme (v1.1'deki gibi) değişiklikleri. u6.s'de 'readi', 'dskr' değişiklikleri tamam. [idev] yerine [cdev] geldi. 'iget' ve 'mget' de düzeltmeler gerekiyor. 'writei ve 'dskw' değiştirilecek. 22/10/2021 u6.s'de 'writei' içinde chrdev write kısmı düzeltmeleri ve 'readi' içinde chrdev read kısmı ile ilgili küçük düzeltmeler. ('writei' içinde blkdev düzeltmeleri ve fs kısmı yapılacak) 24/10/2021 u6.s'de 'writei' içinde blkdev write kısmı düzeltmeleri. u6.s'de 'sioreg' içinde ve ux.s'de 32 bit u.scount, u.pcount ve u.bps uygulaması (32 bit register mov kullanmak için). ('readi' ve 'writei' içinde 32 bit iyileştirmeleri yaptım; movzx'ler yerine mov ve word yerine dword komutları kullandım.) u6.s'de 'write_i' içinde 'dskw' düzeltmeleri tamam. 27/10/2021 u5.s'de 'iget' düzeltmeleri, 'idev' yerine 'cdev' ile prosedürden çıkış olacak. u8.s'de geçici 'dskrd' ve 'dsk_rd', 'dskwr' değişiklikleri. u8.s'de 'get_system_time'daki eax'i RTC interrupt'da kayıtlanan [R_TIME] dan alma düzenlemesi. u5.s'de 'icalc' düzeltmeleri tamam. (mget ve iget düzeltmelerine devam ediyorum) 28/10/2021 u8.s'de 'dskwr' ve 'dskrd' de '_diskio' girişinde düzeltme. u5.s'de 'iget' düzeltmeleri tamam. u5.s'de 'alloc' ve 'alloc_m' düzeltmeleri yaptım. (Tamam.) 29/10/2021 u5.s'de 'free' prosedüründeki düzeltmeler tamam. 30/10/2021 u1.s'de 'sysread' ve 'syswrite' düzeltmeleri tamam. u1.s'de 'sysopen' ve 'sysclose' düzeltmeleri tamam. ('fclose' düzeltildi, 'getf' hatasız, 'sync_x' geçici, 'iopen' ve 'iclose' da device için düzeltme gerekebilir.) u2.s'de 'anyi' ile ve sonra syscreat, mkdir ve truncating (rmdir v.s.) işlemleri için yarın (pazar günü) devam edeceğim. 31/10/2021 u7.s'de 'iopen' (device) ve 'iclose' (device) düzeltmesi. u5.s'de "access' ve 'iget' ('icalc' dönüşü hata) düzeltmesi. u7.s'de 'otty', 'ottyp' ve 'ottys' tamam. (Runix v1.1 'ottyp'de bug var! -ottys_3 adresinde ebx hatası-) u7.s'de 'ctty', 'cttyp' ve 'cttys' tamam. 01/11/2021 u7.s'de 'iclose'da ufak bir ([u.mode]) düzeltme. u7.s'de 'ottyp' ve 'cttyp' prosedür kodlarında düzeltme. ('u.mode' veya 'chrdev.omode', direkt 'al' ve 'dl' girişi.) u7.s'de yeni 'sret' (boş) prosedürü cf=0 ve eax=0 olarak dönüyor. (yeni 'cret' kodu 'sret' kodu ile aynı.) (iochd, iocfd, olpr, clpr, iottyp, iottys, ioclpr şimdilik boş prosedürler; bunların hepsi 'sret'e dallanıyor; cf=0 ve eax= 0 olarak dönüyorlar.) u6.s'de 'readi' ve 'writei' de 'iget' sonrası (edi) düzeltmesi. u1.s'de 'sysstty' düzeltmesi ('_ottyp_, _cttyp_'). u6.s'de 'wtty' ve 'xmtt' düzeltmesi. ('wmem' ve wlpr'de değişiklik şimdilik gerekmiyor.) u6.'s'de 'readi'de geçici eski tip 'sleep' uygulaması. (getchar/rtty durumunda klavyeden karakter gelmiyorsa sleep). u6.s'de 'rcvt' ve 'rtty' düzeltmesi. ('rmem' ve rlpr'de değişiklik şimdilik gerekmiyor.) Character aygıtlarının o/c/r/w düzeltmeleri şimdilik tamam. Block aygıtlarının o/c/r/w düzeltmerine devam. 02/11/2021 u8.s'de disklerin (block aygıtlarının) r/w prosedürleri olan 'rfd', 'wfd', 'rhd', 'whd' de basit düzeltmeler yaptım. (Bunlardan başka block aygıtı -disk- o/c/r/w prosedürü yok.) (('chrdev_init' prosedürünün yazılması gerekiyor.)) ((('anyi' ve ilgili truncating prosedürlerine sıra gelecek.))) 05/11/2021 u0.s'de 'chrdev_init' tamam. (chrdev tabloları oluşturuyor. Sadece major, minor, type and subtype alanlarını dolduruyor. Tablo sırası: null, mem, tty0, .., tty7, tty8, tty9, lpr) u2.s'de 'anyi' düzeltmesi tamam (değişiklik: jump to 'sync') u5.s'de 'imap' düzeltmesi tamam. ('maknod' içinde 'imap_x' kontrol edilecek) ('itrunc' ve 'tloop' prosedürleri kontrol edilecek.) 06/11/2021 u2.s'de 'maknod' kaynak kodunda düzeltme yaptım. 'imap_x' çağrısını doğruladım. u5.s'de 'itrunc' ve 'tloop' prosedürlerini kontrol ettim, hatalı kısım farkedemedim (doğruladım). u1.s ve u2.s'de 'iget' dönüşü hatanın [u.error] içine işlenmesi düzeltmelerini yaptım. (Eski 1.1 kernel versiyonunda herhangi bir yerde error'e dallanıyordu.) (("Error:" addresine dallanmadan önce eax'deki error/hata kodunun, [u.error] içine kayıtlanması gerekiyor, çünkü "Error:" sonrası kod [u.error] içindeki değerle hata dönüşü yapıyor, [u.error] sıfır ise hata dönüşü olmuyor.)) 07/11/2021 u9.s'de 'getc'/'getc_s' prosedüründe 'sleep' çağrısı girişini düzelttim (eski versiyon sleep'e göre giriş gerekiyordu). u7.s'de 'sysmount', 'sysumount' ve 'getspl' prosedürlerinin düzeltilmesi tamamlandı. 08/11/2021 u6.s'de 'writei' düzeltmesi. (Kullanılmayan bölümü sildim) u8.d'de 'get_phy_drv' geçici olarak kullaım dışı olduğundan '%if 0' içine aldım. 13/11/2021 Hata sebebi aramaya devam (unix386.s, u0.s, u8.s, u9s). 15/11/2021 Hata sebebi aramaya devam (unix386.s, ux.s, u8.s) 16/11/2021 Hata sebebi aramaya devam (diskio.s) 21/11/2021 diskio.s'de 'int40h:' ('diskette_io:') kısmına 'clc' ekledim. unix386.'s, u8.s ve u0.s'de hata aramaya devam. (bochs'da page fault hatası kernelin 99Eh adresinde) 22/11/2021 unix386.'s, u8.s ve u0.s'de hata aramaya devam. 22/11/2021 - v1.2 Hataları çözemediğim için tekrar Retro UNIX 386 v1.1 kernel kodundan minimum değişiklikle geçici çözüm sağlamaya çalışacağım. (Bundan sonraki v1.1 kodunun en az değişmiş hali olacak, sadece dosya sistemi uyumluluğu olacak. Bu test/geçici versiyona v1.2 adını verdim.) 'namei', 'iget', 'mget', 'icalc', 'access' kodlarını değiştirdim. 26/11/2021 u5.s'de alloc prosedürünü (v2 free blocks map'e göre) uyarladım. Yarın alloc prosedürünü kontrol edeceğim ve free prosedürünü uyarlayacağım. (v1.1 ile v2.0 arasında olan kod yazıyorum.) 27/11/2021 u5.s'de 'alloc' prosedüründe kontrol ve düzeltme tamam. ux.s'de 'alloc' ile ilgili eklemeler. u5.s'de 'free' prosedürünün yeniden yazılması tamam. u0.s'de [rootdir] alanına 1 yazılması tamam. 28/11/2021 sysdefs.s'ye ekleme. u6.s'de 'readi' ve 'writei' nin uyarlanması. u5.s'de 'mget' de ufak düzeltme (gereksiz 'jc' kodunun iptali) u5.s'de 'icalc' da ve 'access'de düzeltme. u2.s'de runix 386 v2'nin 'sysexec' kodunun kullanılması. u0.s'de 'bf_init' ve 'rdev_init' de düzeltme. u2.s'de 'namei' ve 'sysexec' hata kontrolü devam ediyor.. 29/11/2021 u8.s'de 'poke' içinde 32 bit push-pop değişikliği. 30/11/2021 u5.s'de 'iget' içinde düzeltme. u2.s'de 'sysexec' içinde düzeltme. u1.s'de 'sysret' de 'xor eax, eax' değişikliği. 'sysexit' de 'dec eax' değişikliği. 04/12/2021 u1.s'de 'sysopen', 'sysclose', 'sysread', 'syswrite', 'getf' ve 'fclose' değişiklikleri. u0.s, u1.s, u2.s kontrolü. sysdefs.s ve ux.s'de ufak değişiklik. 05/12/2021 u7.s'de 'iopen','iclose', 'otty', 'ctty' düzeltme/değişiklikleri. 'keyboard.s', 'video.s', 'diskio.s' dosyalarında ufak düzeltmeler. 11/12/2021 u0.s, u1.s, u2.s, u6.s, u8.s, u9.s, sysdefs.s'de hata giderme ve iyileştirmeler ve geçici test kodları. 12/12/2021 u1.s'de geçici test kodu ve düzeltme ile ilk 'invalid system call' çağrısını aldım. Bunun anlamı /etc/init çalışıyor demek; çünkü en son sistem çağrı/fonksiyon numarası 36 iken, 37. test fonksiyonuyla sistem çağrısı (int 30h, ax = 37) yaptırmıştım, 'invalid system call' mesajını görmek istiyordum, gördüm. Bu durumda [u.uno] veya [p.ttyc] içinden yanlış değer alındığı anlaşılıyor (bunları bypass yapınca mesaj göründü yoksa ekranda mesaj çıkmıyor, sadece sol üstte test kodu sayısı çıkıyordu). u0.s'de p.ttyc içine geçici olarak 0 atayarak problemi çözdüm. Ancak p.ttyc unix386.s içindeki 'clear_bss' aşamasında sıfırlanması gerekirken içinde nasıl başka bir sayı çıkıyor bulamadım. 'sysinit' aşamasından önce muhtemelen hatalı bir kod o kısmı overwrite yapıyor veya 'clear_bss' çalışmıyor. 19/12/2021 u1.s'de 'sysemt' içinde 'cli' ve 'sti' instruction'larını kaldırdım. (v1.1'deki /etc/init mesajı yazdıktan sonra protection hatası veriyor init386.s'deki işlem sırasına göre fonksiyon kontrolü yapıyorum) u2.s'de 'sysintr' prosedürünü kontrol ettim, normal. u4.s'deki 'clock' prosedüründe [u.intr] alanı sıfır ise 'clock' prosedürü aktif prosesi değiştirtmiyor. '/etc/init' multi tasking aşamasına 'sysemt' ile giriyor ama en başta [u.intr] içine sysinit çağrısıyla 0 koyuyor. '/etc/init' 'sysquit' üzerinde [u.quit] alanını da sıfırlıyor. Böylece Ctrl+Break tuşları /etc/init'in çalışmasını durdurammıyor. u5.'de 'access' prosedüründe yazılabilir device dosyalarının salt okunur dosya sisteminde yazma işlemi hatası vermemesi için düzeltme yaptım. u2.s'de 'namei' içinde jmp iyileştirmesi ('namei_9:') yaptım. u1.s'de 'syswrite', u6.s'de 'writei' ve 'cpass' ve 'wtty' (device için) doğru. u9.s'deki 'putc' prosedürü 'wtty' için' doğru. u1.s'de 'sysread', u6.s'de 'readi' ve 'passc' ve 'rtty' (device için) doğru. u9.s'deki 'getc' prosedürü 'rtty' için' doğru. 24/12/2021 u1.s'de 'sysread' ve 'syswtite' için 'rw3:' (error) kodunda düzeltme. u2.s'de 'sysexec' ve 'cpass' da düzeltme. (/etc/init'in çalışması için yaptığım hatalı değişikliği geri aldım.) 25/12/2021 u5.s'de 'access' prosedüründe düzeltme (root için device r/w kontrolü). 26/12/2021 u1.s ve u2.s'de (/etc/init error için) hata arama test kodları. u2.s'deki 'sysfstat've 'sysstat' prosedürlerinde runix v2 dosya sistemine göre düzeltme. 27/12/2021 u2.s'de 'anyi' içinde (runix v2 fs) düzeltmesi. 31/12/2021 u6.s'de 'trans_addr_w' içinde 'copy_page' ile ilgili hata düzeltme. 'memory.s' de 'duplicate_page_directory' içinde düzeltme. 01/01/2022 (Boğazköy) u7.s'de 'otty' (ve 'ottyp') prosedürü düzeltmesi. u1.s'de 'sysopen' prosedüründe binary code'u değiştirmeyen değişiklik. u2.s'de 'anyi' prosedüründe binary code'u değiştirmeyen değişiklik. ux.s'de binary code'u değiştirmeyen değişiklik. u2.s'de 'syscreat' içinde hata düzeltme. u2.s'de 'isdir' ve 'chdir' içinde runix v2 fs inode'a göre değişiklik. u0.s'de 'sysinit' de iyileştirme. u2.s'de 'sysexec' de düzeltme. 02/01/2022 unix386.s'de 'memory_init' prosedürü 32 bit register iyileştirmeleri. diskinit.s'de (trdos 386 v2'nin diskinit.s'sine göre) düzeltme yaptım. unix386.s'de diskinit.s'ye göre değişiklik. (int 48h data alanı.) 08/01/2022 u0.s kontrol edildi ve seri (COM) port kısımları iyileştirildi. u1.s'de 'syswait' içinde basit iyileştirme. u1.s'de 'sysfork' içinde düzeltme. u2.s'de 'getf' prosedüründe değişiklik. u1.s'de 'sysread' ve 'syswrite' gözden geçirildi, yanlış yok. u1.s'de 'sysopen' içinde basit iyileştirme. u7.s'de 'iopen' kontrol edildi, 'otty' ve 'ocvt' iyileştirildi. u7.s'de 'iclose' kontrol edildi, 'ctty' ve 'ccvt' iyileştirildi. u1.s'de 'sysclose' kontrol edildi. u2.s'de 'isdir' iyileştirmesi. 'sysfstat' içinde ufak düzeltme. u2.s'de 'fclose' içinde düzeltme. u2.s'de 'namei' içinde iyileştirme. u2.s'de 'syschdir' içinde düzeltmeler. 09/01/2022 u2.s'de 'syschmod' ve 'syschown', 'isown' ve 'maknod' kaynak kodları runix v2 fs'e göre değiştirildi. ux.s'ye 'imodx' eklendi ("inode değişti ama file data aynı"). u2.s'de 'systell' içinde iyileştirme, 'seektell' içinde değişiklik. u1.s'ye 'syssetgid', 'sysgetgid', 'sysver' sistem çağrıları eklendi. u2.s'ye 'syssetgid', 'sysgetgid', 'sysver' kodları eklendi. u2.s'de 'anyi' içinde değişiklik yapıldı. u3.s kontrol edildi, değişiklik gerekmiyor. u4.s kontrol edildi, değişiklik gerekmiyor. u5.s'de 'mget' prosedüründe düzeltme yapıldı. u8.s'deki 'bufaloc' kontrol edildi ve basit/ufak iyileştirme yapıldı. u8.s'deki 'wslot' kontrol edildi, doğru. u8.s'deki 'dskwr', 'poke', 'diskio', 'dskrd' kontrol edildi, doğru. u8.s'de 'diskio' prosedüründe ufak/basit iyileştirme yapıldı. diskio.s'yi kontrol ettim, yanlış farkemedim. (Karışık ama doğru.) u5.s'deki 'alloc', 'alloc_m' prosedüründe düzeltme yapıldı. u5.s'deki 'free' prosedüründe düzeltme yapıldı. u5.s'deki 'iget' ve 'icalc' prosedürlerinde düzeltme yapıldı. u5.s'deki 'access' ve setimod prosedürleri doğrulandı. u5.s'deki 'itrunc' ve 'imap' prosedürleri düzenlenecek. 10/01/2022 u5.s'deki 'itrunc' ve 'tloop' prosedürlerini düzenledim. u5.s'deki 'imap' prosedürünü düzenledim. sysdefs.s'ye error kodları ekledim. u2.s'deki 'maknod' prosedüründe değişiklik yaptım. ux.s'ye triple indirect ve double indirect buffer'ları ekledim. ux.s'deki 'SB' ve 'file' structure'larını 'sysdefs.s'ye taşıyarak NASM'nin BSS section'daki adreslerde yaptığı hatayı düzelttim. Bu şekilde sebebi bilinmeyen/acayip etc/init hatalarını çözmüş oldum. (NASM kaynaklı bu hata aynı zamanda runix v2 dosya sistemi kullanan yeni kernel kodunu düzeltmeme yol açtı, hayırlı oldu.) u6.s'den ux.s'ye kadar gözden geçirmeye devam edeceğim. 11/01/2022 u6.s'de gözden geçirme ve iyileştirme tamam. u7.s'de 'sysmount' prosedüründe düzeltme yaptım ancak hard diskdeki runix v2 fs içeren partition'lar için superblock adresi (sectör 1 olmayıp) farklı olabileceğinden, 'sysmount' kodunu (ileride) değiştirmek/geliştirmek gerekecek. Şimdilik runix v2 dosya sistemli floppy diskler için uygun. u7.s'de'sysumount' prosedüründe düzeltme/değişiklik yaptım. u7.s'de 'iopen' ve 'iclose' gözden geçirmesini tamamladım. u8.'s'den devam... 12/01/2022 u8.s'de 'bread' ve 'bwrite' prosedürlerinde BugFix. u8.s'de 'bwslot' gözden geçirildi, açıklama eklendi. 'dioreg' gözden geçirildi, doğru. 'rfd', 'rhd', 'wfd', 'whd' gözden geçirildi, doğru. 'dskrd','dskwr' ve 'poke' gözden geçirildi, doğru. 'bufaloc' ve 'diskio' gözden geöirildi, doğru. (Orijinal unix v1'den kalma buffer status kodlamaları daha sonra yeni buffer yapılandırmasında iptal edilecek. Retro UNIX 386 v1.2 ve sonrası disk io, MSDOS'da olduğu gibi direkt yapılacak ve sonuç beklenecek, yani interrupt dönüşü beklenecek. Dolayısıyla orijinal unix v1'deki gibi r/w/busy durum kodlarına/flaglarına gerek yok.) Orijinal unix v1'den kalma status bit flagları şimdilik kullanımda. ; u9.s'de 'getc', 'putc' doğru. 'sndc' içinde iyileştirme yaptım. ux.s'de 'p.break' alanı kullanılmıyordu, iptal ettim. Diğerleri doğru. u2.s'de 'sysexec' içinde 'argc' (<32) ile ilgili düzeltme yaptım. ux.s kontrol ve düzeltmeleri tamam. u5.s'de 'setimod' değişikliği ([imodx], inode modified, file same) yaptım. [imodx] ile ilgili diğer değişiklikleri yaptım. u2.s'de 'syslink' ve 'sysunlink' içinde [imodx] değişikliği yaptım. u7.s'de 'sysmount' da etiket/label hatasını düzelttim. sysdefs.s içinde yeni sistem çağrılarını tanımladım (37,38,39). Ve 's.time' kayıtını superblock buffer+504'e tanımladım. Böylece... Bugün.. Retro UNIX 386 v1.2 (Kernel v0.2.2.0) test düzenlemesi tamamlandı. ****************************************************************** 20/01/2022 (Runix v1.1 ls kodunu runix v1.2 ye uyarladım. ls1.s dosyasının yeni dosya sistemine uygun hali ls2.s dosyası. Bu şekilde directory listeleme programı için geçici/ara kodu başarıyla çalıştırmış oldum. /etc/init'ten sonraki 'single user' modunda mevcut/harici komutlar düzgün çalışıyor. u1.s ve u2.s'de 'syscreate', 'sysmkdir', 'ssyslink' 'sysunlink' ve 'maknod' prosedürlerindeki temporary engelleri kaldırdıktan sonra 'multi user' modunda kontrol yapacağım.) 21/01/2022 u1.s'de 'syscreate, 'sysmkdir' prosedürlerinin temporary (%if 0) engellerini kaldırdım. u2.s'de 'syslink', 'sysunlink' ve 'maknod' prosedürlerinin temporary (%if 0) engellerini kaldırdım. 06/02/2022 u1.s'de 'sysstty' prosedürüne v1.1'deki gibi (yeni, 2022) clear screen özelliği ekledim (dizin listesi alınca alta inen kursörü yeniden video sayfasının üstüne taşıma ana amaç) bunu yaparken u7.s'deki 'cttyp' de değişiklik gerekti. u0.s'de 'ctrlbrk' prosedüründe (2022 v1.1'deki gibi) tekrarlı ([u.quit] = 0FFFFh ise) ctrl+brk tuşlarını dikkate almama düzeltmesi yaptım. u2.s'de 'sysexec' system çağrısında ufak bir kod iyileştirme yaptım. (32 bit register'a sayı atarken, az byte kullanan kodlama) 07/02/2022 video.s'de 'set_ctype' de ufak iyileştirme. u7.s'de 'sysmount'ta ufak düzeltme. 08/02/2022 u7.s'de 'sysmount' düzeltmesi ('diskio' error dönüşü error kodu). u8.s'de 'bread', 'bwrite', 'dskrd', 'dskwr', 'diskio' error dönüş ve error jump kodu düzeltmeleri (bread/bwrite'a dönüş). sysdefs.s'ye error kodu eklenmesi ('invalid fs/superblock'). 09/02/2022 u1.s'de 'syswait' kodunda ufak düzeltme/iyileştirme. u7.s'de 'otty' input açıklaması ve 'otty', 'ctty' iyileştirmeleri. 10/02/2022 u8.s'de 'diskio' prosedürü içindeki hataları düzelttim. (error/stc dönüşünde gereken pop'lar olmadan return yaptırmışım) 11/02/2022 u1.s'de 'syscreat' sistem çağrısı içinde önemli düzelme. u7.s'de 'iopen' prosedüründe 'syscreat' ile ilgili değişiklik. u5.s'de 'free' prosedüründe önemli düzeltme u2.s'de 'fclose' prosedüründe düzeltme. 12/12/2022 u8.s'de diskio prosedüründe hata düzeltme. 14/12/2022 u2.s'de 'syschown' da düzeltme. 16/02/2022 u9.s'de 'sysgeterr' de hata düzeltme. ('retn' yerine 'jmp sysret') ****************************************************************** 21/02/2022 Retro UNIX v1.1 'video.inc' (daha yeni) dosyasını 'video.s' olarak kayıtladım. (v1.2 kernelde kullanılan dosya adı 'video.s') 'clock' (clock386.s) programında sadece video page 0'da oluşan kursör pozisyon hatasını düzeltmeye çalışıyorum. 22/02/2022 u1.s'de 'sysstty' ve 'sysgtty' içinde düzeltme yaptım. (u7.s'de 'ottyp' içinde ebx değeri değişerek dönüş olduğu için) u7.s'de 'ottyp' içinde düzeltme yaptım. 23/02/2022 u7.s'de 'otty' ve 'ottys' düzeltmesi yaptım. u1.s'de 'sysemt' de iyileştirme/düzeltme yaptım. (rtc/timer demolarının da disable/enable yapılması) u1.s'de 'sysstty' içinde 'wttyc' yi ayrı bir prosedüre dönüştürdüm. ('sysemt' içinden video page 6 ve 7'nin temizlenmesi) u1.s'de 'sysmdate' sistem çağrısında dosya modifikasyon zamanı için unix epoch time'ı/zamanını programdan özel olarak girme değişikliği yaptım (ecx input). u0.s'de 'sysinit' içinde 's.time' değerini sb0 (root disk sb) yüklendikten sonra kayıtlacak şekilde değişiklik yaptım. (Root diskin superblock buffer'ı yüklenince 's.time' değeri overwrite olmayacak.) keyboard.s'de 'keyb_int' içinde 32 bit inst. iyileştirmesi yaptım. video.s'de 'set_cpos' ve 'position' (ve pasif/eski 'scroll_up') prosedürleri içinde iyileştirme yaptım. unix386.s'de 'rtc_int' handler'ında video sayfasına (vide page 7) tarih ve zaman yazdıran demoyu 'sysemt' içinden devre dışı bırakıp, sayfayı login için temizlemeye ve multi tasking koşullarını iyileştirmeye olanak veren değişikliği yaptım. (rtc demo single user modunda aktif). 27/02/2022 video.s'de 'set_cpos' prosedüründe (ufak) değişiklik. ux.s'de kullanılmayan 'p.waitc' iptal edildi (kaldırıldı). u4.s'de 'wakeup' ve 'sleep' prosedürlerinde 'p.waitc' değişikliği. u1.s'de 'sysfork' içinde ('p.ttyc' ile ilgili) BugFix ve kullanılmayan 'p.waitc' resetleme değişikliği/iptali. 01/03/2022 u2.s'de 'systell' içinde ufak (tekrarlı işlemi silerek) düzeltme. 02/03/2022 u1.s'de 'sysclose' içinde düzeltme (bugfix). (girişte eax'i kullanan 'fclose' yerine ebx'i kullanan '_fclose') u7.s'de 'otty' içinde ufak düzeltme. 03/03/2022 u7.s'de 'ottyp' içinde ufak düzeltme. 09/03/2022 u6.s'de 'readi' ve 'write' içinde iyileştirme. u8.s'de 'dskwr'içinde u3.s'deki 'clear' prosedürü ve u5.s'deki 'mget_w' prosedürünün 'mget_8:' kısmı ile ilgili düzeltme 'mget_11:'e doğru [ebx] -buffer data adresi- ile jmp. (Düzeltmeden sonra, 'clear'/'dskwr' dönüşünde ebx buffer data adresini içeriyor. Düzeltmeden önce, ebx buffer header adresini gösteriyordu. 'mget_8:'de düzeltme gerekmedi, açıklama yazdım.) u5.s'de 'mget' ('mget_r' ve 'mget_w') prosedüründe iyileştirme. (ebx 'mget dönüşünde kullanılmadığı için mevcut sektörler için işaret olsun diye ebx'i sıfırlamaya gerek yok.) u1.s'de 'syscreat' kodunu alt prosedürleriyle kontrol ettim, hata yok/farkedemedim. u5.s'deki 'free' prosedüründe (free blocks artırma) düzeltme. 11/03/2022 u2.s'de 'syschown' içinde 'set user id on execution' koşulu düzeltmesi. (Bu durumda kullanıcının kendine ait olmayan dosyanın sahibini değiştiremeyeceği şeklinde düzeltme yaptım. Aslında orijinali öyleydi ama yanlışlıkla terse çevirmişim.) u2.s'de 'isown' prosedüründe [u.gid] = [i.gid] koşulunu gözeten kısmı kaldırdım; çünkü dün ve bugünkü çalışmamda unix v5-v7 kernel'in tekil (farkı gruplarda tekrarlamayan) user id/num (u.uid) öngördüğünü/düzenlediğini farkettim. Buna göre, User id [u.uid] ile dosyanın owner's id [i.uid] aynı ise, ayrıca bir group id ([u.gid] = [i.gid]) kontrolüne gerek yok. (Orijinal unix kernelindeki 'chown' prosedürüne ve orijinal 'mkdir.s' kaynak koduna bakılırsa, kullanıcı kodu/numarası aynı ise grup kodu/numarası kontrol edilmiyor.) u2.s'de 'getgid' ve 'getuid' prosedürlerinde düzeltme/değişiklik. u2.s'de 'maknod' içinde 'wslot' çağrısı dönüşünde ebp değeri değişiyordu. ebp'nin değişmemesi gerektiği için, 'maknod' prosedürü içine 'wslot'tan hemen önce ve sonra, ebp için push/pop ekledim. 12/03/2022 u5.s'de 'imap' prosedürüne açıklama ekledim. u2.s'de 'anyi' prosedüründe modified regs açıklama düzeltmesi. u2.s'de 'fclose'da 'iclose' için inode number koruma düzeltmesi. u1.s'de 'syscreat' içinde hata düzeltme. ('syscreat' dosya oluşturma sistem çağrısı, dosya zaten mevcut ise, dosyayı sıfırlıyor/buduyor. Mevcut dosyanın içeriğini budamak için çağrılan 'itrunc_1' prosedürü eax'deki inode number'ı değiştirdiği için, push/pop gerekiyordu.) u2.s'de 'maknod' içinde ve 'anyi' içinde önemli düzeltmeler. 13/03/2022 u5.s'de 'access' prosedüründe (unix v5-v7 fio.c'deki access'e uyan) değişiklik. (User ID aynı ise, group ID dikkate alınmaz; çünkü user ID'ler tekdir. Asıl olan user ID.) u1.s'de 'sysmkdir' içinde root'a ve parent dir'nin sahibine alt dizin oluşturma izini veren değişiklik. (Parent directory owner'ı ile current user aynı olmalı veya current user root/superuser olmalı koşulu. Orijinal unix v5-v7 sub directory oluşturma iznini sadece superuser'a veriyor. Benim yaptığım değişiklik üst/ana dizin sahibine -effective ve real user id aynı olması şartıyla- mkdir izini vermekle birlikte, ayrıca üst/ana dizinin salt okunur olmaması gerekiyor. Sahibi için salt okunur olan bir dizin/directory içinde alt dizin oluşturulamıyor.) u2.s'de 'isdir' prosedüründe dizin sahibine link/unlink izini veren değişiklik yaptım. Yukarıda (Bugün biraz önce) 'sysmkdir' içinde yaptığım değişikliğin amacı ile aynı. Kullanıcı 'sysmkdir' ile yeni dizin oluşturduğu zaman, devamında '.' ve '..' directory entry'lerini syslink ile mevcut dizinlere bağlayabilecek. Onun izni. Ayrıca 'rmdir' işlemi için 'sysunlink' kullanılıyor; dizin sahibi oluşturduğu dizini -boş ise- silebilecek. Dizin sahibi kontrolü yaparken hem efektif hem de gerçek/reel kullanıcı kimliği/numarası (effective and real used id) kontrol ediliyor. Böylece dizinle ilgili link/unlink işlemlerini login yapan kullanıcı dizinin gerçek sahibi ise yapabiliyor. ((Bu şekilde çok kullanıcı kontrollerinin amacı ileride Retro UNIX kaynak kodunu geliştirirken ve türev işletim sistemi kernel'i yazarken, çok kullanıcılı (multi user, multi tasking) işletim sistemi olma kriterlerine uymak, gerçekten çok kullanıcıyla çalışan dosya sistemlerini ve run time sistemi oluşturabilmek, bunun için unix'ten türettiğim retro unix kernelinin kaynak kodu temelini sağlam/hazır tutmak.)) u2.s'de 'anyi' prosedüründe düzeltme. (fsp tablosundaki dosya.) 'chown' prosedüründe ([i.gid] ile ilgili) düzeltme. 21/03/2022 u0.s'de 'rdev_init' prosedüründe hard disk masterboot sektörü yükleyip, runix v2 partition'u bulup, boot sektörün adresini gören ve onu kullanarak süperblok'u yükleyen değişiklileri (düzeltmeleri) yaptım. Hardisk süperbloku kontrol edilmiyor ama masterboot partition tablosunda runix v2 partition bulunamaz ise default SB adresinin sektör 1 olduğu varsayılarak sb yükleniyor. (Burada süperblok yanlış olursa /etc/init yüklenemeyeceği için etc/init hatası alınacak. O nedenle ayrıca bir kontrol eklemedim.) Masterboot yüklenirken hata alınırsa veya süperblok yüklenirken disk okuma hatası alınırsa, bu hata yazılarak (bir tuşa basıldıktan sonra) reboot yaptırılıyor. Bugünkü aşamada kernelin en son hali hard diskten etc/init'i yükletip çalıştırabiliyor ama multiuser modunda etc/init (init8 dosyası) aşamasını geçerken takılıyor. /tmp/umtp'ye yazmayan init7'yi /etc/init olarak kullanırsam shell'e kadar geliyor ve shell de doğru çalışıyor. Ama dosyaya/dizine yazan mkdir gibi program çalıştırınca dosya sistemi bozuluyor (örneğin bin dizinini bozuluyor). /etc/init /tmp/utmp'ye yzacak şekilde şekilde seçilirse (init8) /tmp/utmp'ye sınır dışı (inode sayısını geçen) inode numarası veriyor. Single user modunda takılma olmadan shell'e geçiyor ve oradan login çalıştırılırsa, doğru çalışıyor. Dosyaya veya dizine yazan komut kullanılırsa, dosya sistemine hasar veriyor. ux.s'de Masterboot buff header ve buff (data) yeri oluşturdum. 26/03/2022 u5.s'de 'tloop' prosedüründe düzeltme (dönüşte değeri değişen edx'in -level numarasının- push, pop ile korunması). 'imap' prosedüründe ufak düzeltme/iyileştirme. u2.s'de 'anyi' prosedürü sonunda iyileştirme (kod kısaltma). 12/04/2022 u5.s'de 'free' prosedürü içinde düzeltme/bugfix. (ebx süperblok buffer adresini gösteriyor iken, 'dskrd' sonrasında free blocks map sektörünün/blokunun buffer data adresini gösteriyordu; ebx değişmemiş gibi işlem yapılıyordu ve dolayısıyla 'free' işlemi süperblok'un free blok sayısı alanını bozuyordu. Push ve pop kullanarak ebx'in tekrar süperblok buffer adresini göstermesini sağladım. 'alloc prosedüründe ebx korunuyorken 'free' içinde korumayı unutmuştum.) Bu düzeltme 'itrunc' prosedürünü de düzeltmiş oluyor. 18/04/2022 u1.s'de 'sysopen' içinde düzeltme (fsp'de yeni kayıot açılınca open count = 1 oluyortdu, = 0 olarak düzettim. Open count sadece sysfork tarafından -child proesesler için- artırılıyor.) Böylece 'rmdir' için 'anyi' içindeki (ve ayrıca 'fclose' içindeki) yanlış dallanmayı önledim. (('rmdir' kaynak kodu içindeki 'unlink' işlemlerinden sonra free inodes, free blocks değerlerinin yanlış çıkma sebebini araştırırken -'anyi' doğru çalışmıyordu- dizin silerken doğru çalışan v1.1 ile yanlış çalışan v1.2 arasındaki 'sysopen' farkının 'open count' değeri olduğunu anladım ve 'open count' ile ilgili 'jns' koşullu dallanmasının, open count değerinin 1 değil, 0 olması durumunda doğru olacağını gördüm ve ona göre düzelttim.)) ******************************************************************* -- Retro UNIX 386 v1.2, Kernel v0.2.2.0 burada tamamlanmış oldu. -- -- bundan sonraki düzeltme/değişiklikler Kernel V0.2.2.1 olacak. -- *******************************************************************