Page MenuHomeFreeBSD

Fix some problems in SPARSE_MAPPING in the kernel linker.
ClosedPublic

Authored by markj on Sep 22 2019, 7:39 PM.

Details

Summary
  • Fix some style bugs.
  • Ensure that the end of the mapping passed to vm_page_wire() is page-aligned. vm_map_wire() expects this.
  • Wire pages before reading data into them to ensure that the mapping is backed by resident pages.
  • Apply the protections specified in the segment descriptor using vm_map_protect().
  • Ensure that on amd64 we load KLDs above KERNBASE.

Diff Detail

Repository
rS FreeBSD src repository
Lint
Automatic diff as part of commit; lint not applicable.
Unit
Automatic diff as part of commit; unit tests not applicable.

Event Timeline

markj created this revision.Sep 22 2019, 7:39 PM
markj added reviewers: alc, kib.Sep 22 2019, 7:53 PM
kib added a comment.Sep 23 2019, 2:49 PM

Is there any way to enable SPARSE_MAPPING except manually adding #define ?

sys/kern/link_elf.c
1101 ↗(On Diff #62434)

I suspect this is too rough. In principle, the segments need not be page-aligned, and you might remove W or X from a neighbor segment that shares the page with us.

I think the easiest would be to refuse loading such objects.

markj added a comment.Sep 23 2019, 3:28 PM
In D21756#474923, @kib wrote:

Is there any way to enable SPARSE_MAPPING except manually adding #define ?

No. I'm considering adding a kernel option for it, but it needs a better name than SPARSE_MAPPING IMO.

markj updated this revision to Diff 62474.Sep 23 2019, 4:01 PM

Reject KLDs with unaligned segment base addrs when SPARSE_MAPPING is defined.

markj marked an inline comment as done.Sep 23 2019, 4:01 PM
markj added inline comments.
sys/kern/link_elf.c
994 ↗(On Diff #62474)

I am not sure why we cannot just use kernel_object here. OBJT_DEFAULT doesn't make a lot of sense, since the memory will not be pageable.

kib accepted this revision.Sep 23 2019, 5:11 PM
This revision is now accepted and ready to land.Sep 23 2019, 5:11 PM