📄 arch2.c
字号:
#include "memory.h"
extern void reload_cr3();
int memory_set_tlb_item(int memory_process_id,
int file_window,int logic_block_number,
int physical_number,int right)
{
int i,*p,*p1,return_value,memory_body_id,dir;
memory_body_id=memory_body->my_memory_body;
physical_number=(physical_number&(0x0007ffff));
physical_number=(int)get_block_base(
memory_body_id,physical_number);
physical_number=(physical_number&(0x3ffff000))+(right&(0x7));
physical_number=(physical_number|(0x01));
if(file_window>=FILE_NUMBER)
return (-1);
if(logic_block_number>=(128*1024))
return (-1);
dir=logic_block_number/1024;
logic_block_number=logic_block_number%1024;
if(dir>file_page_table[file_window].number)
return (-1);
if((i=file_page_table[file_window].page_table_block[dir])<0){
file_page_table[file_window].item_number[dir]=0;
file_page_table[file_window].reference_number[dir]=0;
if((i=get_free_block(memory_process_id))<0)
return (-1);
file_page_table[file_window].page_table_block[dir]=i;
i=(memory_body->physical_block+i)->physical_number;
p=(int *)get_block_base(memory_body_id,i);
for(i=0,p1=p;i<1024;i++,p1++)
*p1=0;
}else{
i=(memory_body->physical_block+i)->physical_number;
p=(int *)get_block_base(memory_body_id,i);
}
p=p+logic_block_number;
return_value=(*p);
*p=physical_number;
if((return_value&(0x01))==0){
file_page_table[file_window].item_number[dir]++;
return 1;
}else
return (-1);
}
int memory_clear_tlb_item(int memory_process_id,
int file_window,int logic_block_number)
{
register int eflag;
int i,*p,v,memory_body_id,dir,block_number;
memory_body_id=memory_body->my_memory_body;
if(file_window>=FILE_NUMBER)
return (-1);
if(logic_block_number>=(128*1024))
return (-1);
dir=logic_block_number/1024;
if(dir>file_page_table[file_window].number)
return (-1);
logic_block_number=logic_block_number%1024;
block_number=file_page_table[file_window].page_table_block[dir];
if(block_number<0)
return (-1);
i=(memory_body->physical_block+block_number)->physical_number;
p=(int *)get_block_base(memory_body_id,i);
p=p+logic_block_number;
v=(*p);
*p=0;
if((v&(0x01))==0)
return (-1);
file_page_table[file_window].item_number[dir]--;
eflag=disable_interruption();
if((file_page_table[file_window].item_number[dir]<=0)
&&(file_page_table[file_window].reference_number[dir]<=0)){
free_free_block(memory_process_id,
file_page_table[file_window].
page_table_block[dir]);
file_page_table[file_window].
page_table_block[dir]=(-1);
file_page_table[file_window].item_number[dir]=0;
file_page_table[file_window].reference_number[dir]=0;
notify_switch(current.thread_id);
}
reload_cr3_flag=0;
reload_cr3();
restore_interruption(eflag);
return (v&(0x40));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -