]> Zhao Yanbai Git Server - kernel.git/commitdiff
整理内存分配接口 master
authorzhaoyanbai <zhaoyanbai@126.com>
Sat, 19 Sep 2026 13:21:41 +0000 (21:21 +0800)
committerzhaoyanbai <zhaoyanbai@126.com>
Sat, 19 Sep 2026 13:21:41 +0000 (21:21 +0800)
15 files changed:
drivers/ata.c
drivers/ide.c
drivers/pci.c
fs/ext2.c
fs/super.c
include/mm.h
include/page.h
include/system.h
kernel/exec.c
kernel/irq.c
kernel/printk.c
kernel/vmalloc.c
mm/buddy.c
mm/kmem.c
mm/slub.c

index 8e5669a8eb2318231cbf8082c7445f5ef7f73115..5602e22c4990090b00f284deb305bc5a98affaec 100644 (file)
@@ -373,7 +373,7 @@ void tmp_ide_disk_read(dev_t dev, uint32_t sect_nr, uint32_t count, char* buf) {
 // lba_partition_table: 扩展分区的真实偏移地址
 void read_partition_table(ide_drive_t* drv, uint32_t mbr_ext_offset, uint64_t lba_partition_table, int depth) {
     // disk_request_t r;
 // lba_partition_table: 扩展分区的真实偏移地址
 void read_partition_table(ide_drive_t* drv, uint32_t mbr_ext_offset, uint64_t lba_partition_table, int depth) {
     // disk_request_t r;
-    char* sect = kmalloc(SECT_SIZE, 0);
+    char* sect = kmalloc(SECT_SIZE, GFP_REWRITE);
     memset(sect, 0xAA, SECT_SIZE);
 #if 1
     // partid == 0 代表整块硬盘
     memset(sect, 0xAA, SECT_SIZE);
 #if 1
     // partid == 0 代表整块硬盘
index 52bd0eb0326c5d076749a3c2d5cc69fa200bd43c..922dae144df98400cd256cd4f0bdbe9a1d6fd7e2 100644 (file)
@@ -237,7 +237,7 @@ void ide_pci_init(pci_device_t* pci) {
 
 // void ide_debug() {
 //     unsigned int nsect = 1;
 
 // void ide_debug() {
 //     unsigned int nsect = 1;
-//     char *buf = kmalloc(1 * SECT_SIZE, 0);
+//     char *buf = kmalloc(1 * SECT_SIZE);
 //     if (buf == 0) panic("out of memory");
 
 //     ide_do_read(0, nsect, buf);
 //     if (buf == 0) panic("out of memory");
 
 //     ide_do_read(0, nsect, buf);
index e11c5fdfa2e1937faa89d2c3894ce651aabdcbc5..923c8ccc1ec69ae1d5de65a637e463d3182f7d62 100644 (file)
@@ -14,6 +14,7 @@
  *--------------------------------------------------------------------------
  */
 #include <io.h>
  *--------------------------------------------------------------------------
  */
 #include <io.h>
+#include <mm.h>
 #include <pci.h>
 #include <printk.h>
 #include <system.h>
 #include <pci.h>
 #include <printk.h>
 #include <system.h>
@@ -68,7 +69,7 @@ void scan_pci_bus(int bus) {
                 continue;
             }
 
                 continue;
             }
 
-            pci_device_t* pci = kmalloc(sizeof(pci_device_t), 0);
+            pci_device_t* pci = kmalloc(sizeof(pci_device_t), GFP_ATOMIC);
             if (0 == pci) {
                 printk("no space to alloc for pci_device_t\n");
                 continue;
             if (0 == pci) {
                 printk("no space to alloc for pci_device_t\n");
                 continue;
index b163d0936701daa558b5cf25cca0bd6b43811aa6..f6093a01b1553544ecf2df43b35f90d4638a860b 100644 (file)
--- a/fs/ext2.c
+++ b/fs/ext2.c
@@ -194,7 +194,7 @@ unsigned int ext2_search_inpath(const char* path) {
     assert(strlen(path) > 0);
     assert(path[0] == '/');
 
     assert(strlen(path) > 0);
     assert(path[0] == '/');
 
-    ext2_inode_t* inode = kmalloc(sizeof(ext2_inode_t), 0);
+    ext2_inode_t* inode = kmalloc(sizeof(ext2_inode_t), GFP_REWRITE);
     assert(inode != 0);
     memcpy(inode, &ext2_root_inode, sizeof(ext2_inode_t));
 
     assert(inode != 0);
     memcpy(inode, &ext2_root_inode, sizeof(ext2_inode_t));
 
@@ -231,7 +231,7 @@ unsigned int ext2_search_inpath(const char* path) {
 void ext2_setup_fs() {
     memset(&ext2_fs, 0, sizeof(ext2_fs));
 
 void ext2_setup_fs() {
     memset(&ext2_fs, 0, sizeof(ext2_fs));
 
-    char* buf = kmalloc(EXT2_BLOCK_SIZE, 0);
+    char* buf = kmalloc(EXT2_BLOCK_SIZE, GFP_REWRITE);
     if (buf == 0) {
         panic("out of memory");
     }
     if (buf == 0) {
         panic("out of memory");
     }
index 8caf94089f99921e19466fd74319e2f87110b8b2..e3faf48c6f29a51a77d8b6493fac056168573b06 100644 (file)
@@ -11,7 +11,7 @@
 #include "fs.h"
 #include "irq.h"
 #include "list.h"
 #include "fs.h"
 #include "irq.h"
 #include "list.h"
-#include "system.h"
+#include "mm.h"
 
 LIST_HEAD(g_superblocks);
 
 
 LIST_HEAD(g_superblocks);
 
index a307fb86fc70b33d4d1698b479e9a2cad40fb9f9..35aa6fa40b0c2fabdca0eb4c71d8db76d22696c0 100644 (file)
@@ -22,6 +22,10 @@ kmem_cache_t* kmem_cache_create(const char* name, size_t size, size_t align);
 void* kmem_cache_alloc(kmem_cache_t* cache, gfp_t gfpflags);
 void* kmem_cache_zalloc(kmem_cache_t* cache, gfp_t gfpflags);
 
 void* kmem_cache_alloc(kmem_cache_t* cache, gfp_t gfpflags);
 void* kmem_cache_zalloc(kmem_cache_t* cache, gfp_t gfpflags);
 
+void* kmalloc(size_t size, gfp_t gfpflags);
+void* kzalloc(size_t size, gfp_t gfpflags);
+void kfree(void* addr);
+
 #define VM_READ 0x00000001
 #define VM_WRITE 0x00000002
 #define VM_EXEC 0x00000004
 #define VM_READ 0x00000001
 #define VM_WRITE 0x00000002
 #define VM_EXEC 0x00000004
index a3dcb7409075dac31ffcbed81079064620d56400..22e56bc99a7e2910ac904ea446577c216111ff92 100644 (file)
@@ -134,8 +134,6 @@ static inline pde_t* get_pgd() {
     return (pde_t*)pa2va((get_cr3() & PAGE_MASK));
 }
 
     return (pde_t*)pa2va((get_cr3() & PAGE_MASK));
 }
 
-typedef unsigned int gfp_t;
-
 enum page_flags {
     PG_Private,
 };
 enum page_flags {
     PG_Private,
 };
@@ -207,10 +205,17 @@ typedef struct free_area {
     list_head_t free_list;
 } free_area_t;
 
     list_head_t free_list;
 } free_area_t;
 
-page_t* alloc_pages(unsigned int gfp_mask, unsigned int order);
+typedef enum {
+    GFP_NONE = 0,
+    GFP_ATOMIC = 1,
+    GFP_KERNEL = 2,
+    GFP_REWRITE = 3, // 后续需要重新处理的接口,暂时写个值在这里提醒
+} gfp_t;
+
+page_t* alloc_pages(unsigned int order, gfp_t gfpflags);
 void free_pages(unsigned long addr);
 
 void free_pages(unsigned long addr);
 
-#define alloc_one_page(gfp_mask) alloc_pages(gfp_mask, 0)
+#define alloc_one_page(gfpflags) alloc_pages(0, gfpflags)
 
 struct kmem_cache {
     const char* name;
 
 struct kmem_cache {
     const char* name;
index dce336f596736f68843a3dba0d4d92b2086964f6..fb6a90094f8458435cf9fee406cdc51eb3eb39f9 100644 (file)
         1;                             \
     })
 
         1;                             \
     })
 
-void* kmalloc(size_t size, gfp_t gfpflags);
-void* kzalloc(size_t size, gfp_t gfpflags);
-void kfree(void* addr);
-
 // extern char etext, edata, end;
 
 #define cli() asm volatile("cli")
 // extern char etext, edata, end;
 
 #define cli() asm volatile("cli")
index 67dacb597d8b8ded35eab85d36fddc3d5714a2ec..633d39cd45ee54f15e8a12d58d8145b850f6b742 100644 (file)
@@ -85,7 +85,8 @@ int sysc_exec(const char* path, char* const argv[]) {
         unsigned int pgcnt = (mmsz + PAGE_SIZE - 1) / PAGE_SIZE;
         unsigned int blkcnt = (filesz + EXT2_BLOCK_SIZE - 1) / EXT2_BLOCK_SIZE;
 
         unsigned int pgcnt = (mmsz + PAGE_SIZE - 1) / PAGE_SIZE;
         unsigned int blkcnt = (filesz + EXT2_BLOCK_SIZE - 1) / EXT2_BLOCK_SIZE;
 
-        void* buf = kmalloc(pgcnt * PAGE_SIZE, PAGE_SIZE);
+        // void* buf = kmalloc(pgcnt * PAGE_SIZE);
+        void *buf = page2va(alloc_pages(pgcnt, GFP_KERNEL));
         assert(PAGE_ALIGN(buf) == (unsigned long)buf);
         assert(buf != 0);
 
         assert(PAGE_ALIGN(buf) == (unsigned long)buf);
         assert(buf != 0);
 
index 5100c9d324f75a7d0ab352c2b1f60c37e5c64f68..2f56c355bdb8bf4d7f8171ab2b9a2aeef3b14314 100644 (file)
@@ -206,7 +206,7 @@ int request_irq(unsigned int irq, void (*handler)(unsigned int, pt_regs_t*, void
         p = p->next;
     }
 
         p = p->next;
     }
 
-    p = (irq_action_t*)kmalloc(sizeof(irq_action_t), 0);
+    p = (irq_action_t*)kmalloc(sizeof(irq_action_t), GFP_ATOMIC);
     if (p == NULL) {
         return -ENOMEM;
     }
     if (p == NULL) {
         return -ENOMEM;
     }
@@ -232,7 +232,7 @@ void add_irq_bh_handler(void (*handler)(), void* arg) {
     // 本函数不用考虑临界问题
 
     irq_bh_action_t* p;
     // 本函数不用考虑临界问题
 
     irq_bh_action_t* p;
-    p = (irq_bh_action_t*)kmalloc(sizeof(irq_bh_action_t), 0);
+    p = (irq_bh_action_t*)kmalloc(sizeof(irq_bh_action_t), GFP_ATOMIC);
     assert(p != NULL);
 
     p->handler = handler;
     assert(p != NULL);
 
     p->handler = handler;
index 448711cb08eedc01816d41f2dfdf82189f7f85c7..47632c0b5250ad1f21771b5a9b9164ef58be91b9 100644 (file)
@@ -16,7 +16,7 @@
  */
 
 #include <irq.h>
  */
 
 #include <irq.h>
-#include <system.h>
+#include <mm.h>
 #include <tty.h>
 #include <vt.h>
 #include <console.h>
 #include <tty.h>
 #include <vt.h>
 #include <console.h>
index a5e390173a22f7d3b7de96257075c9474447acfc..7c2a0bb0b7172e86b4b3a94305aa32640d67ddc3 100644 (file)
@@ -13,6 +13,7 @@
 #include <page.h>
 #include <assert.h>
 #include <string.h>
 #include <page.h>
 #include <assert.h>
 #include <string.h>
+#include <mm.h>
 
 static vm_struct_t* vm_area_list = NULL;
 
 
 static vm_struct_t* vm_area_list = NULL;
 
index 9f251a5a765b72ae3f26d0e3e4082fe8803653a7..4489b5f80b5551bad660bd22c572d8e1588c09a4 100644 (file)
@@ -117,7 +117,7 @@ found:
     return page;
 }
 
     return page;
 }
 
-page_t* alloc_pages(unsigned int gfp_mask, unsigned int order) {
+page_t* alloc_pages(unsigned int order, gfp_t gfpflags) {
     // gfp_mask
     // ...
 
     // gfp_mask
     // ...
 
index e500cc0c632161777b6f92d5bc5cecc1c98df120..965806c9afe575a7f80f68d35087d9a1358dd7ae 100644 (file)
--- a/mm/kmem.c
+++ b/mm/kmem.c
@@ -92,7 +92,7 @@ void kmem_cache_free(kmem_cache_t* cache, void* addr) {
 }
 
 kmem_cache_t* kmem_cache_create(const char* name, size_t size, size_t align) {
 }
 
 kmem_cache_t* kmem_cache_create(const char* name, size_t size, size_t align) {
-    kmem_cache_t* cache = kmalloc(sizeof(kmem_cache_t), 0);
+    kmem_cache_t* cache = kmalloc(sizeof(kmem_cache_t), GFP_REWRITE);
     if (cache == 0) {
         return 0;
     }
     if (cache == 0) {
         return 0;
     }
index ff171b585da3cb3cb30d8e348a985a4cdd4c7508..12b41c9c7736f8bc98789f64ce4859413bfab148 100644 (file)
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -29,7 +29,7 @@ page_t* get_partial(kmem_cache_t* cache, gfp_t gfpflags) {
 
 // 从伙伴系统批发页,并将之初始化成一个链表
 page_t* new_slub(kmem_cache_t* cache, gfp_t gfpflags) {
 
 // 从伙伴系统批发页,并将之初始化成一个链表
 page_t* new_slub(kmem_cache_t* cache, gfp_t gfpflags) {
-    page_t* page = alloc_pages(gfpflags, cache->order);
+    page_t* page = alloc_pages(cache->order, gfpflags);
     if (0 == page) {
         return 0;
     }
     if (0 == page) {
         return 0;
     }