mm.c/h -> frames.c/h: Naming indicating dealing with physical not virtual memory
This commit is contained in:
		| @@ -20,7 +20,7 @@ | |||||||
|  |  | ||||||
| #include <print.h> | #include <print.h> | ||||||
| #include <types.h> | #include <types.h> | ||||||
| #include <mm.h> | #include <frames.h> | ||||||
|  |  | ||||||
| #define SCTLR 15,0,1,0,0 | #define SCTLR 15,0,1,0,0 | ||||||
| #define TTBR0 15,0,2,0,0 | #define TTBR0 15,0,2,0,0 | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ | |||||||
|  |  | ||||||
| #include <print.h> | #include <print.h> | ||||||
| #include <types.h> | #include <types.h> | ||||||
| #include <mm.h> | #include <frames.h> | ||||||
|  |  | ||||||
| extern uint32 kernel_start_phys, kernel_end_phys; | extern uint32 kernel_start_phys, kernel_end_phys; | ||||||
| extern uint32 kernel_start, kernel_end; | extern uint32 kernel_start, kernel_end; | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ | |||||||
|  |  | ||||||
| #include <types.h> | #include <types.h> | ||||||
| #include <framebuffer.h> | #include <framebuffer.h> | ||||||
| #include <mm.h> | #include <frames.h> | ||||||
| #include <math.h> | #include <math.h> | ||||||
|  |  | ||||||
| #define PL110_CR_EN		0x001 | #define PL110_CR_EN		0x001 | ||||||
| @@ -45,7 +45,7 @@ int pl110_init(struct fb *f, unsigned int color_depth) { | |||||||
| 	unsigned int width, height; | 	unsigned int width, height; | ||||||
| 	unsigned int fb_size, power; | 	unsigned int fb_size, power; | ||||||
| 	struct pl110_control *plio = (struct pl110_control*)PL110_IOBASE; | 	struct pl110_control *plio = (struct pl110_control*)PL110_IOBASE; | ||||||
| 	struct page *p; | 	struct frame *fr; | ||||||
|  |  | ||||||
| 	/* 640x480 pixels */ | 	/* 640x480 pixels */ | ||||||
| 	width = 640; | 	width = 640; | ||||||
| @@ -58,11 +58,11 @@ int pl110_init(struct fb *f, unsigned int color_depth) { | |||||||
| 	power = log(fb_size) - log(MM_PAGE_SIZE); | 	power = log(fb_size) - log(MM_PAGE_SIZE); | ||||||
| 	if ((unsigned int)1<<power < fb_size) | 	if ((unsigned int)1<<power < fb_size) | ||||||
| 		power++; | 		power++; | ||||||
| 	p = mm_get_free_pages(power); | 	fr = get_free_frames(power); | ||||||
| 	if (!p) | 	if (!fr) | ||||||
| 		return -1; | 		return -1; | ||||||
|  |  | ||||||
| 	plio->upbase = (uint32)p->address; | 	plio->upbase = (uint32)fr->address; | ||||||
|  |  | ||||||
| 	if (color_depth == FB_COLOR_DEPTH_8) { | 	if (color_depth == FB_COLOR_DEPTH_8) { | ||||||
| 		plio->control = 0x1827; | 		plio->control = 0x1827; | ||||||
|   | |||||||
| @@ -21,7 +21,7 @@ | |||||||
| #include <framebuffer.h> | #include <framebuffer.h> | ||||||
| #include <init.h> | #include <init.h> | ||||||
| #include <math.h> | #include <math.h> | ||||||
| #include <mm.h> | #include <frames.h> | ||||||
| #include <types.h> | #include <types.h> | ||||||
|  |  | ||||||
| #include <drivers/fb.h> | #include <drivers/fb.h> | ||||||
| @@ -47,7 +47,7 @@ int pl111_init_dev(struct fb *f, unsigned int color_depth) { | |||||||
| 	unsigned int width, height; | 	unsigned int width, height; | ||||||
| 	unsigned int fb_size, power; | 	unsigned int fb_size, power; | ||||||
| 	struct pl111_control *plio = (struct pl111_control*)PL111_IOBASE; | 	struct pl111_control *plio = (struct pl111_control*)PL111_IOBASE; | ||||||
| 	struct page *p; | 	struct frame *fr; | ||||||
|  |  | ||||||
| 	/* 640x480 pixels */ | 	/* 640x480 pixels */ | ||||||
| 	width = 640; | 	width = 640; | ||||||
| @@ -60,11 +60,11 @@ int pl111_init_dev(struct fb *f, unsigned int color_depth) { | |||||||
| 	power = log(fb_size) - log(MM_PAGE_SIZE); | 	power = log(fb_size) - log(MM_PAGE_SIZE); | ||||||
| 	if ((unsigned int)1<<power < fb_size) | 	if ((unsigned int)1<<power < fb_size) | ||||||
| 		power++; | 		power++; | ||||||
| 	p = mm_get_free_pages(power); | 	fr = get_free_frames(power); | ||||||
| 	if (!p) | 	if (!fr) | ||||||
| 		return -1; | 		return -1; | ||||||
|  |  | ||||||
| 	plio->upbase = (uint32)p->address; | 	plio->upbase = (uint32)fr->address; | ||||||
|  |  | ||||||
| 	if (color_depth == FB_COLOR_DEPTH_8) { | 	if (color_depth == FB_COLOR_DEPTH_8) { | ||||||
| 		plio->control = 0x1827; | 		plio->control = 0x1827; | ||||||
|   | |||||||
| @@ -18,23 +18,23 @@ | |||||||
|     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #ifndef MM_H | #ifndef FRAMES_H | ||||||
| #define MM_H | #define FRAMES_H | ||||||
| 
 | 
 | ||||||
| #include <list.h> | #include <list.h> | ||||||
| 
 | 
 | ||||||
| #define MM_PAGE_SIZE 4096 | #define MM_PAGE_SIZE 4096 | ||||||
| 
 | 
 | ||||||
| struct page { | struct frame { | ||||||
| 	void *address; | 	void *address; | ||||||
| 	struct dlist_node list; | 	struct dlist_node list; | ||||||
| 	char free; | 	char free; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| void mm_init(); | void frames_init(); | ||||||
| void mm_add_free_region(void *start, void *end); | void declare_memory_region(void *start, void *end); | ||||||
| 
 | 
 | ||||||
| struct page* mm_get_free_pages(unsigned int power); | struct frame* get_free_frames(unsigned int power); | ||||||
| int mm_put_free_pages(struct page *p); | int put_free_frames(struct frame *p); | ||||||
| 
 | 
 | ||||||
| #endif /* MM_H */ | #endif /* FRAMES_H */ | ||||||
| @@ -19,37 +19,43 @@ | |||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include <list.h> | #include <list.h> | ||||||
| #include <mm.h> | #include <frames.h> | ||||||
| #include <print.h> | #include <print.h> | ||||||
| #include <types.h> | #include <types.h> | ||||||
| 
 | 
 | ||||||
| struct dlist_node mm_free_page_list; | struct dlist_node free_frames_list; | ||||||
| 
 | 
 | ||||||
| void mm_init() { | void frames_init() { | ||||||
| 	init_list(&mm_free_page_list); | 	init_list(&free_frames_list); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| //presupposes mm_free_page_list is a properly initialized list
 | /*
 | ||||||
| void insert_page(struct page *p) { |  * Adds a page frame struct to the list of free page frames. Presupposes | ||||||
| 	if (list_empty(&mm_free_page_list) || p->address < container(mm_free_page_list.next, struct page, list)->address) { |  * free_frames_list is a properly initialized list. | ||||||
| 		insert_after(&mm_free_page_list, &p->list); |  */ | ||||||
| 	} else if (p->address > container(mm_free_page_list.prev, struct page, list)->address) { | static void insert_page_frame(struct frame *p) { | ||||||
| 		insert_before(&mm_free_page_list, &p->list); | 	if (list_empty(&free_frames_list) || p->address < container(free_frames_list.next, struct frame, list)->address) { | ||||||
|  | 		insert_after(&free_frames_list, &p->list); | ||||||
|  | 	} else if (p->address > container(free_frames_list.prev, struct frame, list)->address) { | ||||||
|  | 		insert_before(&free_frames_list, &p->list); | ||||||
| 	} else { | 	} else { | ||||||
| 		struct page *it; | 		struct frame *it; | ||||||
| 		for_each_list(it, &mm_free_page_list, struct page, list) { | 		for_each_list(it, &free_frames_list, struct frame, list) { | ||||||
| 			if (p->address < it->address) { | 			if (p->address < it->address) { | ||||||
| 				insert_before(&it->list, &p->list); | 				insert_before(&it->list, &p->list); | ||||||
| 				return; | 				return; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		print("Error: failed to insert page\n"); | 		print("Error: failed to insert page frame\n"); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void mm_add_free_region(void *start, void *end) { | /*
 | ||||||
|  |  * Called to add a segment of memory to the frame allocation pool. | ||||||
|  |  */ | ||||||
|  | static void add_physical_memory(void *start, void *end) { | ||||||
| 	unsigned int num_pages, usable_pages; | 	unsigned int num_pages, usable_pages; | ||||||
| 	struct page *p; | 	struct frame *p; | ||||||
| 	void *page; | 	void *page; | ||||||
| 
 | 
 | ||||||
| 	//If region starts at 0x0, make it start at next page to not screw up null pointer detection, etc.
 | 	//If region starts at 0x0, make it start at next page to not screw up null pointer detection, etc.
 | ||||||
| @@ -73,40 +79,44 @@ void mm_add_free_region(void *start, void *end) { | |||||||
| 	//TODO we're potentially losing memory here because we're calculating
 | 	//TODO we're potentially losing memory here because we're calculating
 | ||||||
| 	//the number of page structs we need even for those pages that will contain only page structs
 | 	//the number of page structs we need even for those pages that will contain only page structs
 | ||||||
| 	num_pages = ((char *)end + 1 - (char *)start) / MM_PAGE_SIZE; | 	num_pages = ((char *)end + 1 - (char *)start) / MM_PAGE_SIZE; | ||||||
| 	usable_pages = num_pages - num_pages * sizeof(struct page) / MM_PAGE_SIZE; | 	usable_pages = num_pages - num_pages * sizeof(struct frame) / MM_PAGE_SIZE; | ||||||
| 	if (num_pages * sizeof(struct page) % MM_PAGE_SIZE) | 	if (num_pages * sizeof(struct frame) % MM_PAGE_SIZE) | ||||||
| 		usable_pages--; | 		usable_pages--; | ||||||
| 
 | 
 | ||||||
| 	p = (struct page *)start; | 	p = (struct frame *)start; | ||||||
| 	for (page = ((char *)start) + (num_pages - usable_pages)*MM_PAGE_SIZE; page < end; page = (void *)(((char *)page) + MM_PAGE_SIZE)) { | 	for (page = ((char *)start) + (num_pages - usable_pages)*MM_PAGE_SIZE; page < end; page = (void *)(((char *)page) + MM_PAGE_SIZE)) { | ||||||
| 		p->address = page; | 		p->address = page; | ||||||
| 		insert_page(p); | 		insert_page_frame(p); | ||||||
| 		p++; | 		p++; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| struct page* mm_get_free_pages(unsigned int power) { | /*
 | ||||||
|  |  * Attempt to get 2^power contiguous page frames. Returns the frame struct of | ||||||
|  |  * the first frame on success or a null pointer on failure. | ||||||
|  |  */ | ||||||
|  | struct frame* get_free_frames(unsigned int power) { | ||||||
| 	unsigned int num_pages = 1<<power; | 	unsigned int num_pages = 1<<power; | ||||||
| 	struct page *it; | 	struct frame *it; | ||||||
| 
 | 
 | ||||||
| 	if (list_empty(&mm_free_page_list)) { | 	if (list_empty(&free_frames_list)) { | ||||||
| 		print("Error: Out of memory\n"); | 		print("Error: Out of memory\n"); | ||||||
| 		return (struct page*)0; | 		return (struct frame*)0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (!num_pages) { | 	if (!num_pages) { | ||||||
| 		print("Error: mm_get_free_pages must be called with power from 0 to 31, inclusive (power=%d)\n", power); | 		print("Error: mm_get_free_pages must be called with power from 0 to 31, inclusive (power=%d)\n", power); | ||||||
| 		return (struct page*)0; | 		return (struct frame*)0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for_each_list(it, &mm_free_page_list, struct page, list) { | 	for_each_list(it, &free_frames_list, struct frame, list) { | ||||||
| 		unsigned int curr_pages = 1; | 		unsigned int curr_pages = 1; | ||||||
| 		struct page *it2; | 		struct frame *it2; | ||||||
| 		for (it2 = container(it->list.next, struct page, list); | 		for (it2 = container(it->list.next, struct frame, list); | ||||||
| 					it2->list.next != &mm_free_page_list && curr_pages < num_pages; | 					it2->list.next != &free_frames_list && curr_pages < num_pages; | ||||||
| 					it2 = container(it2->list.next, struct page, list)) { | 					it2 = container(it2->list.next, struct frame, list)) { | ||||||
| 			if ((char*)it2->address != (char*)container(it2->list.prev, struct page, list)->address + MM_PAGE_SIZE) { | 			if ((char*)it2->address != (char*)container(it2->list.prev, struct frame, list)->address + MM_PAGE_SIZE) { | ||||||
| 				it = it2; //fast-forward 'it' to start of next contiguous section of pages 
 | 				it = it2; //fast-forward 'it' to start of next contiguous section of pages
 | ||||||
| 				break; | 				break; | ||||||
| 			} else { | 			} else { | ||||||
| 				curr_pages++; | 				curr_pages++; | ||||||
| @@ -117,14 +127,17 @@ struct page* mm_get_free_pages(unsigned int power) { | |||||||
| 			return it; | 			return it; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return (struct page*)0; | 	return (struct frame*)0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int mm_put_free_pages(struct page *p) { | /*
 | ||||||
| 	struct page *it; |  * Return pages allocated to the pool of unused pages. | ||||||
| 	for_each_list(it, &mm_free_page_list, struct page, list) { |  */ | ||||||
| 		if (p->address < it->address) { | int put_free_frames(struct frame *f) { | ||||||
| 			insert_splice_before(&it->list, &p->list, p->list.prev); | 	struct frame *it; | ||||||
|  | 	for_each_list(it, &free_frames_list, struct frame, list) { | ||||||
|  | 		if (f->address < it->address) { | ||||||
|  | 			insert_splice_before(&it->list, &f->list, f->list.prev); | ||||||
| 			return 0; | 			return 0; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @@ -20,9 +20,9 @@ | |||||||
|  |  | ||||||
| #include <console.h> | #include <console.h> | ||||||
| #include <framebuffer.h> | #include <framebuffer.h> | ||||||
|  | #include <frames.h> | ||||||
| #include <kmalloc.h> | #include <kmalloc.h> | ||||||
| #include <print.h> | #include <print.h> | ||||||
| #include <mm.h> |  | ||||||
| #include <mmu.h> | #include <mmu.h> | ||||||
| #include <types.h> | #include <types.h> | ||||||
|  |  | ||||||
| @@ -109,7 +109,7 @@ int main(void) { | |||||||
| 	serial_console_init(); | 	serial_console_init(); | ||||||
|  |  | ||||||
| 	//setup memory subsystems | 	//setup memory subsystems | ||||||
| 	mm_init(); | 	frames_init(); | ||||||
| 	kmalloc_init(); | 	kmalloc_init(); | ||||||
| 	if (detect_memory()) { | 	if (detect_memory()) { | ||||||
| 		print("Error: Failed to detect memory.\n"); | 		print("Error: Failed to detect memory.\n"); | ||||||
|   | |||||||
| @@ -6,11 +6,11 @@ include $(BASEDIR)/header.mk | |||||||
| OBJS_$(d) := $(d)/console.o \ | OBJS_$(d) := $(d)/console.o \ | ||||||
| 	$(d)/font.o \ | 	$(d)/font.o \ | ||||||
| 	$(d)/framebuffer.o \ | 	$(d)/framebuffer.o \ | ||||||
|  | 	$(d)/frames.o \ | ||||||
| 	$(d)/init.o \ | 	$(d)/init.o \ | ||||||
| 	$(d)/kmalloc.o \ | 	$(d)/kmalloc.o \ | ||||||
| 	$(d)/list.o \ | 	$(d)/list.o \ | ||||||
| 	$(d)/math.o \ | 	$(d)/math.o \ | ||||||
| 	$(d)/mm.o \ |  | ||||||
| 	$(d)/print.o | 	$(d)/print.o | ||||||
|  |  | ||||||
| KOBJS += $(OBJS_$(d)) | KOBJS += $(OBJS_$(d)) | ||||||
|   | |||||||
| @@ -19,7 +19,7 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include <kmalloc.h> | #include <kmalloc.h> | ||||||
| #include <mm.h> | #include <frames.h> | ||||||
| #include <list.h> | #include <list.h> | ||||||
| #include <print.h> | #include <print.h> | ||||||
|  |  | ||||||
| @@ -96,12 +96,12 @@ coalesce: | |||||||
| void *_kmalloc(unsigned int bytes, unsigned int tries); | void *_kmalloc(unsigned int bytes, unsigned int tries); | ||||||
|  |  | ||||||
| void *grow_and_retry(unsigned int bytes, unsigned int tries) { | void *grow_and_retry(unsigned int bytes, unsigned int tries) { | ||||||
| 	struct page *p; | 	struct frame *f; | ||||||
|  |  | ||||||
| 	if ((p = mm_get_free_pages(curr_page_power))) { | 	if ((f = get_free_frames(curr_page_power))) { | ||||||
| 		struct kmalloc_region *region = (struct kmalloc_region *)p->address; | 		struct kmalloc_region *region = (struct kmalloc_region *)f->address; | ||||||
| 		//TODO don't throw away p, but keep it in a list (allocate a little at the beginning of this chunk for a list element), so we can free pages later if we want to | 		//TODO don't throw away f, but keep it in a list (allocate a little at the beginning of this chunk for a list element), so we can free pages later if we want to | ||||||
| 		region->end = (char *)region + MM_PAGE_SIZE * (1 << curr_page_power) - 1; | 		region->end = (char *)region + CONFIG_PAGE_SIZE * (1 << curr_page_power) - 1; | ||||||
| 		add_region(region); | 		add_region(region); | ||||||
| 		curr_page_power++; | 		curr_page_power++; | ||||||
| 		return _kmalloc(bytes, tries); | 		return _kmalloc(bytes, tries); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user