On virt_to_phys doubts.

Miles MH Chen orca.chen at gmail.com
Sat Sep 13 09:43:50 EDT 2014


Kernel physical addr : 0x32d01fe0
Platform phys offset : 0x30000000
Page offset : 0xc0553fb4

The page offset looks weird, since 32bit kernel has 2/2 or 3/1 or 1/3
user/kernel virtual address  split. It is not reasonable to have 0xc0553fb4
as page offset. You should c0000000 for 3/1 split.
2014/9/13 下午8:59 於 "mind entropy" <mindentropy at gmail.com> 寫道:

> On Sat, Sep 13, 2014 at 2:01 PM, Miles MH Chen <orca.chen at gmail.com>
> wrote:
> > Hi,
> >
> > Do you know the value of PHYS_OFFSET of your platform?
> > PHYS_OFFSET defines the starting physical address of your DRAM.
> >
> > physical address = kmalloc'ed address - PAGE_OFFSET + PHYS_OFFSET
> >
> > MH
> >
> > On Sat, Sep 13, 2014 at 4:02 PM, mind entropy <mindentropy at gmail.com>
> wrote:
> >>
> >> Hi,
> >>
> >>   I want to know the physical address [just for debugging and info.Not
> >> for DMA etc] of a particular virtual address allocated via kmalloc.
> >>
> >>    I am running the below code on S3C2440 with 64MB of RAM. The
> >> /proc/meminfo returns
> >>
> >> MemTotal:          59164 kB
> >> MemFree:           35884 kB
> >> MemAvailable:      47148 kB
> >>
> >>
> >>   I run the following module for printing the addresses. [This module
> >> is only for test. So excuse if I have cut corners].
> >>
> >> ------------------------------------------------
> >>
> >> #include <linux/init.h>
> >> #include <linux/kernel.h>
> >> #include <linux/printk.h>
> >> #include <linux/module.h>
> >> #include <linux/gfp.h>
> >> #include <linux/types.h>
> >> #include <linux/mm.h>
> >> #include <linux/mm_types.h>
> >> #include <linux/slab.h>
> >>
> >> static int vm_mem_test_init(void)
> >> {
> >>
> >>     void *km;
> >>
> >>     printk(KERN_ALERT "vm mem test init\n");
> >>
> >>     km = kmalloc(1,GFP_KERNEL);
> >>
> >>     if(km == NULL) {
> >>         printk(KERN_ALERT "Could not kmalloc\n");
> >>         return -1;
> >>     } else {
> >>         printk(KERN_ALERT "Allocated\n");
> >>         printk(KERN_ALERT "Virtual addr : %x\n",(unsigned int)km);
> >>         printk(KERN_ALERT "Kernel physical addr :
> >> 0x%x\n",virt_to_phys(km));
> >>         kfree(km);
> >>     }
> >>
> >>   return 0;
> >>
> >> }
> >>
> >>
> >> The output for the following is:
> >>
> >> Virtual addr : c2c080e0
> >> Kernel physical addr : 0x32c080e0
> >>
> >> -----------------------------------------------------------
> >>
> >> The kernel physical address is wrong as I only have 64MB. Should I be
> >> doing a kernel page table walk to get the associated physical address?
> >>
> >> Thanks
> >> Gautam.
> >>
> >> _______________________________________________
> >> Kernelnewbies mailing list
> >> Kernelnewbies at kernelnewbies.org
> >> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
> >
> >
>
> Miles,
>
>   I tried printing it. The output is as follows:
>
> Kernel physical addr : 0x32d01fe0
> Platform phys offset : 0x30000000
> Page offset : 0xc0553fb4
>
> The S3C2440 is an ARM9TDMI processor.
>
>
> -Gautam.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20140913/e311f9d8/attachment.html 


More information about the Kernelnewbies mailing list