Pager virtual address pool bookkeeping added for all pager virtual addresses

Previously virt_to_phys/phys_to_virt macros were used such that they did a
blind offset translation for creating a pager internal virtual address for
user mappings.

This is now changed such that a properly bookkeeped virtual address pool is
used which will avoid any clashes on the virtual space.
This commit is contained in:
Bahadir Balban
2009-08-19 14:44:36 +03:00
parent d351d6846a
commit 95b7b65c89
11 changed files with 94 additions and 46 deletions

View File

@@ -15,6 +15,9 @@ struct address_pool {
unsigned long end;
};
int address_pool_init_with_idpool(struct address_pool *pool,
struct id_pool *idpool,
unsigned long start, unsigned long end);
int address_pool_init(struct address_pool *pool, unsigned long start,
unsigned long end);
void *address_new(struct address_pool *pool, int npages);

View File

@@ -17,7 +17,7 @@ virtual_base = 0xE0000000;
INCLUDE "include/physical_base.lds"
/* physical_base = 0x228000; */
offset = virtual_base - physical_base;
pager_offset = virtual_base - physical_base;
ENTRY(_start)
@@ -25,20 +25,20 @@ SECTIONS
{
. = virtual_base;
_start_text = .;
.text : AT (ADDR(.text) - offset) { crt0.o(.text) *(.text) }
.text : AT (ADDR(.text) - pager_offset) { crt0.o(.text) *(.text) }
/* rodata is needed else your strings will link at physical! */
.rodata : AT (ADDR(.rodata) - offset) { *(.rodata) }
.rodata1 : AT (ADDR(.rodata1) - offset) { *(.rodata1) }
.data : AT (ADDR(.data) - offset)
.rodata : AT (ADDR(.rodata) - pager_offset) { *(.rodata) }
.rodata1 : AT (ADDR(.rodata1) - pager_offset) { *(.rodata1) }
.data : AT (ADDR(.data) - pager_offset)
{
*(.data)
}
.bss : AT (ADDR(.bss) - offset) { *(.bss) }
.bss : AT (ADDR(.bss) - pager_offset) { *(.bss) }
. = ALIGN(4K);
. += 0x2000; /* BSS doesnt increment link counter??? */
/* Below part is to be discarded after boot */
_start_init = .;
.init : AT (ADDR(.init) - offset)
.init : AT (ADDR(.init) - pager_offset)
{
*(.init.data)
*(.init.bootmem)

View File

@@ -25,4 +25,8 @@ void *pager_map_file_range(struct vm_file *f, unsigned long byte_offset,
unsigned long size);
void *pager_validate_map_user_range2(struct tcb *user, void *userptr,
unsigned long size, unsigned int vm_flags);
void *l4_new_virtual(int npages);
void *l4_del_virtual(void *virt, int npages);
#endif /* __MEMORY_H__ */