Re: Allocate a variable in a known physical location

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi David,

Thanks a lot for the reply. The address 0x10001000 is a physical address 
and not a virtual address. I thought we can only do this type casting with 
virtual addresses. Anyway I tried the method you suggested and I got a 
segmentation fault.

I use mmap to map those physical addresses to virtual addresses, because 
OS(linux) in unaware of this other piece of memory which uses physical 
address range 0x10001000 to 0x10101000.

In my example, when I use my method to access i via pointer p (p->i), it 
first accesses p and then accesses i. But this introduces unnecessary 
access p. Therefore I was wondering how to allocate i in the above 
physical region.(Please note that I cant use any optimization -O2, -O3)

I was looking in section attribute, but still couldn't figure out how to 
use it, also I am not sure it is the correct way to do this.

any help/suggestion is greatly appreciated.

regards,
Isuru

> I don't know what OS you are using, or what you want to do with mmap.
> But if you have struct that you want to access at a particular address, 
> the easiest way is with a bit of typecasting:

> struct my *p = (struct my*) 0x10001000;

> Then when you access p->j, for example, the generated code will use the 
> absolute address 0x10001004 (for 32-bit ints).

> mvh.,

> David

--- On Mon, 1/31/11, isuru herath <isuru81@xxxxxxxxx> wrote:

> From: isuru herath <isuru81@xxxxxxxxx>
> Subject: Re: Allocate a variable in a known physical location
> To: "Ian Lance Taylor" <iant@xxxxxxxxxx>
> Cc: gcc-help@xxxxxxxxxxx
> Date: Monday, January 31, 2011, 1:01 PM
> Hi Ian,
> 
> Thanks a lot for your quick response and I am sorry for not
> explaining the 
> problem correctly. 
> 
> I have a separate piece of memory for which I have given
> physical address 
> range 0x10001000 to 0x10101000. I want to allocate
> variables in this 
> address range. To achieve this I create a structure with
> variables I need 
> to allocate there. For example if I need to allocate i and
> j in the above 
> address range, I define a structure like following.
> 
> struct my
> {
>      int i;
>      int j;
> };
> 
> and then allocate memory for the structure using mmap like
> below.(bear with 
> me if syntax are wrong).
> 
> struct my *p = mmap(........);
> 
> when ever I need to access i, j in my code I access them
> via pointer p like 
> following.
> 
> p->i or p->j
> 
> All what I need is to allocate i and j in the above address
> range. Due to 
> lack of my  knowledge in compiler and gcc this is how
> I did it. The 
> drawback of this is that to access i, it has to access p
> first. This 
> introduces an unnecessary access to my statistics.
> Therefore if I could 
> allocate i and j without using the above method I thought
> my problem will 
> be solved. 
> 
> As you mentioned in your reply can I use section attribute
> to achieve this or do you have any other suggestion. 
> 
> Any help/advice is greatly appreciated.
> 
> regards,
> Isuru
> 
> --- On Mon, 1/31/11, Ian Lance Taylor <iant@xxxxxxxxxx>
> wrote:
> 
> > From: Ian Lance Taylor <iant@xxxxxxxxxx>
> > Subject: Re: Allocate a variable in a known physical
> location
> > To: "isuru herath" <isuru81@xxxxxxxxx>
> > Cc: gcc-help@xxxxxxxxxxx
> > Date: Monday, January 31, 2011, 11:21 AM
> > isuru herath <isuru81@xxxxxxxxx>
> > writes:
> > 
> > > I need to allocate a variable in a known
> physical
> > location, let's say I need 
> > > to allocate void *p in location 0x10001000.  I
> > was using mmap to to do this, 
> > > but in that manner I can only allocate p[0],
> > p[1]...p[n] in that physical 
> > > address range. Therefore when I access p[i],
> accesses
> > to p results in 
> > > outside {0x10001000,  0x10001000+offset} and
> p[i]
> > results as an access in 
> > > the range I am interested in.
> > 
> > I don't understand the last sentence there.
> > 
> > > I was wondering is there a was for me to force 
> > > to allocate variable p in that address range or I
> am
> > looking for something 
> > > totally unrealistic. Because of the nature of my
> > research I can use any 
> > > optimization(-O2, O3).
> > 
> > If you don't want to use mmap, the simplest way to put
> a
> > variable at a
> > specific location is to put it in a specific section
> using
> > __attribute__
> > ((section ("..."))) and then put that section at a
> specific
> > address
> > using a linker script.
> > 
> > Ian
> > 
> 
> 
> 
> 






[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux