From e75338a3d3e5120a82a668c96cc9528dd333c0b7 Mon Sep 17 00:00:00 2001 From: zhaoyanbai Date: Sat, 19 Sep 2026 21:21:41 +0800 Subject: [PATCH] =?utf8?q?=E6=95=B4=E7=90=86=E5=86=85=E5=AD=98=E5=88=86?= =?utf8?q?=E9=85=8D=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- drivers/ata.c | 2 +- drivers/ide.c | 2 +- drivers/pci.c | 3 ++- fs/ext2.c | 4 ++-- fs/super.c | 2 +- include/mm.h | 4 ++++ include/page.h | 13 +++++++++---- include/system.h | 4 ---- kernel/exec.c | 3 ++- kernel/irq.c | 4 ++-- kernel/printk.c | 2 +- kernel/vmalloc.c | 1 + mm/buddy.c | 2 +- mm/kmem.c | 2 +- mm/slub.c | 2 +- 15 files changed, 29 insertions(+), 21 deletions(-) diff --git a/drivers/ata.c b/drivers/ata.c index 8e5669a..5602e22 100644 --- a/drivers/ata.c +++ b/drivers/ata.c @@ -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; - char* sect = kmalloc(SECT_SIZE, 0); + char* sect = kmalloc(SECT_SIZE, GFP_REWRITE); memset(sect, 0xAA, SECT_SIZE); #if 1 // partid == 0 代表整块硬盘 diff --git a/drivers/ide.c b/drivers/ide.c index 52bd0eb..922dae1 100644 --- a/drivers/ide.c +++ b/drivers/ide.c @@ -237,7 +237,7 @@ void ide_pci_init(pci_device_t* pci) { // 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); diff --git a/drivers/pci.c b/drivers/pci.c index e11c5fd..923c8cc 100644 --- a/drivers/pci.c +++ b/drivers/pci.c @@ -14,6 +14,7 @@ *-------------------------------------------------------------------------- */ #include +#include #include #include #include @@ -68,7 +69,7 @@ void scan_pci_bus(int bus) { 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; diff --git a/fs/ext2.c b/fs/ext2.c index b163d09..f6093a0 100644 --- 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] == '/'); - 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)); @@ -231,7 +231,7 @@ unsigned int ext2_search_inpath(const char* path) { 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"); } diff --git a/fs/super.c b/fs/super.c index 8caf940..e3faf48 100644 --- a/fs/super.c +++ b/fs/super.c @@ -11,7 +11,7 @@ #include "fs.h" #include "irq.h" #include "list.h" -#include "system.h" +#include "mm.h" LIST_HEAD(g_superblocks); diff --git a/include/mm.h b/include/mm.h index a307fb8..35aa6fa 100644 --- a/include/mm.h +++ b/include/mm.h @@ -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* 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 diff --git a/include/page.h b/include/page.h index a3dcb74..22e56bc 100644 --- a/include/page.h +++ b/include/page.h @@ -134,8 +134,6 @@ static inline pde_t* get_pgd() { return (pde_t*)pa2va((get_cr3() & PAGE_MASK)); } -typedef unsigned int gfp_t; - enum page_flags { PG_Private, }; @@ -207,10 +205,17 @@ typedef struct free_area { 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); -#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; diff --git a/include/system.h b/include/system.h index dce336f..fb6a900 100644 --- a/include/system.h +++ b/include/system.h @@ -55,10 +55,6 @@ 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") diff --git a/kernel/exec.c b/kernel/exec.c index 67dacb5..633d39c 100644 --- a/kernel/exec.c +++ b/kernel/exec.c @@ -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; - 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); diff --git a/kernel/irq.c b/kernel/irq.c index 5100c9d..2f56c35 100644 --- a/kernel/irq.c +++ b/kernel/irq.c @@ -206,7 +206,7 @@ int request_irq(unsigned int irq, void (*handler)(unsigned int, pt_regs_t*, void 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; } @@ -232,7 +232,7 @@ void add_irq_bh_handler(void (*handler)(), void* arg) { // 本函数不用考虑临界问题 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; diff --git a/kernel/printk.c b/kernel/printk.c index 448711c..47632c0 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -16,7 +16,7 @@ */ #include -#include +#include #include #include #include diff --git a/kernel/vmalloc.c b/kernel/vmalloc.c index a5e3901..7c2a0bb 100644 --- a/kernel/vmalloc.c +++ b/kernel/vmalloc.c @@ -13,6 +13,7 @@ #include #include #include +#include static vm_struct_t* vm_area_list = NULL; diff --git a/mm/buddy.c b/mm/buddy.c index 9f251a5..4489b5f 100644 --- a/mm/buddy.c +++ b/mm/buddy.c @@ -117,7 +117,7 @@ found: 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 // ... diff --git a/mm/kmem.c b/mm/kmem.c index e500cc0..965806c 100644 --- 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* cache = kmalloc(sizeof(kmem_cache_t), 0); + kmem_cache_t* cache = kmalloc(sizeof(kmem_cache_t), GFP_REWRITE); if (cache == 0) { return 0; } diff --git a/mm/slub.c b/mm/slub.c index ff171b5..12b41c9 100644 --- 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* page = alloc_pages(gfpflags, cache->order); + page_t* page = alloc_pages(cache->order, gfpflags); if (0 == page) { return 0; } -- 2.55.0