// 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 代表整块硬盘
// 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);
*--------------------------------------------------------------------------
*/
#include <io.h>
+#include <mm.h>
#include <pci.h>
#include <printk.h>
#include <system.h>
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;
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));
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");
}
#include "fs.h"
#include "irq.h"
#include "list.h"
-#include "system.h"
+#include "mm.h"
LIST_HEAD(g_superblocks);
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
return (pde_t*)pa2va((get_cr3() & PAGE_MASK));
}
-typedef unsigned int gfp_t;
-
enum page_flags {
PG_Private,
};
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;
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")
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);
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;
}
// 本函数不用考虑临界问题
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;
*/
#include <irq.h>
-#include <system.h>
+#include <mm.h>
#include <tty.h>
#include <vt.h>
#include <console.h>
#include <page.h>
#include <assert.h>
#include <string.h>
+#include <mm.h>
static vm_struct_t* vm_area_list = NULL;
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
// ...
}
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;
}
// 从伙伴系统批发页,并将之初始化成一个链表
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;
}