CPU-x86_64-InstructionWriter

 view release on metacpan or  search on metacpan

example/linux-xsub-hello-world.pl  view on Meta::CPAN

   SYS_write       => 1,
   PROT_READ       => 1,
   PROT_WRITE      => 2,
   PROT_EXEC       => 4,
   MAP_PRIVATE     => 2,
   MAP_ANONYMOUS   => 32,
};

# I don't know of a pure-perl way to write to an arbitrary memory location,
# but this works for linux :-)
sub memcpy($dst_addr, $src_sv, $size=length $src_sv) {
	if (-w '/proc/self/mem') {
		open my $mem, '+>', '/proc/self/mem'     or die "open(/dev/mem): $!";
		$mem->sysseek($dst_addr, 0) == $dst_addr or die "sysseek: $!";
		$mem->syswrite($src_sv, $size) == $size  or die "write: $!";
	} else {
		$size < 4096 or die "BUG: needs rewritten with a loop";
		pipe(my $rd, my $wr)                     or die "pipe: $!";
		$wr->syswrite($src_sv, $size) == $size   or die "write: $!";
		syscall(SYS_read, fileno($rd), $dst_addr, $size) == $size or die "read: $!";
	}



( run in 0.749 second using v1.01-cache-2.11-cpan-65fba6d93b7 )