📄 memory.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 + -