[Linux] MAIL-SEMINER: SWAPPING VII

---------

New Message Reply About this list Date view Thread view Subject view Author view

From: Murat Koc (murat.koc@frontsite.de)
Date: Thu 11 Jul 2002 - 23:49:38 EEST


Selam,

Hamam olayina katilim yok herhalde :) Vaktim olmadigi icin yazamadim
seminer dizisini ama simdi dedigim gibi telafi amacli biraz daha uzun
yazacagim sanirim.

Bu arada daha duzgun olsun diye kernel olarak 2.4.18 i ayarladim.

Bu notlari zamaninda Understanding Linux Kernel kitabindan cikarmis idim
ama oradakiler ile 2.4 dekiler farkli biraz bir de tabii bu sekilde kod
incelemesini ne Understanding Linux Kernel da ne de baska bir kitapta
bulamazsiniz.

Bunu niye yazdim? birkac kisi nereden buldun bunlari filan diye sordu.
Understanding Linux Kernel kitabindan notlari cikarip (bakarsaniz zaten
konular oradaki sira ile gidiyor) ustune kendi kod incelemelerim
oldugunu soyledim. Cunku o kitapta yanlislar filan var bir de sadece bu
boyledir su soyledir diye anlatiyordu ama neden ve nasil o sekilde kodda
nerede oldugunu filan soylemiyordu. Dolayisi ile buraya ekledigim kod
incelemeleri ve neyin nerede oldugu bilgisi filan tamamen bana (ve
anlamak icin harcadigim saatlerime) aittir.

Zaten o kitaptan cok daha detayli anlatiyorum.

Hani o birkac kisinin ima etmeye calistigi gibi oradan buradan mi
arakladin diyen olursa kafa atarim :)) o kadar ugrasmisim alla alla.

----------------------------------------------------------------------------
simdi bir page in nasil bulundugundan filan bahsetmisim. devam edelim
bakalim.

Simdi diyelim ki bir page swapped-out yapildi. Bu durumda bunun entry si
pte e eklenir. Boylece bu page daha sonra arandigi zaman bulunur. simdi
burada bir page table a bakmak lazim aslinda

#define _PAGE_PRESENT 0x001
#define _PAGE_RW 0x002
#define _PAGE_USER 0x004
#define _PAGE_PWT 0x008
#define _PAGE_PCD 0x010
#define _PAGE_ACCESSED 0x020
#define _PAGE_DIRTY 0x040
#define _PAGE_PSE 0x080 /* 4 MB (or 2MB) page, Pentium+, if
present.. */
#define _PAGE_GLOBAL 0x100 /* Global TLB entry PPro+ */

#define _PAGE_PROTNONE 0x080 /* If not present */

#define _PAGE_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER |
_PAGE_ACCESSED | _PAGE_DIRTY)

simdi bakin burada __PAGE_TABLE in nelerden olustugunu goruyoruz. eger
bir page swapped-out olursa bu page present olmayacagi icin page table
da bu least significant bit olan __PAGE_PRESENT dogal olarak 0 yapilir.

zaten temelde baktiginiz zaman olabilecek degerler bellidir. Eger bir
page in entry sinin tamami 0 ise o page process in adress space ine ait
degildir.

Eger _PAGE_PRESENT ve _PAGE_RW 0 ise? demek ki page swapped-out
yapilmis.

eger _PAGE_PRESENT 1 ise dogaldir ki o page RAM de :))

simdi bir page birden fazla process in adress space ine dahil olabilir.
bu durumda bu page birden fazla swapping-out islemine tabi tutulabilir
degil mi? fakat gercekte fiziksel olarak bir page 1 kere swapped-out
yapilir. Bu durumda ne olur o page slot una ait olan counter yani ne idi
bu swap_map entry si artar. halihazirda swapped-out yapilmis bir page
swapping-out yapilmaya calisilirken swap_duplicate() fonksiyonu cagrilir
ve iste bu swap_map entry si bu sekilde arttirilir. Biraz daha
swap_duplicate() e yakindan bakalim o zaman.

/*swap_entry_t entry ile fonksiyonumuza parametremiz veriliyor)

int swap_duplicate(swp_entry_t entry)
{
        struct swap_info_struct * p;
        unsigned long offset, type;
        int result = 0;
        
        /*hangi swap alaninda olduguna bakiliyor*/
        type = SWP_TYPE(entry);
        
        /*eger nr_swapfiles dan buyukse asagidaki bad_file gidiliyor ve
oaradaki hata basiliyor. su dosyada su entry filan diye)
        if (type >= nr_swapfiles)
                goto bad_file;
        /* degil ise bunun bulundugu memory deki entry e bakiliyor*/
        p = type + swap_info;
        /*buradan bunun slot bilgisi aliniyor*/
        offset = SWP_OFFSET(entry);
        
        /*o swap alani bir lock ediliyor soyle I/O filan olmasin diye*/
        swap_device_lock(p);

        /*eger bunun bulundugu slot o swap alaninindan kucukse ve bu
        slot un counter i 0 dan farkli ise*/
        if (offset < p->max && p->swap_map[offset]) {
        
        /* bu slot un counter i da max counter sayisinin 1 eksiginden
kucukse*/

                if (p->swap_map[offset] < SWAP_MAP_MAX - 1) {
                        /* o zaman counter 1 arttiriliyor*/
                                p->swap_map[offset]++;
                        /*ve result a 1 degeri ataniyor*/
                        result = 1;
                /*ha eger 1 eksiginden kucuk degilse ama max counter sayisindan
kucukse veya esitse*/
                } else if (p->swap_map[offset] <= SWAP_MAP_MAX) {

                        /*eger swap_overflow un 1 fazlasi 5 den kucukse asagidaki hatayi
basiyor*/
                        if (swap_overflow++ < 5)
                                printk(KERN_WARNING "swap_dup: swap
entry overfl ow\n");
                        /*sonrada o slot un counter ini max counter
                        degerine esitliyor*/
                        p->swap_map[offset] = SWAP_MAP_MAX;
                        /*result a 1 degerini atiyor*/
                        result = 1;
                }
        }

        /*swap alanina I/O islemleri serbest birakiliyor*/
        swap_device_unlock(p);
out:
        return result;

bad_file:
        printk(KERN_ERR "swap_dup: %s%08lx\n", Bad_file, entry.val);
        goto out;
}

yani eger o page daha onceden swapped-out yapilmis ise counter ini 1
arttirarak result olarak 1 degerini donduruyor, yok swapped-out
yapilmamissa veya bir hata olusursa da result olarak 0 degerini
donduruyor.

O.k simdilik bu kadar yeter sanirim. Sonra da bu swap alanlarinin nasil
activate ve deactivate yapildigina yine kodu inceleyerek bakacagiz.

-- 
IYI CALISMALAR

MURAT KOC

-- Attached file included as plaintext by Ecartis -- -- File: signature.asc -- Desc: This is a digitally signed message part

-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux)

iQIXAwUAPS3vYb6uWt8ry/OwFAKV0gf+ONWXwoc75vfewRHCZ7PwFJFJ2jV5E08R /x+0W9GqZ5KLTDT2a+5RnpEABAX4EIYoh0cAWA+JHiFCsTRddZzqiYK1QYF28wSg gnPFSoB36m+/rDj8IfsZRPxrBUwRw6eu/gRreKWu2VjzFvi0K9EOGsn1ugFljU6o vSK3eH38fbPiyHQHqrg8gBkF4tXHHHe7TRLZvSnIr9yJPYP5fRlWH/7iFkF9AhfL BsUP21rwTi/0h4+Fn2fMum1SuWn5VSVuuzHLC86GE/fMrW59GtxiFCp09ATGGtSW nDFISuU+Nlq3FNPigkYyoVF4Auws15Wamd24wczqnVf8geYqBneoWAf9Hy45SvGl 4tNGT4OVTq+/MmIp+KrNDkUkCPW3VDrsCuyfeXVKI2HaPCVeYjINnqoFLAi6EW2J bMFIqVF8Sn1v6NqlbHLPbecdzn51zSaSo8Oe+BZ/EElQPO0Pa0LuRyz5orFGOPN9 3K0PslrcE3+2OuaaGLBHbUBTMS/OcEjnyg2aETo98lxeJQtLNgKTRz6OjVO2tMYP zsVZtuNic/28f2DMajWXnkKDMFzR42da+TArN6CdVH0qoyPdXmVOMsBjJZLJF2WF tgzWkUFXPLH1RZBQTXxS9YOkEakSiah92PrWW9QhH5pnIEj5xpB/Csx7dl6ciSz2 9Lzdne2W/NzXKw== =3ykE -----END PGP SIGNATURE-----

----------------------------------------------------------------------- Liste üyeliğiniz ile ilgili her türlü işlem için http://liste.linux.org.tr adresindeki web arayüzünü kullanabilirsiniz. Listeden çıkmak için: 'linux-request@linux.org.tr' adresine, "Konu" kısmında "unsubscribe" yazan bir e-posta gönderiniz. -----------------------------------------------------------------------


New Message Reply About this list Date view Thread view Subject view Author view

---------

Bu arsiv hypermail 2b29 tarafindan uretilmistir.