47c40a10a1
added vm_memcpy_from_physical() and vm_memcpy_physical_page(), and added respective functions to the vm_translation_map operations. The architecture specific implementation can now decide how to implement them most efficiently. Added generic implementations that can be used, though. * Changed vm_{get,put}_physical_page(). The former no longer accepts flags (the only flag PHYSICAL_PAGE_DONT_WAIT wasn't needed anymore). Instead it returns an implementation-specific handle that has to be passed to the latter. Added vm_{get,put}_physical_page_current_cpu() and *_debug() variants, that work only for the current CPU, respectively when in the kernel debugger. Also adjusted the vm_translation_map operations accordingly. * Made consequent use of the physical memory operations in the source tree. * Also adjusted the m68k and ppc implementations with respect to the vm_translation_map operation changes, but they are probably broken, nevertheless. * For x86 the generic physical page mapper isn't used anymore. It is suboptimal in any case. For systems with small memory it is too much overhead, since one can just map the complete physical memory (that's not done yet, though). For systems with large memory it counteracts the VM strategy to reuse the least recently used pages. Since those pages will most likely not be mapped by the page mapper anymore, it will keep remapping chunks. This was also the reason why building Haiku in Haiku was significantly faster with only 256 MB RAM (since that much could be kept mapped all the time). Now we're using a different strategy: We have small pools of virtual page slots per CPU that are used for the physical page operations (memset_physical(), memcpy_*_physical()) with CPU-pinned thread. Furthermore we have four slots per translation map, which are used to map page tables. These changes speed up the Haiku image build in Haiku significantly. On my Core2 Duo 2.2 GHz 2 GB machine about 40% to 20 min 40 s (KDEBUG disabled, block cache debug disabled). Still more than factor 3 slower than FreeBSD and Linux, though. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28244 a95241bf-73f2-0310-859d-f6bbb57e9c96
66 lines
2.1 KiB
C
66 lines
2.1 KiB
C
/*
|
|
* Copyright 2002-2008, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
|
* Distributed under the terms of the MIT License.
|
|
*
|
|
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
|
* Distributed under the terms of the NewOS License.
|
|
*/
|
|
#ifndef _SYSTEM_VM_DEFS_H
|
|
#define _SYSTEM_VM_DEFS_H
|
|
|
|
#include <OS.h>
|
|
|
|
|
|
// additional protection flags
|
|
// Note: the VM probably won't support all combinations - it will try
|
|
// its best, but create_area() will fail if it has to.
|
|
// Of course, the exact behaviour will be documented somewhere...
|
|
#define B_EXECUTE_AREA 0x04
|
|
#define B_STACK_AREA 0x08
|
|
// "stack" protection is not available on most platforms - it's used
|
|
// to only commit memory as needed, and have guard pages at the
|
|
// bottom of the stack.
|
|
// "execute" protection is currently ignored, but nevertheless, you
|
|
// should use it if you require to execute code in that area.
|
|
|
|
#define B_KERNEL_EXECUTE_AREA 0x40
|
|
#define B_KERNEL_STACK_AREA 0x80
|
|
|
|
#define B_USER_PROTECTION \
|
|
(B_READ_AREA | B_WRITE_AREA | B_EXECUTE_AREA | B_STACK_AREA)
|
|
#define B_KERNEL_PROTECTION \
|
|
(B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA | B_KERNEL_EXECUTE_AREA \
|
|
| B_KERNEL_STACK_AREA)
|
|
|
|
// TODO: These aren't really a protection flags, but since the "protection"
|
|
// field is the only flag field, we currently use it for this.
|
|
// A cleaner approach would be appreciated - maybe just an official generic
|
|
// flags region in the protection field.
|
|
#define B_OVERCOMMITTING_AREA 0x1000
|
|
#define B_SHARED_AREA 0x2000
|
|
#define B_KERNEL_AREA 0x4000
|
|
// Usable from userland according to its protection flags, but the area
|
|
// itself is not deletable, resizable, etc from userland.
|
|
|
|
#define B_USER_AREA_FLAGS (B_USER_PROTECTION)
|
|
#define B_KERNEL_AREA_FLAGS \
|
|
(B_KERNEL_PROTECTION | B_USER_CLONEABLE_AREA | B_OVERCOMMITTING_AREA \
|
|
| B_SHARED_AREA)
|
|
|
|
// mapping argument for several internal VM functions
|
|
enum {
|
|
REGION_NO_PRIVATE_MAP = 0,
|
|
REGION_PRIVATE_MAP
|
|
};
|
|
|
|
enum {
|
|
// ToDo: these are here only temporarily - it's a private
|
|
// addition to the BeOS create_area() lock flags
|
|
B_ALREADY_WIRED = 6,
|
|
};
|
|
|
|
#define MEMORY_TYPE_SHIFT 28
|
|
|
|
|
|
#endif /* _SYSTEM_VM_DEFS_H */
|