/i/Yazılım

Umuyoruz ki geleceğin yazılımcıları bu altinciden çıkacak!
    başlık yok! burası bom boş!
  1. 1.
    +2
    Panpalar şimdi mesele şu.

    Yazılımım için düşük bellek (Adres < 1MB) allokatörü yazıyorum. C'deki malloc gibi yani. Yaptığım şey düşük belleği 512 byte'lık parçalara (bloklara) bölmek.

    Blokların durumunu tutan bir array kullanıyorum. Fakat yerden tasarruf etmek için byte array yerine bit array (bitmap) kullanmak daha doğru olur.

    Yani:
    uint8_t block_usage_bitmap[MEM_SIZE / 512]
    Yapmak yerine yerden tasarruf ederek:
    uint8_t block_usage_bitmap[MEM_SIZE / 512 / 8]
    Yapmak ve bit bazında işaretleme yapmak istiyorum.

    Mesela ilk 2048 byte ayrıldıysa:

    Üstteki örnek için block_usage_bitmap[0], block_usage_bitmap[1], block_usage_bitmap[2] ve block_usage_bitmap[3]'ün değeri 1 oluyor, ama koca koca byte'ları ziyan etmiş oluyorum.

    Alttaki örnek içinse block_usage_bitmap[0]'daki ilk 4 bit 1 oluyor, ve aynı işi sadece 1 byte kullanarak yapabiliyorum.

    block_usage_bitmap[0] bu durumda 00001111 oluyor yani.

    Durum böyle, buraya kadar her şey iyi. Fakat mesele şurada. 2048 byte istiyorsam hepsi sıralı gelmeli. Yani mesela block_usage_bitmap[1]'de boş 4 tane (4 * 512 = 2048) blok olsun. Fakat bunlar yan yana değilse kabul etmemeliyim.

    11001001 olmaz mesela. 4 blok boşluk var ama yan yana değil. Fakat 11000011 olabilir, çünkü 4 bit de yan yana.

    Bundan anlayan panpalarım yardım edebilir mi?

    Gerçekten çok acil bu. Şimdiden teşekkürler...

    !!! ÖNEMLi EDiT !!!

    Panpalar malloc kısmını hallettim. Şimdi de free yazmam gerek. Bunda da sorun şu, free ederken hangi bloğun ne kadar olduğunu, yani kaç biti 0 yapmam gerektiğini nasıl bilebilirim?

    Bu da kaynak kodu:
    https://hastebin.com/budimalafu.cpp

    !!! ÖNEMLi EDiT !!!

    SON EDiT:

    Panpalar yardım eden etmeyen herkese teşekkür ederim.
    Sorunu iki gün sürse de çözdüm.

    Bitmap kullanınca yukarıdaki sorunu çözmek mümkün değildi, ben de düşük bellekten biraz feda edip bytemap kullandım. Ve boş alana 0, dolu alana 1, dolu alanın devdıbına 2 dedim.

    işe yaradı, hem lmalloc hem de lfree gayet iyi çalışıyor. Bu da kodun son hali:
    https://hastebin.com/ililijuzem.cpp
    ···
   tümünü göster