On 4/3/23 2:58 PM, Marvin Häuser wrote:
That last part is actually not ignoring the use-case, that *is* our use-case.
The terminology again is very OS-oriented, it’s important to know that
generally OSes will fail to load binaries that are aligned less than the
platform page size, as they cannot apply permissions (and probably also some
implementation details of mmap / VM / whatever). That’s why the maximum page
size you’re realistic to encounter is exactly the image segment alignment (by
hardware convention, this is a power of two, thus a strict alignment satisfies
all less strict alignment constraints).
The common page size on the other hand appears to be an optimization, for which
you specify the most common page size (e.g., you may target AARCH64 which may
require 16 KB alignment, but most of your targets will have only 4 KB pages),
which the compiler will use to optimize the binary for the common targets. I
have no idea why this is even used. There also were discussions on LLVM
platforms that it should be avoided.
The naive approach would be to just use max-page-size, drop all references to
common-page-size, and align all ELF sections that will be converted to PE
sections by max-page-size. But I’m sure there’s some ancient workaround /
compiler bug / edge use case / portability or whatever reason why
common-page-size was used. :)
(CC Leif for related experience.)
edk2 generally sets this to a low value to save SPI (and possibly RAM) space,
as nothing in the stack enforces memory protection ( :( ). I’m not sure why
there’s both 32 and 64 Bytes, but I could imagine it’s some GNU ABI thing where
some type of some arch actually requires this alignment, or maybe there’s
different rules for global variables. A text segment must at least satisfy the
maximum instruction alignment constraint (this may be a thing with, e.g.,
normalised instruction lengths), while data segments must satisfy at least the
maximum data alignment constraint (which might usually be some large float? Not
sure). 4 KB is used when memory protection is needed (usually RT drivers, as
they’re mapped into the OS environment), but AARCH64 may actually require 16 KB
(e.g. Apple A chips didn’t even support less for a while).
Thanks.
One problem with using max page size appears to be that there are some
modules that set the common page size to 4KB in order to enable memory
protection. e.g.:
commit ddd89cd50dd3a989e58a75ed38011168e3ec0954
Author: Ard Biesheuvel <ard.biesheu...@linaro.org>
Date: Wed Sep 30 08:53:00 2015 +0000
OvmfPkg: set 4 KB section alignment for DXE_RUNTIME_DRIVER modules
Increase the section alignment to 4 KB for DXE_RUNTIME_DRIVER modules.
This allows the OS to map them with tightened permissions (i.e.,
R-X for
.text and RW- for .data). This is a prerequisite for enabling the
EFI_PROPERTIES_RUNTIME_MEMORY_PROTECTION_NON_EXECUTABLE_PE_DATA (sic)
feature that was introduced in UEFIv2.5.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org>
Reviewed-by: Laszlo Ersek <ler...@redhat.com>
Reviewed-by: Jordan Justen <jordan.l.jus...@intel.com>
Tested-by: Laszlo Ersek <ler...@redhat.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18564
6f19259b-4bc3-4df7-8a09-765794883524
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#102444): https://edk2.groups.io/g/devel/message/102444
Mute This Topic: https://groups.io/mt/98045342/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-