/i/Yazılım

Umuyoruz ki geleceğin yazılımcıları bu altinciden çıkacak!
  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
    ···
  2. 2.
    +2
    kardes bitmask olusturup chunk lari o bitmask lerle karsilastirman gerekiyor.

    11000011 00001111 11110000 gibi. ingilizce varsa suradan bitmaskler hakkinda bilgi edinebilirsin;

    https://en.wikipedia.org/...ting%29#Masking_bits_to_1
    ···
    1. 1.
      0
      Panpa işte durum o kadar basit değil. Çok büyük bir karşılaştırma. Mesela 38 blok (38 * 512 byte) yer ayırmak istedim, 38 blok boşluğu teker teker taramam nasıl mümkün olabilir? 4 tane byte ve 1 byte'ın 6 biti boş olmalı. Bir de bunlar devamlı, hani Türkçe açıklayamadığım için ingilizce programlama dili terimi olarak söyleyeyim, "contiguous in memory" şeklinde olması gerek.
      ···
  3. 3.
    +2
    programın büyüklüğünü bilmeyerek bişey sormak istiyorum. yıl olmuş 2017 neden bit array ya da o kadar düşük bellek kullanım ihtiyacı duyuyorsun acaba?
    ···
    1. 1.
      +1
      Panpa sebebi "düşük bellek" allokatörü olması.
      Şimdi bu işlemcilerle alakalı bir mesele, burada anlatmak istemedim soruyu uzatmamak için.
      Bu klagib bir işletim sistemi yazılımı değil. Bu işletim sisteminden bağımsız çalışan bir BIOS yazılımı. Dolayısıyla Real Mode'da çalışıyor.

      işlemcilerde adres bacakları var. işlemcinin kaç bit olduğunu belirleyen bu adres bacaklarının sayısı. 32 bit işlemcilerde 32 adres bacağı bulunur. Real Mode'da 21. adres bacağından (A20) itibaren adresleme devre dışı bırakılır, yani 32 adres bacağı yerine 20 adres bacağı kalır. 32 bit işlemci 20 bit işlemci olarak çalışır ve maksimum 1 MB RAM adresleyebilir. Hani 32 bit işletim sistemi maksimum 4 GB RAM destekliyor ya, bunu da 20 bit işletim sistemi olarak düşün. Maksimum 1 MB destekliyor. Bu 1 MB düşük bellek yüksek bellek ayrımı buradan geliyor. A20 altı ve A20 üstü kısacası.

      Ben Real Mode'da çalıştığımdan yalnızca A20 altı belleği, yani ilk 1 MB'ı kullanabiliyorum. Üstelik bu ilk 1 MB'ın yaklaşık 470 kilobyte'ı BIOS ve EBDA için ayrılmış durumda. Bana da sadece 530 kilobyte civarı kalıyor. Bunu da olabildiğince verimli kullanmak istiyorum panpa.
      ···
      1. 1.
        +1
        genel olarak bahsettiklerini anladım ancak herhangi bir tecrübem olmadı. eyvallah açıklaman için.
        ···
  4. 4.
    +1
    up up up
    ···
  5. 5.
    0
    Updullah ahahaha
    ···
  6. 6.
    0
    Updullah Updullah
    ···