|
@@ -348,19 +348,13 @@ ul slab_init()
|
|
|
|
|
|
memory_management_struct.end_of_struct += kmalloc_cache_group[i].cache_pool->bmp_len + ((sizeof(ul) << 2) & (~sizeof(ul) - 1));
|
|
|
|
|
|
- memset(kmalloc_cache_group[i].cache_pool->bmp, 0, kmalloc_cache_group[i].cache_pool->bmp_len);
|
|
|
+
|
|
|
+ memset(kmalloc_cache_group[i].cache_pool->bmp, 0xff, kmalloc_cache_group[i].cache_pool->bmp_len);
|
|
|
+ for (int j = 0; j < kmalloc_cache_group[i].cache_pool->bmp_count; ++j)
|
|
|
+ *(kmalloc_cache_group[i].cache_pool->bmp + (j >> 6)) ^= 1UL << (j % 64);
|
|
|
|
|
|
kmalloc_cache_group[i].count_total_using = 0;
|
|
|
kmalloc_cache_group[i].count_total_free = kmalloc_cache_group[i].cache_pool->count_free;
|
|
|
-
|
|
|
- memset(kmalloc_cache_size[i].cache_pool->color_map,0xff,kmalloc_cache_size[i].cache_pool->color_length);
|
|
|
-
|
|
|
- for(j = 0;j < kmalloc_cache_size[i].cache_pool->color_count;j++)
|
|
|
- *(kmalloc_cache_size[i].cache_pool->color_map + (j >> 6)) ^= 1UL << j % 64;
|
|
|
-
|
|
|
- kmalloc_cache_size[i].total_free = kmalloc_cache_size[i].cache_pool->color_count;
|
|
|
- kmalloc_cache_size[i].total_using = 0;
|
|
|
- */
|
|
|
}
|
|
|
|
|
|
struct Page *page = NULL;
|
|
@@ -388,10 +382,10 @@ ul slab_init()
|
|
|
for (int i = 0; i < 16; ++i)
|
|
|
{
|
|
|
|
|
|
- virt = (ul*)(PAGE_2M_ALIGN(memory_management_struct.end_of_struct+PAGE_2M_SIZE*i));
|
|
|
+ virt = (ul *)(PAGE_2M_ALIGN(memory_management_struct.end_of_struct + PAGE_2M_SIZE * i));
|
|
|
page = Virt_To_2M_Page(virt);
|
|
|
|
|
|
- page_init(page, PAGE_PGT_MAPPED|PAGE_KERNEL|PAGE_KERNEL_INIT);
|
|
|
+ page_init(page, PAGE_PGT_MAPPED | PAGE_KERNEL | PAGE_KERNEL_INIT);
|
|
|
|
|
|
kmalloc_cache_group[i].cache_pool->page = page;
|
|
|
kmalloc_cache_group[i].cache_pool->vaddr = virt;
|
|
@@ -401,16 +395,187 @@ ul slab_init()
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ * @brief 在kmalloc中创建slab_obj的函数(与slab_malloc()中的类似)
|
|
|
+ *
|
|
|
+ * @param size
|
|
|
+ * @return struct slab_obj* 创建好的slab_obj
|
|
|
+ */
|
|
|
+
|
|
|
+struct slab_obj *kmalloc_create_slab_obj(ul size)
|
|
|
+{
|
|
|
+ struct Page *page = alloc_pages(ZONE_NORMAL, 1, 0);
|
|
|
+
|
|
|
+
|
|
|
+ if (page == NULL)
|
|
|
+ {
|
|
|
+ kBUG("kmalloc_create()->alloc_pages()=>page == NULL");
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ page_init(page, PAGE_KERNEL);
|
|
|
+
|
|
|
+ ul *vaddr = NULL;
|
|
|
+ ul struct_size = 0;
|
|
|
+ struct slab_obj *slab_obj_ptr;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ switch (size)
|
|
|
+ {
|
|
|
+
|
|
|
+
|
|
|
+ case 32:
|
|
|
+ case 64:
|
|
|
+ case 128:
|
|
|
+ case 256:
|
|
|
+ case 512:
|
|
|
+ vaddr = phys_2_virt(page->addr_phys);
|
|
|
+
|
|
|
+ struct_size = sizeof(struct slab_obj) + PAGE_2M_SIZE / size / 8;
|
|
|
+
|
|
|
+ slab_obj_ptr = (struct slab_obj *)((unsigned char *)vaddr + PAGE_2M_SIZE - struct_size);
|
|
|
+ slab_obj_ptr->bmp = (ul *)slab_obj_ptr + sizeof(struct slab_obj);
|
|
|
+
|
|
|
+ slab_obj_ptr->count_free = (PAGE_2M_SIZE - struct_size) / size;
|
|
|
+ slab_obj_ptr->count_using = 0;
|
|
|
+ slab_obj_ptr->bmp_count = slab_obj_ptr->count_free;
|
|
|
+ slab_obj_ptr->vaddr = vaddr;
|
|
|
+ slab_obj_ptr->page = page;
|
|
|
+
|
|
|
+ list_init(&slab_obj_ptr->list);
|
|
|
+
|
|
|
+ slab_obj_ptr->bmp_len = ((slab_obj_ptr->bmp_count + sizeof(ul) * 8 - 1) >> 6) << 3;
|
|
|
+
|
|
|
+
|
|
|
+ memset(slab_obj_ptr->bmp, 0xff, slab_obj_ptr->bmp_len);
|
|
|
+
|
|
|
+ for (int i = 0; i < slab_obj_ptr->bmp_count; ++i)
|
|
|
+ *(slab_obj_ptr->bmp + (i >> 6)) ^= 1UL << (i % 64);
|
|
|
+
|
|
|
+ break;
|
|
|
+
|
|
|
+
|
|
|
+ case 1024:
|
|
|
+ case 2048:
|
|
|
+ case 4096:
|
|
|
+ case 8192:
|
|
|
+ case 16384:
|
|
|
+ case 32768:
|
|
|
+ case 65536:
|
|
|
+ case 131072:
|
|
|
+ case 262144:
|
|
|
+ case 524288:
|
|
|
+ case 1048576:
|
|
|
+ slab_obj_ptr = (struct Slab *)kmalloc(sizeof(struct slab_obj), 0);
|
|
|
+
|
|
|
+ slab_obj_ptr->count_free = PAGE_2M_SIZE / size;
|
|
|
+ slab_obj_ptr->count_using = 0;
|
|
|
+ slab_obj_ptr->bmp_count = slab_obj_ptr->count_free;
|
|
|
+
|
|
|
+ slab_obj_ptr->bmp_len = ((slab_obj_ptr->bmp_count + sizeof(ul) * 8 - 1) >> 6) << 3;
|
|
|
+
|
|
|
+ slab_obj_ptr->bmp = (ul *)kmalloc(slab_obj_ptr->bmp_len, 0);
|
|
|
+
|
|
|
+
|
|
|
+ memset(slab_obj_ptr->bmp, 0xff, slab_obj_ptr->bmp_len);
|
|
|
+ for (int i = 0; i < slab_obj_ptr->bmp_count; ++i)
|
|
|
+ *(slab_obj_ptr->bmp + (i >> 6)) ^= 1UL << (i % 64);
|
|
|
+
|
|
|
+ slab_obj_ptr->vaddr = phys_2_virt(page->addr_phys);
|
|
|
+ slab_obj_ptr->page = page;
|
|
|
+ list_init(&slab_obj_ptr->list);
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ kerror("kamlloc_create(): Wrong size%d\n", size);
|
|
|
+ free_pages(page, 1);
|
|
|
+ return NULL;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return slab_obj_ptr;
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
* @brief 通用内存分配函数
|
|
|
*
|
|
|
* @param size 要分配的内存大小
|
|
|
* @param flags 内存的flag
|
|
|
- * @return void*
|
|
|
+ * @return void* 内核内存虚拟地址
|
|
|
*/
|
|
|
void *kmalloc(unsigned long size, unsigned long flags)
|
|
|
{
|
|
|
-
|
|
|
+ if (size > 1048576)
|
|
|
+ {
|
|
|
+ kwarn("kmalloc(): Can't alloc such memory: %ld bytes, because it is too large.", size);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ int index;
|
|
|
+ for (int i = 0; i < 16; ++i)
|
|
|
+ if (kmalloc_cache_group[i].size >= size)
|
|
|
+ {
|
|
|
+ index = i;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ struct slab_obj *slab_obj_ptr = kmalloc_cache_group[index].cache_pool;
|
|
|
+
|
|
|
+
|
|
|
+ if (kmalloc_cache_group[index].count_total_free == 0)
|
|
|
+ {
|
|
|
+
|
|
|
+ slab_obj_ptr = kmalloc_create_slab_obj(kmalloc_cache_group[index].size);
|
|
|
+
|
|
|
+
|
|
|
+ if (slab_obj_ptr == NULL)
|
|
|
+ {
|
|
|
+ kBUG("kmalloc()->kmalloc_create_slab_obj()=>slab == NULL");
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+ kmalloc_cache_group[index].count_total_free += slab_obj_ptr->count_free;
|
|
|
+ list_add(&kmalloc_cache_group[index].cache_pool->list, &slab_obj_ptr->list);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ do
|
|
|
+ {
|
|
|
+
|
|
|
+ if (slab_obj_ptr->count_free == 0)
|
|
|
+ slab_obj_ptr = container_of(list_next(&slab_obj_ptr->list), struct slab_obj, list);
|
|
|
+ else
|
|
|
+ break;
|
|
|
+ } while (slab_obj_ptr != kmalloc_cache_group[index].cache_pool);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ int md;
|
|
|
+ for (int i = 0; i < slab_obj_ptr->count_free; ++i)
|
|
|
+ {
|
|
|
+
|
|
|
+ if (*slab_obj_ptr->bmp + (i >> 6) == 0xffffffffffffffffUL)
|
|
|
+ {
|
|
|
+ i += 63;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ md = i % 64;
|
|
|
+
|
|
|
+ if (*(slab_obj_ptr->bmp + (i >> 6)) & (1UL << md) == 0)
|
|
|
+ {
|
|
|
+ *(slab_obj_ptr->bmp + (i >> 6)) |= (1UL << md);
|
|
|
+ ++(slab_obj_ptr->count_using);
|
|
|
+ --(slab_obj_ptr->count_free);
|
|
|
+
|
|
|
+ --kmalloc_cache_group[index].count_total_free;
|
|
|
+ ++kmalloc_cache_group[index].count_total_using;
|
|
|
+
|
|
|
+ return (void*)((char*)slab_obj_ptr->vaddr+kmalloc_cache_group[index].size*i);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ kerror("kmalloc(): Cannot alloc more memory: %d bytes", size);
|
|
|
+ return NULL;
|
|
|
}
|
|
|
|
|
|
|