in reply to C-like Pointers

The question is flawed on two levels.

You are really asking for a means of accessing "arbitrary" addresses within the process's memory space. That's definitely possible via an XS module. Start your search on CPAN.

Mind you, it's possible to use a scalar (and other types of variables) as an interface to functions such that fetches call one function and sets call another. The feature is call "magic", and tie is one form of this. The downside is this slower than calling the underlying functions directly.


That said, I can't help but think we should review your decision to go down this path. What is the real problem you are trying to solve?

Replies are listed 'Best First'.
Re^2: C-like Pointers
by DerHartmut (Novice) on Nov 16, 2009 at 03:34 UTC
    Thank you for your answer (and either thank to the others) :D

    I know the fact, that C can only access virtual memory, I choosed the easier term "RAM" for people which don't know about Paging and stuff.

    My real problem is to solve the following problem:

    A buddy wrote a program in C which loads a ELF-kernel and execute it. I (I'm either a C progammer and OS-developer) wanted to write the same program in Perl, just for fun. The biggest problem is to access a virtual address within the process' memoryspace and using pointers to these addresses. I have to write this line:

    krnl = mmap((void *)0x78000000, lof, PROT_READ, MAP_PRIVATE | MAP_FIXE +D, fileno(kernel), 0);

    In Perl. My (not working) solution is:

    $mapped_kernel = syscall(\&SYS_mmap, $address, $kernel_size, $page_rea +d, $map_private | $map_fixed, fileno(KERNEL), 0);

    where syscall() and \&SYS_mmap are functions/references to functions from syscall.h (converted to .ph via h2ph), $kernel_size, $page_read, $map_private and $map_fixed simple integer-values, KERNEL the filehandle to the loaded kernel and $address the pointer to the address.

    In short words, I want to do (void*)0x78000000 in Perl, a pointer to a address defiend by myself (without the help of C :-P). I've searched CPAN for XS and pointers but did not found anything related to my problem (or I was too stupid to find it ^^).
      In short words, I want to do (void*)0x78000000 in Perl, a pointer to a address defiend by myself (without the help of C :-P). I've searched CPAN for XS and pointers but did not found anything related to my problem

      Did you come across Sys::Mmap's hardwire() method in your travels?

      Just reading the synopsis for this function:

             hardwire(VARIABLE, ADDRESS, LENGTH)
                 Specifies the address in memory of a variable, possibly within a
                 region you've "mmap()"ed another variable to. You must use the same
                 precautions to keep the variable from being reallocated, and use
                 "substr()" with an exact length. If you "munmap()" a region that a
                 "hardwire()"ed variable lives in, the "hardwire()"ed variable will
                 not automatically be "undef"ed. You must do this manually.
      
      ..and thought it just might be of use. Maybe try:
      use Sys::Mmap; # ... Sys::Mmap::hardwire($address, 0x78000000, $kernel_size);
        Great!

        That's extactly that I searched for. Thank very very very much! It does work now :D

        And many thanks to the others for their answers!