I am writing an OS in Rust and need to directly call into a virtual address that I\'m calculating (of type u32
). I expected this to be relatively simple:
Casts of the type _ as f-ptr
are not allowed (see the Rustonomicon chapter on casts). So, as far as I can tell, the only way to cast to function pointer types is to use the all mighty weapon mem::transmute().
But before we can use transmute()
, we have to bring our input into the right memory layout. We do this by casting to *const ()
(a void pointer). Afterwards we can use transmute()
to get what we want:
let ptr = virtual_address as *const ();
let code: extern "C" fn() = unsafe { std::mem::transmute(ptr) };
(code)();
However, a few notes on this:
extern "C"
functions have the type unsafe extern "C" fn()
. This means that those functions are unsafe to call. You should probably add the unsafe
to your function.