Retro UNIX 386 v2 iin kernel programlama/gelitirme notlar...
(Erdoan Tan).. Tarih srasna gre gnlk taslak notlar.
------------------------------------------------------------------------------
(Yaplm ve yaplacak ilemleri/deiiklikleri aklamak ve hatrlamak iin.)

benioku.txt'den devam..
(O dosyann sonunda Retro UNIX v1.2, Kernel v0.2.2.0 tamamlanm oldu)

..burada yazdklarm Retro UNIX v1.2, Kernel v0.2.2.1'in gelitirme notlar.

09/05/2022'de....

1) u2.'s'de sysexec'de argument listi (ecore+pagesize) olan sanal bellek sonundan
4 byte geri ektim (lodsd ve dword move konutlarndan) argument list sonuna doru
genel protection fault -v1.1'de mount programn denerken karlatm- 
olumamas iin nlem aldm. (rnek: stack'tan argument count ekilir ve
son argument pointerden sonra son argument -asciiz string- lodsb yerine
lodsd ile alnrsa bellek sonuna denk gelen argument sonunda gpf oluabiliyor.
Yaptm deiiklik bu olasl engellemek iin.

2) u2.s'de sysstat sadece inode number ve inode structure dndryordu.
'pwd' ve 'cp' gibi programlarda mounted device number gerektii iin,
en uygun ve eskiyle (nceki programlarla) uyumlu yntem olarak inode'un
aygt/disk numarasn eax'de dndrecek ekleme yaptm. Root ise 0, 
mounted ise 1 dnyor. (1 olmak zorunda deil ama [idev] veya [cdev] iindeki say
dorudan disk numras deil; 0 ise root dev olduunu ve disk numarasnn [rdev] de
olduunu, 1 ise mounted dev olduunu ve disk numarasnn [mdev] de olduunu gsteriyor.
Orijinal unix v1 yntemi byle. Retro UNIX de sadece disk numaralar farkl.).

3) diskinit.s iindeki 'set_disk_parms' prosedrnde deiiklik yaptm.
Artk 1 silindiri ayrmadan ne kadar silindir varsa, disk kapasitesi
cylinders*spt*heads olarak doru hesaplanyor. (Eski haliyle son silindir
hesaba katlmyordu ve drv.size'a eksik sector count kaytlanyordu.)
Dzeltme monte edilen (mounted device) dosya sisteminin (sysmount iinde)
geerlilik kontrol ilemi olarak, free map byte count ile disk size
kyaslamasnda doru sonu almak iin gerekti. rnein: 360 byte olan
fd0 sperbloku free map byte says (offset 0'daki word) 360*8 = 2880
sektre karlk geliyor ama 80*18*2 olmas gerekirken, 79*18*2 hesaplanan
disk.size free map bit size ile karlatrldnda geersiz
sperblok (ierii) sonucuna yol ayordu. Bunu dzelttim.   	

4) sysmount iinde [rdev] indeki disk numarasnn ait olduu diskin
mount yaplmasn nleyen (yani root diskinin kendi alt dizinine mount edilmesini
nleyen) deiiklik yaptm. /dev/fd0 device numaras 0 olduu iin, bo
anlamndaki [mdev] = 0 ile akyordu. /dev/fd0 iin umount yaplrken
mount durumu olmad halde, [mdev] iindeki disk numaras 0 ile /dev/fd0
numras eit olduundan umount baarlym grnyordu. nce [mnti] iinde
mounting directory numarasnn olmas artn kontrol ettirerek bunu nledim.
nk mounted device yok ise [mnti] = 0 oluyor. Aksi takdirde sfr olmuyor.

15/05/2022'de....

1) u2.s'de 'namei' iinde 'pwd' komutuna gre '..' parent directory linkin
   (mounted device durumu var ise) doru almas iin	ekleme yaptm ([cdev]=1
   ve [ii]=1 olursa ve '..' istenmi ise, mounting directory'in parent dir
   ('sysmount' onu [mntp] iine kaytlyor) inode numaras dndrlyor.
   ((bu ekleme/deiiklik 'pwd' komutu path ktsnn doru olmasn salyor.)
   Tabii ki mounted device iine dosya yazma yaparken path'in doru olmasn da
   salam oluyor. Geriye doru gidite '..' kullanldndan , deiiklik doru
   oldu.))
2) u7.s'de 'sysmount' iin [mntp] alanna mounting dir'nin parent dir'sinin
   kaytlanmas deiikliini yaptm. [mntp] iinde kaytl inode numarasn
   'namei' kullanyor (yukarda akladm). Ayrca 'sysumount' dosya sisteminin
   bir dizinine monte edilmi aygt device dosya ad doru yazlmsa demonte
   (dismount) ediyor. Bu esnada, eer kullanc ([u.cdir]) demonte olan dizinde
   ise ([u.cdrv]=1), [u.cdir] shell'in altrd child prosese ait olduundan,
   /etc/umount'tan dnte parent prosesin -shell'in kullancya ait kopyesinin-
   doru dizine yerlemesi iin (yani demonte olan device 1 dizinlerinden kp
   mounting directory'e kadar geri gidecek), parent prosesi 'p.ppid', 'p.pid'
   arama/karlatrmas ile bulup, onun 'p.upage' deerinden, upage'indeki
   user structure'nda u.cdir ve u.cdrv deerleri deitiriliyor. 
   [mnti]=0 olurken, srlamadan nceki mnti deeri parent'in 'u.cdir' alanna
   kaytlanyor ve parentin 'u.cdrv' rala sflanyor (0 = root fs).
   Bu ilem umount'tan hemen sonra ('/etc/umount') root fs'deki mounting 
   directory'inin asl ieriinin grlmesini saplyor (ve yukarda aklanan
   faydas oluyor).
3) ux.s'de [mntp] dword alan atm. (bss'te)..

02/06/2022'de ....

sysstime (set unix epoch time) sistem arsnda, ayarlanacak epoch deerini
ieren ebx register'nn set_date_time prosedrnde kullanld yerden nce
temizlenmesi gerekirken, eski deeriyle braklmas, hatal tarih/saat kayt
yaplmasna yol ayordu. Bunu hatay dzeltim ve set_date_time kodunda
iyiletirme yaptm.

08/06/2022'de ....

ux.s iinde 4 byte'lk 'level:' alann 'resd 1' olmas gerekirken 'resd 0'
olarak yazmam nedeniyle (indirekt blok ieren 5120 byte ve st byklkte
dosyalar kopyelerken) u5.s'deki 'mget' iinde (bss kesimindeki 'level' alannn
dword olarak ayrlm olmamas dolaysyla) 5120 byte ve st yeni dosyalarda
yeni sektr/block oluturma ilemi kilitleniyordu (sonsuz dngye giriyordu);
bugn bunu farkedip dzelttim. 
