GNU/Linux >> Znalost Linux >  >> Linux

Jak přidělit paměť, která je zarovnána podle velikosti stránky?

Nemyslím si, že je to možné pouze s mallocem. Můžete použít memalign():

char *data = memalign(PAGESIZE, alloc_size);

Kde PAGESIZE je velikost stránky a alloc_size je velikost paměti, která bude přidělena.

Velikost stránky lze zjistit pomocí sysconf(_SC_PAGESIZE) .


K tomu existují funkce, které byste měli používat.

Pokud to z jakéhokoli důvodu nemůžete, pak se to obecně dělá tak, že se k velikosti alokace přidá velikost bloku a poté se ukazatel zaokrouhlí pomocí triku s celočíselnou matematikou.

Něco takového:

/* Note that alignment must be a power of two. */
void * allocate_aligned(size_t size, size_t alignment)
{
  const size_t mask = alignment - 1;
  const uintptr_t mem = (uintptr_t) malloc(size + alignment);
  return (void *) ((mem + mask) & ~mask);
}

Toto nebylo příliš hluboce testováno, ale chápete to.

Všimněte si, že je nemožné zjistit správný ukazatel na free() paměť později. Abychom to napravili, museli bychom přidat nějaké další zařízení:

typedef struct {
  void *aligned;
} AlignedMemory;

AlignedMemory * allocate_aligned2(size_t size, size_t alignment)
{
  const size_t mask = alignment - 1;
  AlignedMemory *am = malloc(sizeof *am + size + alignment);
  am->aligned = (void *) ((((uintptr_t) (am + 1)) + mask) & ~mask);
  return am;
}

Tím se trik s ukazatelem trochu zabalí a získáte ukazatel, který můžete free() , ale musíte provést dereferenci do aligned ukazatel, abyste získali správně zarovnaný ukazatel.


Linux
  1. Jak vymazat mezipaměť v Linuxu

  2. Jak získat velikost adresáře v Linuxu

  3. Jak programově získat velikost stránky mezipaměti CPU v C++?

  1. Jak zkontrolovat velikost haldy pro proces v Linuxu

  2. Jak vytvořit minimální velikost (prázdný) zip soubor, který má 22B?

  3. Jak snížit využití paměti ClamAV?

  1. Jak seřadit výstup Du podle velikosti?

  2. Jak zkontrolovat celkovou velikost RAM a využití paměti v Linuxu

  3. Jak zvýšit velikost swapu na CentOS + cPanel