Crates.io | jit-allocator |
lib.rs | jit-allocator |
version | 0.2.8 |
source | src |
created_at | 2023-06-25 13:51:13.872548 |
updated_at | 2023-07-06 18:34:17.033035 |
description | An executable code allocator |
homepage | |
repository | https://github.com/playxe/jit-allocator |
max_upload_size | |
id | 899493 |
size | 96,774 |
A simple memory allocator for executable code. Use JitAllocator
type to allocate/release memory and virtual_memory
module functions to enable proper access for executable code. So if you want to allocate a new code to execute it is usually done like this:
use jit_allocator::*;
let compiled_code = ...;
let compiled_code_size = ...;
let mut jit_allocator = JitAllocator::new(Default::default());
let (rx, rw) = jit_allocator.alloc(size)?;
protect_jit_memory(ProtectJitAccess::ReadWrite); // allows to write to RWX code in current thread,
// it is no-op on all platforms except macOS AArch64
unsafe { copy_nonoverlapping(compiled_code, rw, compiled_code_size); }
protect_jit_memory(ProtectJitAccess::ReadExecute); // disables writes to RWX code in current thread,
// it is no-op on all platforms except macOS AArch64
flush_instruction_cache(rx, compiled_code_size); // flush icache, not required on x86-64
// but required on other platforms due
// to lack of coherent dcache/icache.
// When you're done with your machine code you can release it:
unsafe {
jit_allocator.release(rx)?;
}