Morgen zusammen,
ich habe ein Problem mit meinem Kernel. Ich habe mir einen SLAB-Allocator geschrieben, der momentan Slabs fuer allozierbare Caches/Slabs/Objekte erstellt, damit selbst der SLAB-Aufbau moeglichst parallel stattfinden kann. Momentan berechne ich die Anzahl an Objekten, die ich benoetige, damit ich den Speicher moeglichst effektiv verwalten kann.
Meine Formel funktioniert soweit, verschwendet zum Teil nur 300 Byte. Um das zu verhindern, optimiere ich den Speicher danach noch von Hand. Leider spinnt der Kernel, sobald ich ihn mit diesen Optimierungen kompiliere. Woran kann das liegen?
Ohne die Optimierung:
inline void __preboot_text slab_struct_count(size_t* objs, size_t* chunks,
size_t size, size_t alloc) {
size_t tmp;
tmp = alloc - sizeof(struct slab_cache);
tmp /= sizeof(struct slab_chunk) + (sizeof(struct slab_object) + size) *
CONFIG_OBJ_PER_CHUNK;
*chunks = tmp;
*objs = tmp * CONFIG_OBJ_PER_CHUNK;
}
Mit der Optimierung:
inline void __preboot_text slab_struct_count(size_t* objs, size_t* chunks,
size_t size, size_t alloc) {
size_t tmp;
int diff;
tmp = alloc - sizeof(struct slab_cache);
tmp /= sizeof(struct slab_chunk) + (sizeof(struct slab_object) + size) *
CONFIG_OBJ_PER_CHUNK;
*chunks = tmp;
*objs = tmp * CONFIG_OBJ_PER_CHUNK;
diff = alloc - sizeof(struct slab_cache) - tmp * sizeof(struct slab_chunk) -
(tmp * CONFIG_OBJ_PER_CHUNK) * sizeof(struct slab_object);
//optimize the memory
if(diff - sizeof(struct slab_chunk) >= sizeof(struct slab_object) + size) {
diff -= sizeof(struct slab_chunk);
*chunks += 1;
while(diff >= (int)(sizeof(struct slab_object) + size)) {
diff -= sizeof(struct slab_object) + size;
*objs += 1;
}
}
}
Danke.
Gruss,
rizor