
I think i need a hint that also your grandmother would understand

Code: Select all
uint mm_page_bind(uint v_addr, char cpl, char wr) {
uint pde = v_addr >> 22;
uint pte = (v_addr >> 12) & 1023;
uint page = mm_alloc_page();
uint *pagedir = (uint *) MEM_PAGEDIR;
uint *pagetable = (uint *) MEM_PAGETABLE;
pagetable += pde * 1024;
pagetable[pte] = page | (1 + (cpl << 2) + (wr << 1));
return page;
}
happened to me a few days ago.. took me 3 days to find this bug ;DBrendan wrote: You'd also need to be careful when doing this, as some areas may not start or end on a page boundary. For example, you could have RAM from 0x00000000 to 0x0009F800 - the last page (from 0009F000 to 0009FFFF) can't be used.
Code: Select all
// Theese are defined in paging.h
extern unsigned int write_cr3();
extern unsigned int write_cr0();
extern unsigned int read_cr3();
extern unsigned int read_cr0();
unsigned long *page_directory;
unsigned long *page_table;
unsigned int page_list_high;
//Done with paging.h
void set_page_table()
{
page_directory = (unsigned long *) ((unsigned long) end | 0x4000);
page_table = (unsigned long *) ((unsigned long) page_directory +4096); // the page table comes right after the page directory
printint((unsigned long)page_directory);
printint((unsigned long)page_table);
printint((unsigned long) end);
unsigned long address = 0; // holds the physical address of where a page is
unsigned int i;
// map the memory
for(i=0; i< memsize / 4; i++)
{
page_table[i] = address | 3; // attribute set to: supervisor level, read/write, present(011 in binary)
address = address + 4096; // 4096 = 4kb
};
page_directory[0] = (int) page_table; // attribute set to: supervisor level, read/write, present(011 in binary)
page_directory[0] = page_directory[0] | 3;
for(i=1; i< 1024; i++)
{
page_directory[i] = 0 | 2; // attribute set to: supervisor level, read/write, not present(010 in binary)
};
write_cr3(page_directory); // put that page directory address into CR3
write_cr0(read_cr0() | 0x80000000); // set the paging bit in CR0 to 1
}
Code: Select all
int page_required;
unsigned long *free_pages_stack = (unsigned long) 0x3FF000;
unsigned long *used_pages_stack = (unsigned long) 0x3FE000;
unsigned int linear_address;
unsigned int used_pages_top;
unsigned int free_pages_top;
unsigned long temp_page;
int i, pto, free_stack_index =0, used_stack_index = 0, first_time = 1 ; //page table offset
Code: Select all
void *kmalloc(int bytes)
{
page_required = 0;
???///find how many page is needed.
???kprintf(" Bytes is : %d\n", bytes);
???build_page_stack(page_directory[0]);
???kprintf(" The lenght of free page stack: %d used page stack are: %d\n\n", free_stack_index, used_stack_index);
???kprintf(" Top free page stack: %h Top used page stack are: %h\n", free_pages_top, used_pages_top);
???
???kprintf(" Top free page stack(3FC000): %h Top used page stack are(3FD000): %h\n", free_pages_top, used_pages_top);
???if (bytes <= 4096 && bytes > 0) //means bytes how many page its required
???{
??????page_required = 1;
??????
??????temp_page = pop(free_pages_stack);
??????push(used_pages_stack, temp_page);
??????//return (void *) temp_page;
??????return temp_page;
??????kprintf(" Kmalloc temp_page : %d\n", temp_page);
???}
???else if ( bytes % 4096 == 0)
???{
??????page_required = (bytes / 4096);
??????kprintf(" Memory greater than 4KB not supported, Page required B is : %d\n", page_required);
???}else
???{
??????page_required = (bytes / 4096) + 1;
??????kprintf(" Memory greater than 4KB not supported, Page required C is : %d\n", page_required);
???}
???kprintf("Kernel end address : %h\n", kernel_end_addr);
???kprintf("Free page stack start address : %h\n", free_pages_stack);
}
Code: Select all
void build_page_stack(int *page_d)
{
???page_offset = 0;
???int page_directory_index = page_d;
???int page_directory_offset = page_d;
???//check and see if the page_directory is present
???page_directory_offset = page_directory_offset << 20 ;
???page_directory_offset >>= 20 ; ??????
??????
???if (page_directory_offset != ( page_directory_offset | 1)) //not present
??????kprintf("Directory %d not present. Its to be loaded\n",page_directory_index);
???else //its present
???{
???int page_directory_index = page_d;
???page_directory_index = (page_directory_index >> 12); //page_directory_init_index = 0
???page_directory_index = (page_directory_index << 12 ) - (0x9D000);
???
???kprintf("build_page_stack parameter is (9D)%d\n",page_directory_index);
???//initialize page stack
???
???//build page table;
???
???for (i = 0; i<1024; i++)
???{
??????
??????page_table_index = page_table[i] >> 12;
??????//kprintf(" PTab Idx:[ %d ]..", page_table_index);
??????page_table_offset = page_table[i] << 20 ;
??????page_table_offset >>= 20 ;
??????//kprintf(" PTab Offset:[ %b ]..", page_table_offset);
??????pto = page_table_offset >> 5;
??????if (pto == (pto | 3 ) || pto == ( pto | 1) || pto == ( pto | 2))
??????{????????????//add to used stack
?????????//kprintf("No Linear address.\n");
?????????linear_address = page_binder(page_directory_index, page_table_index, page_offset);
?????????used_pages_top = used_pages_stack[used_stack_index] = linear_address;
?????????used_stack_index++;
??????}???
??????else if (first_time != 1)
??????{???
?????????
?????????//means it is a free page, add to free stack
?????????linear_address = page_binder(page_directory_index, page_table_index, page_offset);
?????????//kprintf("Lin_addr: %h.\n",linear_address);
?????????free_pages_top = free_pages_stack[free_stack_index] = linear_address;
?????????
?????????//kprintf(" Stacka:%h. stackP:%h\n",free_pages_stack[free_stack_index],free_pages_stack);
?????????free_stack_index++;
??????}else
??????{
?????????
?????????linear_address = page_binder(page_directory_index, page_table_index, page_offset);
?????????//kprintf("Linear Address is :%h.A.\n", linear_address);
?????????free_pages_top = free_pages_stack[free_stack_index] = linear_address;
?????????
?????? //kprintf(" Stacka:%h. stackP:%h\n",free_pages_stack[stack_index] ,free_pages_stack);
?????????free_stack_index++;
?????? // kprintf(" Stacka:%h. stackP:%h\n",free_pages_stack[stack_index] ,free_pages_stack);
?????????first_time = 0; //set first time flag to NO
?????????kprintf("\nPage free stack constructed..\n");
?????????//kprintf("\n.0.\n");
?????????
??????}
???
???}
???
???int k;
???for (k=1008; k<1015; k++)
??? kprintf(" Free stack pages:%h. at:%h\n",free_pages_stack[k],free_pages_stack);
???for (k=10; k<15; k++)
??? kprintf(" Used stack pages:%h. at:%h\n",used_pages_stack[k],used_pages_stack);
???//find the used pages on another stack.
???//write an allocator for use later
???
???}
}
unsigned int page_binder( int *directory, int *table, int *offset)
{
???unsigned int bind_directory = directory;
???unsigned int bind_table = table;
???unsigned int bind_offset = offset;
???unsigned int mem_address;
???mem_address = bind_directory << 22;
???//kprintf(" Mem_address:[ %b ] ", mem_address);
???mem_address += bind_table << 12;
???//kprintf(" Mem_address:[ %b ] ", mem_address);
???mem_address += bind_offset;
???//kprintf(" Mem_address:[ %b ] \n", mem_address);
???//kprintf(" Mem_address:[ %h ] \n", mem_address);
???//kprintf(".B.");
???
???return mem_address;
}
Code: Select all
void push(unsigned long *p, unsigned long pages)
{
???if (p == free_pages_stack)
???{
??????kprintf("Free pages top1 %h\n", free_pages_top);
??????free_pages_stack[free_stack_index] = pages;
??????free_pages_top = free_pages_stack[free_stack_index];
??????kprintf("Free pages top2 %h\n", free_pages_top);
??????free_stack_index++;
???}
???else if (p == used_pages_stack)
???{
??????kprintf("Used pages top1 %h\n", used_pages_top);
??????used_pages_stack[used_stack_index] = pages;
??????used_pages_top = used_pages_stack[used_stack_index];
??????kprintf("Used pages top2 %h\n", used_pages_top);
??????used_stack_index++;
???}
}
unsigned long pop(unsigned long *p)
{
???unsigned long temp;
???
???kprintf("Lenght of p is %h\n", p);
???if (p == free_pages_stack)
???{
??????kprintf("Free pages top1 %h\n", free_pages_top);
??????free_stack_index-=2;
??????kprintf("free_pages_stack[free_stack_index] %h\n",free_pages_stack[free_stack_index]);
??????free_pages_top = free_pages_stack[free_stack_index];
??????
??????kprintf("Free pages top2 %h\n", free_pages_top);
??????free_stack_index++;
??????temp = free_pages_stack[free_stack_index];
??????free_pages_stack[free_stack_index]=NULL;
??????return temp;
???}
???else if (p == used_pages_stack)
???{
?????? kprintf("Used pages top1 %h\n", used_pages_top);
?????? used_stack_index-=2;
?????? kprintf("Used_pages_stack[used_stack_index] %h\n",used_pages_stack[used_stack_index]);
?????? used_pages_top = used_pages_stack[used_stack_index];
??????
?????? kprintf("Used pages top2 %h\n", used_pages_top);
?????? used_stack_index++;
?????? temp = used_pages_stack[used_stack_index];
?????? used_pages_stack[used_stack_index]=NULL;
?????? return temp;
???}
}
If I annoyed you for the huge message. I am really sorry!
Code: Select all
procedure foo(bar:integer);
begin
showmessage('Why am I using Delphi/Pascal?');
end;
Code: Select all
void foo(unsigned int* bar) {
printf("Yeah, why shouldn't all other languages but C be purged from the Net? Who needs %d languages to use except those stupid people who like them?",*i);
}
Code: Select all
and