⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memory.c

📁 阿基米德操作系统的源代码
💻 C
字号:

/////////////////////////////////////////////////////////////////////////
#include "general.h"
#include "invalidate.h"
/////////////////////////////////////////////////////////////////////////unsigned long mem_map[1024];
unsigned long cur_user_sp;
unsigned long min_user_sp;

void init_mem(void)
{
	int i;
	
	for (i = 0; i < 1024; i++)
		mem_map[i] = 0;

	return;
}unsigned long get_free_page(void){
	///////////////////////////////////////////
	unsigned long i;

	i = find_first_page(mem_map);
	if ((i >= 32768) || (i >= min_user_sp))
		return 0;

	set_bit(i,mem_map);

	i = LOW_MEM + (i << 12);
	clear_page(i);

	return i;

	///////////////////////////////////////////	unsigned long __res;	__asm__("std ; repne ; scasb\n\t"			"jne 1f\n\t"			"movb $1,1(%%edi)\n\t"			"shll $12,%%ecx\n\t"			"movl %%ecx,%%edx\n\t"			"addl %2,%%edx\n\t"						"movl $1024,%%ecx\n\t"			"leal 4092(%%edx),%%edi\n\t"			"rep ; stosl\n\t"			"movl %%edx,%%eax\n"			"1:"			:"=a" (__res)			:"0" (0),"i" (LOW_MEM),"c" (PAGING_PAGES),			"D" (mem_map + PAGING_PAGES - 1));	return __res;}void free_page(unsigned long addr){
	////////////////////////////////////////////
	if ((addr < LOW_MEM) || (addr >= HIGH_MEM))
		return;
	addr	= addr - LOW_MEM;
	addr	= addr >> 12;

	clear_bit(addr, mem_map);

	return;
	////////////////////////////////////////////	if ((addr < LOW_MEM) || (addr >= HIGH_MEM))
		return;	addr  -= LOW_MEM;	addr >>= 12;	if (mem_map[addr]--) 
		return;	mem_map[addr] = 0;
	return;}int free_page_tables(unsigned long from,unsigned long size){	unsigned long * pg_table;	unsigned long * dir , nr;	if ((!from) || (from & 0x3fffff))
		return 0;
	size = (size + 0x3fffff) >> 22;	dir = (unsigned long *) ((from >> 20) & 0xffc); 	for ( ; size > 0 ; size-- , dir++) {		if (!(*dir & 1))			continue;		pg_table = (unsigned long *) (*dir & 0xfffff000);		for (nr = 0 ; nr < 1024 ; nr++ , pg_table++) {			if (*pg_table & 1)				free_page(*pg_table & 0xfffff000);			*pg_table = 0;		}		free_page(*dir & 0xfffff000);		*dir = 0;	}	invalidate();	return 1;}unsigned long put_page(unsigned long page,unsigned long address){	unsigned long tmp, * page_table;	if ((page < LOW_MEM) || (page >= HIGH_MEM || (mem_map[(page - LOW_MEM) >> 12] != 1))
		return 0;
	page_table = (unsigned long *) ((address >> 20) & 0xffc);	if ((*page_table) & 1)		page_table = (unsigned long *)(*page_table & 0xfffff000);	else {		if (!(tmp = get_free_page()))			return 0;		*page_table = tmp | 7;		page_table  = (unsigned long *) tmp;	}	page_table[(address >> 12) & 0x3ff] = page | 7;	return page;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -