Use of placement new in memory mapped i/o

Discussion in 'C++' started by Samshayam@gmail.com, Jul 7, 2006.

  1. Guest

    I have come across the application of placement new in memory mapped
    i/o in a number of books.I am not able to understand it completely, may
    be becaues of my lack of knowledge with memory mapped i/o.In my
    understanding it is a system where I/O devices are treated as memory
    locations and are addressed using same number of address lines.How an
    object placed at a specific location makes a difference to this?Some
    body pls clarify?
     
    , Jul 7, 2006
    #1
    1. Advertising

  2. rami Guest

    Samshayam,

    Memory Mapped I/O need not be just on device and can be for files as
    well. In that case you can create your structure in memory location
    which will automatically be saved in the file (if this address is at
    the location where file is being mapped). Obviously the implementation
    is not as easy and requires to go through a lot of issues like
    framentation, memory management etc..

    Simple yet powerful technique and is used a lot in databases etc..

    Regards,
    Ramneek Handa
    www.lazybugz.net

    wrote:
    > I have come across the application of placement new in memory mapped
    > i/o in a number of books.I am not able to understand it completely, may
    > be becaues of my lack of knowledge with memory mapped i/o.In my
    > understanding it is a system where I/O devices are treated as memory
    > locations and are addressed using same number of address lines.How an
    > object placed at a specific location makes a difference to this?Some
    > body pls clarify?
     
    rami, Jul 7, 2006
    #2
    1. Advertising

  3. Guest

    Rami,
    Thanks alot.
    C++ FAQ , says the following as application of placement new.
    "For example, when your hardware has a memory-mapped I/O timer device,
    and you want to place a Clock object at that memory location."
    This is making a me again confused

    regards
    Sam


    rami wrote:
    > Samshayam,
    >
    > Memory Mapped I/O need not be just on device and can be for files as
    > well. In that case you can create your structure in memory location
    > which will automatically be saved in the file (if this address is at
    > the location where file is being mapped). Obviously the implementation
    > is not as easy and requires to go through a lot of issues like
    > framentation, memory management etc..
    >
    > Simple yet powerful technique and is used a lot in databases etc..
    >
    > Regards,
    > Ramneek Handa
    > www.lazybugz.net
    >
    > wrote:
    > > I have come across the application of placement new in memory mapped
    > > i/o in a number of books.I am not able to understand it completely, may
    > > be becaues of my lack of knowledge with memory mapped i/o.In my
    > > understanding it is a system where I/O devices are treated as memory
    > > locations and are addressed using same number of address lines.How an
    > > object placed at a specific location makes a difference to this?Some
    > > body pls clarify?
     
    , Jul 7, 2006
    #3
  4. Ian Collins Guest

    wrote:
    > Rami,
    > Thanks alot.
    > C++ FAQ , says the following as application of placement new.
    > "For example, when your hardware has a memory-mapped I/O timer device,
    > and you want to place a Clock object at that memory location."
    > This is making a me again confused
    >

    Please don't top post, your reply should be after, or interleaved with
    the message you are replying to.

    This is a common situation with embedded applications, where you have
    hardware device registers in your memory map and want to map a C++
    struct over the registers. You use placement new to create the object
    at the memory location occupied by the hardware device.

    --
    Ian Collins.
     
    Ian Collins, Jul 7, 2006
    #4
  5. * :
    > [top-posting, excessive quoting]


    Please don't top-post in this group. Please don't quote excessively.
    Please read the FAQ on how the post.

    Thanks in advance.


    * :
    > C++ FAQ , says the following as application of placement new.
    > "For example, when your hardware has a memory-mapped I/O timer device,
    > and you want to place a Clock object at that memory location."
    > This is making a me again confused


    As well it should: hardware is very seldom C++-oriented. Placing a POD
    (C-like struct) at some memory address to access memory mapped hardware
    is useful, but you don't need placement new for that. A non-POD object
    can have "hidden" fields, like a vtable pointer, and also its fields can
    be in an unpredictable order; using such an object for memory mapped i/o
    is a recipe for disaster.

    In short, the example, at <url:
    http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10>, seems to be
    a leftover from some earlier editing, and in addition the 'new' in the
    code there should be '::new'.

    CC: Marshall Cline (the FAQ maintainer).
    Thanks: Marshall Cline, for maintaining the FAQ.

    --
    A: Because it messes up the order in which people normally read text.
    Q: Why is it such a bad thing?
    A: Top-posting.
    Q: What is the most annoying thing on usenet and in e-mail?
     
    Alf P. Steinbach, Jul 7, 2006
    #5
  6. Guest

    > This is a common situation with embedded applications, where you have
    > hardware device registers in your memory map and want to map a C++
    > struct over the registers. You use placement new to create the object
    > at the memory location occupied by the hardware device.
    >
    > --
    > Ian Collins.


    Thanks Collins.
    Is there any specific advantage by doing it this way than accessing the
    hardware directly?

    regards
    Sam
     
    , Jul 7, 2006
    #6
  7. Ian Collins Guest

    wrote:
    >>This is a common situation with embedded applications, where you have
    >>hardware device registers in your memory map and want to map a C++
    >>struct over the registers. You use placement new to create the object
    >>at the memory location occupied by the hardware device.
    >>
    >>--
    >>Ian Collins.

    >
    >
    > Thanks Collins.


    It's Ian.

    > Is there any specific advantage by doing it this way than accessing the
    > hardware directly?
    >

    You get a nice tidy wrapper round the hardware. You could achieve the
    same result with a wrapper object that takes the address of the hardware
    as its constructor parameter, all down to style realy.

    By the way, it's customary not to quote signatures (the bit below the --).

    --
    Ian Collins.
     
    Ian Collins, Jul 7, 2006
    #7
  8. mlimber Guest

    Alf P. Steinbach wrote:
    > * :
    > > C++ FAQ , says the following as application of placement new.
    > > "For example, when your hardware has a memory-mapped I/O timer device,
    > > and you want to place a Clock object at that memory location."
    > > This is making a me again confused

    >
    > As well it should: hardware is very seldom C++-oriented. Placing a POD
    > (C-like struct) at some memory address to access memory mapped hardware
    > is useful, but you don't need placement new for that. A non-POD object
    > can have "hidden" fields, like a vtable pointer, and also its fields can
    > be in an unpredictable order; using such an object for memory mapped i/o
    > is a recipe for disaster.
    >
    > In short, the example, at <url:
    > http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10>, seems to be
    > a leftover from some earlier editing, and in addition the 'new' in the
    > code there should be '::new'.


    I still contend that ::new is unnecessary (cf.
    http://groups.google.com/group/comp.lang.c /browse_frm/thread/b656e66e030cd196).
    If one defines a custom placement new, it is intended to be used (even
    if it just forwards to the global new).

    Cheers! --M
     
    mlimber, Jul 7, 2006
    #8
  9. rami Guest

    wrote:
    > Rami,
    > Thanks alot.
    > C++ FAQ , says the following as application of placement new.
    > "For example, when your hardware has a memory-mapped I/O timer device,
    > and you want to place a Clock object at that memory location."
    > This is making a me again confused


    Sam,
    The reason why they mentioned was just so you know that an object
    can be required to be in a fixed position and thus the reason of the
    placement new operator. It doesnt matter what the example says. To have
    a look at real world usage check:
    http://lightwave2.com/persist/

    Hope it helps,
    Ramneek
    http://www.lazybugz.net
     
    rami, Jul 7, 2006
    #9
  10. mlimber Guest

    wrote:
    > I have come across the application of placement new in memory mapped
    > i/o in a number of books.I am not able to understand it completely, may
    > be becaues of my lack of knowledge with memory mapped i/o.In my
    > understanding it is a system where I/O devices are treated as memory
    > locations and are addressed using same number of address lines.How an
    > object placed at a specific location makes a difference to this?Some
    > body pls clarify?


    Let's say you have a read-only, 32-bit hardware register mapped at
    address 0x8000 that has two fields, bit 0 and bits 1-5 respectively.
    Assuming int is 32 bits, you might map it like this:

    class Reg
    {
    private:
    typedef unsigned int ui32;
    ui32 reg_;
    public:
    ui32 GetField1() const volatile { return reg_ & 1; }
    ui32 GetField2() const volatile { return (reg_ >> 1) & 0x1f; }
    };

    int main()
    {
    void* const regAddr = reinterpret_cast<void*>(0x8000);
    const volatile Reg* const reg = new( regAddr ) Reg;

    cout << "the first field is " << reg->GetField1() << '\n';
    cout << "the second field is " << reg->GetField2() << '\n';
    }

    Since the Reg object is located at 0x8000 thanks to placement new, that
    means that the sole POD datum is located at that address. As others
    have noted, there are alternate ways of accomplishing this same thing
    with accompanying advantages and disadvantages, but this one will work
    and illustrates what the FAQ is talking about.

    Cheers! --M
     
    mlimber, Jul 7, 2006
    #10
  11. * mlimber:
    > wrote:
    >> I have come across the application of placement new in memory mapped
    >> i/o in a number of books.I am not able to understand it completely, may
    >> be becaues of my lack of knowledge with memory mapped i/o.In my
    >> understanding it is a system where I/O devices are treated as memory
    >> locations and are addressed using same number of address lines.How an
    >> object placed at a specific location makes a difference to this?Some
    >> body pls clarify?

    >
    > Let's say you have a read-only, 32-bit hardware register mapped at
    > address 0x8000 that has two fields, bit 0 and bits 1-5 respectively.
    > Assuming int is 32 bits, you might map it like this:
    >
    > class Reg
    > {
    > private:
    > typedef unsigned int ui32;
    > ui32 reg_;
    > public:
    > ui32 GetField1() const volatile { return reg_ & 1; }
    > ui32 GetField2() const volatile { return (reg_ >> 1) & 0x1f; }
    > };
    >
    > int main()
    > {
    > void* const regAddr = reinterpret_cast<void*>(0x8000);


    For the sake of discussion, let's assume this works.


    > const volatile Reg* const reg = new( regAddr ) Reg;
    >
    > cout << "the first field is " << reg->GetField1() << '\n';
    > cout << "the second field is " << reg->GetField2() << '\n';
    > }
    >
    > Since the Reg object is located at 0x8000 thanks to placement new, that
    > means that the sole POD datum is located at that address.


    No, not necessarily. You have 'private' data so this is not a POD, and
    the compiler is free to reorder things, including placing some padding
    at the start. A POD, on the other hand, would be OK except if it had
    padding at the end which intruded into a read-only or non-existent
    address area -- doing hardware level things is fraught with dangers
    like that, and using non-POD classes introduces additional gotchas.

    --
    A: Because it messes up the order in which people normally read text.
    Q: Why is it such a bad thing?
    A: Top-posting.
    Q: What is the most annoying thing on usenet and in e-mail?
     
    Alf P. Steinbach, Jul 7, 2006
    #11
  12. mlimber Guest

    Alf P. Steinbach wrote:
    > * mlimber:
    > > wrote:
    > >> I have come across the application of placement new in memory mapped
    > >> i/o in a number of books.I am not able to understand it completely, may
    > >> be becaues of my lack of knowledge with memory mapped i/o.In my
    > >> understanding it is a system where I/O devices are treated as memory
    > >> locations and are addressed using same number of address lines.How an
    > >> object placed at a specific location makes a difference to this?Some
    > >> body pls clarify?

    > >
    > > Let's say you have a read-only, 32-bit hardware register mapped at
    > > address 0x8000 that has two fields, bit 0 and bits 1-5 respectively.
    > > Assuming int is 32 bits, you might map it like this:
    > >
    > > class Reg
    > > {
    > > private:
    > > typedef unsigned int ui32;
    > > ui32 reg_;
    > > public:
    > > ui32 GetField1() const volatile { return reg_ & 1; }
    > > ui32 GetField2() const volatile { return (reg_ >> 1) & 0x1f; }
    > > };
    > >
    > > int main()
    > > {
    > > void* const regAddr = reinterpret_cast<void*>(0x8000);

    >
    > For the sake of discussion, let's assume this works.
    >
    >
    > > const volatile Reg* const reg = new( regAddr ) Reg;
    > >
    > > cout << "the first field is " << reg->GetField1() << '\n';
    > > cout << "the second field is " << reg->GetField2() << '\n';
    > > }
    > >
    > > Since the Reg object is located at 0x8000 thanks to placement new, that
    > > means that the sole POD datum is located at that address.

    >
    > No, not necessarily. You have 'private' data so this is not a POD, and
    > the compiler is free to reorder things, including placing some padding
    > at the start. A POD, on the other hand, would be OK except if it had
    > padding at the end which intruded into a read-only or non-existent
    > address area -- doing hardware level things is fraught with dangers
    > like that, and using non-POD classes introduces additional gotchas.


    Fair enough. Make the data public or live with non-portability (of
    course, working with hardware is usually inherently non-portable
    anyway).

    Cheers! --M
     
    mlimber, Jul 7, 2006
    #12
  13. rami Guest

    Alf P. Steinbach wrote:
    > * mlimber:
    > > wrote:
    > >> I have come across the application of placement new in memory mapped
    > >> i/o in a number of books.I am not able to understand it completely, may
    > >> be becaues of my lack of knowledge with memory mapped i/o.In my
    > >> understanding it is a system where I/O devices are treated as memory
    > >> locations and are addressed using same number of address lines.How an
    > >> object placed at a specific location makes a difference to this?Some
    > >> body pls clarify?

    > >
    > > Let's say you have a read-only, 32-bit hardware register mapped at
    > > address 0x8000 that has two fields, bit 0 and bits 1-5 respectively.
    > > Assuming int is 32 bits, you might map it like this:
    > >
    > > class Reg
    > > {
    > > private:
    > > typedef unsigned int ui32;
    > > ui32 reg_;
    > > public:
    > > ui32 GetField1() const volatile { return reg_ & 1; }
    > > ui32 GetField2() const volatile { return (reg_ >> 1) & 0x1f; }
    > > };
    > >
    > > int main()
    > > {
    > > void* const regAddr = reinterpret_cast<void*>(0x8000);

    >
    > For the sake of discussion, let's assume this works.
    >
    >
    > > const volatile Reg* const reg = new( regAddr ) Reg;
    > >
    > > cout << "the first field is " << reg->GetField1() << '\n';
    > > cout << "the second field is " << reg->GetField2() << '\n';
    > > }
    > >
    > > Since the Reg object is located at 0x8000 thanks to placement new, that
    > > means that the sole POD datum is located at that address.

    >
    > No, not necessarily. You have 'private' data so this is not a POD, and
    > the compiler is free to reorder things, including placing some padding
    > at the start. A POD, on the other hand, would be OK except if it had
    > padding at the end which intruded into a read-only or non-existent
    > address area -- doing hardware level things is fraught with dangers
    > like that, and using non-POD classes introduces additional gotchas.
    >
    > --
    > A: Because it messes up the order in which people normally read text.
    > Q: Why is it such a bad thing?
    > A: Top-posting.
    > Q: What is the most annoying thing on usenet and in e-mail?



    Wow, I didnt know that compiler could reorder in non-POD classes??? Are
    you sure?
    Can you give me some references??

    Ramneek
    www.lazybugz.net
     
    rami, Jul 7, 2006
    #13
  14. * rami:
    > [quoting signature, excessive quoting]


    Please don't quote signatures. Please don't quote excessively. Please
    read the FAQ on how to post.

    Thanks in advance.

    --
    A: Because it messes up the order in which people normally read text.
    Q: Why is it such a bad thing?
    A: Top-posting.
    Q: What is the most annoying thing on usenet and in e-mail?
     
    Alf P. Steinbach, Jul 7, 2006
    #14
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Mark P
    Replies:
    6
    Views:
    840
    James Dennett
    Apr 27, 2005
  2. mangesh
    Replies:
    15
    Views:
    641
    mlimber
    Jun 30, 2006
  3. Lagarde Sébastien

    overriding placement new + memory management

    Lagarde Sébastien, May 4, 2007, in forum: C++
    Replies:
    5
    Views:
    562
    Lagarde Sébastien
    May 7, 2007
  4. Replies:
    11
    Views:
    562
    peter koch
    May 19, 2008
  5. Michael Tsang
    Replies:
    8
    Views:
    687
    Alf P. Steinbach
    Dec 14, 2009
Loading...

Share This Page