« Return to Thread: [rvm-research] to utilize methods in syscall

Re: [rvm-research] to utilize methods in syscall

by Robin Garner :: Rate this Message:

Reply to Author | View in Thread

Hi Liangliang,

The way MMTk allocates memory is as follows:

- At build time (in the Java static initialization), the chosen MMTk
plan (org.mmtk.plan.Plan and its subclasses) specify how virtual memory
is laid out.  The VMRequest object is simply a 'parameter object'
pattern - by encapsulating virtual memory layout options into their own
object, we simplify the constructors of the 'Space' class.  As Daniel
points out, the information in these objects is *only* used at build
time, and only used by a Space to initialize its fields.

- At runtime, the mutator allocates memory via an Allocator, which is a
thread-local pool, periodically calling back to the corresponding Space
to allocate memory from the global pool.

-  In turn, when a Space needs to allocate more virtual memory, it calls
the method

  public final Address acquire(int pages)

which acquires page resources from an underlying 'PageResource' object
(line 395 of Space.java)

    /* Page budget is ok, try to acquire virtual memory */
    Address rtn = pr.getNewPages(pages);

In the case of the standard generational nursery, this calls the method

  protected Address allocPages(int requestPages);

in the class MonotonePageResource (the page resource is associated with
the Space by the CopySpace class's constructor).

- Eventually, MonotonePageResource calls Mmapper.ensureMapped(Address
start, int pages) which will map the pages if necessary, line 127:
  int errno = VM.memory.dzmmap(mmapStart, MMAP_CHUNK_BYTES);

If you want to change the way that pages in the nursery are allocated
from the OS, then you need to do something around about here.  
Alternately, you could create a new Nursery allocator (thread-local),
that alters the characteristics of memory when the nursery requests a
chunk from the global pool.  There are probably a number of alternative
approaches.

Regards,
Robin

Liangliang Tong wrote:

> Daniel Frampton wrote:
>  
>> Spaces are allocated by global plan classes.
>> MMTk/src/org/mmtk/plan/Plan.java is the base class.
>>
>> It seems that the 'right' thing to do is to wait for for MMTk to mmap
>> memory in the space, and then use syscalls after (or instead) to set
>> the 'special attributes'.
>>  
>>    
> there comes the problem. These "special attributes" concern with cache
> and hardware counters, which can in no way be seen by rvm, thus I wrote
> the corresponding codes in C/C++.
>  
>> In any case there is no way you can use vmRequest at runtime, which is
>> the only time you can use syscalls. vmRequest is for the bootimage
>> build-time partitioning of the space.
>>  
>>    
> I understand the errors prompted by the rvm now. Then if I want to map
> the special memory space, I need to setup this memory space at the
> boot-image build time?
> Could you briefly describe the process of initializing heap region or
> give me any references?
> Thanks.
>
>  
>> Cheers,
>> Daniel.
>>
>> On Fri, Jun 19, 2009 at 5:38 PM, Liangliang Tong<lltong@...> wrote:
>>  
>>    
>>> Dear Robin,
>>> Using a custom function, I can create an address space with special
>>> attributes. Now I want to use this address chunk as the nursery space of
>>> a generational collector.
>>> I originally, as described in the first mail, want to use the sysCalls
>>> and VMRequest class. That is, to build the custom function into the
>>> sysCalls, and use the vmRequest.create(Address address, Extent extent)
>>> method to map the special address space into the nursery. It doesn't
>>> work, as you see.
>>> Then, I am wondering, are there any other ways that I can resort to?
>>> Thanks.
>>>
>>> Regards,
>>> Liangliang
>>>
>>> Robin Garner wrote:
>>>    
>>>      
>>>> Liangliang Tong wrote:
>>>>
>>>>      
>>>>        
>>>>> Dear Robin,
>>>>>
>>>>> Thanks for your reply.
>>>>> I am just taking sysMalloc as an example, the actual method I called is
>>>>> another custom allocation function implemented by myself. This function
>>>>> applies special characteristics to the allocated memory chunk, which I
>>>>> hope to use as a nursery space. Rawpagespace does not help.
>>>>> In this case, what am I supposed to do in order to achieve my target?
>>>>> Thanks.
>>>>>
>>>>>
>>>>>        
>>>>>          
>>>> I'm not sure I understand what your target is - perhaps you could use a
>>>> better example ?
>>>>
>>>> I've outlined the steps you need to follow in order to make an arbitrary
>>>> syscall (and for more details, follow a method like 'dzmmap' through the
>>>> interface).
>>>>
>>>> If you want to implement a new allocator (at the object level), then
>>>> what you want to do is sub-class Space and Allocator for the global and
>>>> thread-local components of the allocator.  If you want to change how a
>>>> Space acquires pages from the OS, then you should create a new
>>>> PageResource and define or modify a sub-class of Space that uses it.
>>>>
>>>> If you need more explanation, please tell us in more detail what it is
>>>> you're trying to do.
>>>>
>>>> Regards,
>>>> Robin
>>>>
>>>>      
>>>>        
>>>>> Regards,
>>>>> Liangliang
>>>>>
>>>>> Robin Garner wrote:
>>>>>
>>>>>
>>>>>        
>>>>>          
>>>>>> Liangliang Tong wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>>          
>>>>>>            
>>>>>>> Dear all,
>>>>>>>
>>>>>>> In org.mmtk.plan.generational.Gen.java, I want to modify the vmRequest
>>>>>>> to request for an explicit region of memory, like the following:
>>>>>>>    private static final VMRequest vmRequest =
>>>>>>> VMRequest.create(sysCall.sysMalloc(1 << 20),  Extent.fromIntSignExtend(1
>>>>>>> << 20));
>>>>>>> correspondingly I add a new import statement:
>>>>>>>  import static org.jikesrvm.runtime.SysCall.sysCall;
>>>>>>>
>>>>>>> Yet when I complied the generational copy plan, it prompts these errors:
>>>>>>> compile-mmtk:
>>>>>>>     [javac] Compiling 1 source file to
>>>>>>> /home/lltong/jikesrvm/target/mmtk/classes
>>>>>>>     [javac]
>>>>>>> /home/lltong/jikesrvm/MMTk/src/org/mmtk/plan/crgenerational/CRGen.java:33:
>>>>>>> package org.jikesrvm.runtime does not exist
>>>>>>>     [javac] import static org.jikesrvm.runtime.SysCall.sysCall;
>>>>>>>     [javac]                                   ^
>>>>>>>     [javac]
>>>>>>> /home/lltong/jikesrvm/MMTk/src/org/mmtk/plan/crgenerational/CRGen.java:33:
>>>>>>> static import only from classes and interfaces
>>>>>>>     [javac] import static org.jikesrvm.runtime.SysCall.sysCall;
>>>>>>>     [javac] ^
>>>>>>>     [javac]
>>>>>>> /home/lltong/jikesrvm/MMTk/src/org/mmtk/plan/crgenerational/CRGen.java:91:
>>>>>>> cannot find symbol
>>>>>>>     [javac] symbol  : variable sysCall
>>>>>>>     [javac] location: class org.mmtk.plan.crgenerational.CRGen
>>>>>>>
>>>>>>> Why should this happen? Thanks in advance.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>            
>>>>>>>              
>>>>>> Hi Liangliang,
>>>>>>
>>>>>> As far as I can see, you are trying to request a 1MB chunk of memory,
>>>>>> and you don't care where in the heap it is.  Is this right ?
>>>>>>
>>>>>>
>>>>>> MMTk uses the 'Space' class to abstract over various ways to allocate
>>>>>> memory.  If you simply want a 1MB chunk of raw memory, then you can do
>>>>>>
>>>>>>   RawPageSpace mySpace = new RawPageSpace("mySpace", Integer.MAX_VALUE,
>>>>>> VMRequest.create());
>>>>>>   Address chunkAddr = mySpace.acquire(1<<(20-LOG_BYTES_IN_PAGE));
>>>>>>
>>>>>> If you're using memory as storage for your collector, you should
>>>>>> probably allocate it in the existing metaDataSpace.  If you're
>>>>>> allocating it to give to the mutator, you should probably define a new
>>>>>> space for it.
>>>>>>
>>>>>> Note that a VMRequest is simply a way to communicate your virtual memory
>>>>>> layout requirements to the Space class, and passing it a chunk of
>>>>>> 'malloc'ed memory doesn't make a great deal of sense.  In fact MMTk
>>>>>> itself generally takes the place of 'malloc' in the virtual machine.
>>>>>>
>>>>>>
>>>>>> The reason you can't directly call sysMalloc from MMTk is that MMTk
>>>>>> separates itself from JikesRVM (and its various other host environments)
>>>>>> via the org.mmtk.vm package (the VM interface).  In order to call a new
>>>>>> method on the JikesRVM side of the fence you need to:
>>>>>>
>>>>>> - Choose an interface class to host the method (eg org.mmtk.vm.Memory)
>>>>>> - Add an abstract method to the interface class
>>>>>> - Add a concrete method to the implementation on the VM side of the
>>>>>> fence (for JikesRVM that is org.jikesrvm.mm.mmtk, in the
>>>>>> MMTk/ext/vm/jikesrvm directory)
>>>>>>
>>>>>> but I think it would generally be a bad idea for you to allocate memory
>>>>>> for JikesRVM using sysMalloc.
>>>>>>
>>>>>> Regards,
>>>>>> Robin
>>>>>>
>>>>>>
>>>>>> ------------------------------------------------------------------------------
>>>>>> Crystal Reports - New Free Runtime and 30 Day Trial
>>>>>> Check out the new simplified licensing option that enables unlimited
>>>>>> royalty-free distribution of the report engine for externally facing
>>>>>> server and web deployment.
>>>>>> http://p.sf.net/sfu/businessobjects
>>>>>> _______________________________________________
>>>>>> Jikesrvm-researchers mailing list
>>>>>> Jikesrvm-researchers@...
>>>>>> https://lists.sourceforge.net/lists/listinfo/jikesrvm-researchers
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>          
>>>>>>            
>>>>>        
>>>>>          
>>>> ------------------------------------------------------------------------------
>>>> Crystal Reports - New Free Runtime and 30 Day Trial
>>>> Check out the new simplified licensing option that enables unlimited
>>>> royalty-free distribution of the report engine for externally facing
>>>> server and web deployment.
>>>> http://p.sf.net/sfu/businessobjects
>>>> _______________________________________________
>>>> Jikesrvm-researchers mailing list
>>>> Jikesrvm-researchers@...
>>>> https://lists.sourceforge.net/lists/listinfo/jikesrvm-researchers
>>>>
>>>>
>>>>      
>>>>        
>>> --
>>> Regards,
>>> Liangliang Tong
>>>
>>>
>>> ------------------------------------------------------------------------------
>>> Crystal Reports - New Free Runtime and 30 Day Trial
>>> Check out the new simplified licensing option that enables unlimited
>>> royalty-free distribution of the report engine for externally facing
>>> server and web deployment.
>>> http://p.sf.net/sfu/businessobjects
>>> _______________________________________________
>>> Jikesrvm-researchers mailing list
>>> Jikesrvm-researchers@...
>>> https://lists.sourceforge.net/lists/listinfo/jikesrvm-researchers
>>>
>>>    
>>>      
>> ------------------------------------------------------------------------------
>> Crystal Reports - New Free Runtime and 30 Day Trial
>> Check out the new simplified licensing option that enables unlimited
>> royalty-free distribution of the report engine for externally facing
>> server and web deployment.
>> http://p.sf.net/sfu/businessobjects
>> _______________________________________________
>> Jikesrvm-researchers mailing list
>> Jikesrvm-researchers@...
>> https://lists.sourceforge.net/lists/listinfo/jikesrvm-researchers
>>
>>  
>>    
>
>
>  


------------------------------------------------------------------------------
Are you an open source citizen? Join us for the Open Source Bridge conference!
Portland, OR, June 17-19. Two days of sessions, one day of unconference: $250.
Need another reason to go? 24-hour hacker lounge. Register today!
http://ad.doubleclick.net/clk;215844324;13503038;v?http://opensourcebridge.org
_______________________________________________
Jikesrvm-researchers mailing list
Jikesrvm-researchers@...
https://lists.sourceforge.net/lists/listinfo/jikesrvm-researchers

 « Return to Thread: [rvm-research] to utilize methods in syscall