hw.physmem/hw.realmem question

Daniel Braniss danny at cs.huji.ac.il
Wed Jul 3 06:31:45 UTC 2013


Thanks Chris!
It will take me some time do fully digets all this!,
but at least the picture is less murky.
	danny

> >for example, this host has has 32G of physical memory ...
> >[snip - dmesg:]
> >real memory  = 34359738368 (32768 MB)
> >avail memory = 32191340544 (30700 MB)
> >[snip]
> >and from sysctl:
> >hw.physmem: 34284916736
> >hw.usermem: 32964923392
> >hw.realmem: 36507222016
> >
> >after setting
> >	hw.physmem=16G
> >
> >from dmesg:
> >real memory  = 34359738368 (32768 MB)
> >avail memory = 13999382528 (13350 MB)
> >
> >and sysctl:
> >
> >	hw.physmem: 14957563904
> >	hw.usermem: 10094678016
> >	hw.realmem: 17179869184
> >
> >from the numbers, I can assume that realmem is the real physical memory,
> >(or whatever is set in hw.physmem),
> 
> I think there are three numbers (though one is not always a single
> number) of interest, which I believe were the original intent of
> the three sysctl values ("real", "phys", and "user" memory,
> specially called out in sysctl.h under the "HW" section).  These
> are:
> 
>   - The RAM present in hardware.  This would be 32 GB on
>     your particular system.
> 
>     On some machines, RAM is not even close to physically
>     contiguous, e.g., there might be 4 GB of RAM starting at
>     address 8 TB, then 32 GB of RAM starting at address 16 TB,
>     then 1 TB of RAM starting at address 24 TB, on a machine where
>     each DIMM slot is simply located at each 8-TB position (with
>     "architectural room" for up to 8 TB per slot), and "slot 0"
>     reserved for boot ROMs (hence physical space starting at 8
>     TB).  These enormous "holes" in the physical space should (my
>     opinion) be reflected in whatever interface gets you the RAM
>     map.  That makes this one not a "single number".  Of course,
>     if you can't or won't show the holes, you can make up a single
>     number.
> 
>     (On x86 systems you don't have holes this big, although you do
>     have the historical "I/O space" windows, e.g., that annoying
>     gap at 640kB :-) .  Worse, there's always a half-GB gap at
>     3.5GB, although some memory controllers work around this.
>     See:
> 
>   http://lists.freebsd.org/pipermail/freebsd-amd64/2005-August/005849.html
> 
>     for example.)
> 
>   - The amount of "usable" RAM for the OS.  This subtracts off
>     any spaces reserved by boot ROMs / BIOSes / what-have-you, and
>     in the case of (e.g.) FreeBSD-9 on amd64, the 1 TB direct-map
>     limit (which you must take care of manually with the loader's
>     hw.physmem setting).
> 
>     This is what "phys mem" should be and mostly is.  If you boot
>     a machine with 1.5 TB of RAM but the OS is limited to 1 TB,
>     hw.physmem should be 1 TB minus a bit for the BIOS, etc.
> 
>   - The amount of memory left after subtracting more or less fixed
>     kernel resources, such as kernel text and data (including loaded
>     modules), page table pages, "vm_page" array data structures, and
>     so on.  This will shift over time.
> 
>     This is what "user mem" is, more or less -- to be exact, it's:
> 
> 	ctob(physmem - cnt.v_wire_count)
> 
>     where "ctob" is "clicks to bytes" which is really "pages to
>     bytes", as these things count in terms of pages (4K at a time,
>     on the x86).  The "wire count" is the number of pages that are
>     not page-in/out-able, so subtracting that from physmem gives
>     you the number of pageable, hence user-use-able, pages.
> 
> There's a fourth number, which is not really very useful, but I
> need to describe for the below:
> 
>   - The highest useable physical address in the system (or
>     really, just after that -- the same way if the machine is to
>     count to 4, you go "0 1 2 3" and that gives you 4).  This
>     is called "Maxmem" in amd64/amd64/machdep.c (and pmap.c).
> 
> Note that the printf output:
> 
>     real memory = <number> (<number> MB)
> 
> generally comes from the amount reported by the BIOS, which is
> different yet again!  My box with 8GB says:
> 
>     real memory  = 8589934592 (8192 MB)
> 
> but on my machine, Maxmem is 8.5 GB, which also shows up in
> sysctl (more on that in a moment):
> 
>     hw.realmem: 9126805504
> 
> I have the Intel memory controller that "moves up" the shadowed
> (by PCI hole) RAM at 3.5 GB. If I were to set hw.physmem to 8
> GB in my loader.conf, I would actually give up half a gigabyte.
> 
> So, on to this:
> 
> >if so, where did almost 2G go? (realmem - physmem) ...
> >what is physmem and realmem, and what's the relationship - if any
> >- between them?
> 
> "hw.realmem" is a snapshot of the value of Maxmem, before a few
> adjustments are made.  If you have 32 GB of physical RAM and you
> have not limited it (and you don't have the remapping noted
> below), "realmem" will be 32 GB.  If you *have* limited it,
> realmem captures the limit (which I think is wrong -- the snapshot
> should happen earlier, at the least).
> 
> "hw.physmem" results from counting up useable pages.  After
> finding Maxmem, which gives you "maximum valid address plus 1",
> the machdep.c code goes through all the segments -- segments being
> stuff like "64k to 640k", with the first 64k off limits because
> BIOSes tend to munch on it and the 640k limit due to the ISA hole
> -- and checks that each page in that segment for useability.  If
> the page is good, it's added to physmem.
> 
> Your 2 GB (542555 pages, to be exact) is space eaten up by your
> BIOS and architectural holes, including the large PCI hole.  Your
> BIOS and motherboard etc may (or may not) allow you to remap some
> of your "hidden" or "shadowed" RAM (out of the PCI hole),
> increasing the boot-time value of Maxmem, and hence also
> increasing both "hw.realmem" and actual, useable pages.
> 
> Note: the x86's architectural holes still use up some dedicated
> kernel memory, even with shadowed-memory remapping: if addresses
> from zero to 8.5 GB are valid (as they are on my box), the kernel
> allocates enough "vm_page" data structures to have one for all 8.5
> GB, even though there's a .5 GB PCI hole with no RAM behind it.
> Those pages are marked "not here, never use these" -- but they
> still take sizeof(struct vm_page) bytes (120 bytes) to represent.
> 512 MB of hole = 512*1024*1024 / 4096 = 131072 pages, which means
> the kernel is using 15728640 bytes (15 MB) to track this empty
> area.  So my remapping hardware gains me 512 MB and then the
> kernel loses 15, for a net of 497 MB recovered.
> 
> Chris




More information about the freebsd-hackers mailing list