mirror of
https://github.com/RGBCube/serenity
synced 2025-07-23 04:17:34 +00:00
Kernel: Map executables at a kernel address during ELF load
This is both simpler and more robust than mapping them in the process address space.
This commit is contained in:
parent
678c87087d
commit
e56f8706ce
1 changed files with 4 additions and 8 deletions
|
@ -832,9 +832,6 @@ int Process::do_exec(NonnullRefPtr<FileDescription> main_program_description, Ve
|
||||||
dbg() << "Process " << pid() << " exec: PD=" << m_page_directory.ptr() << " created";
|
dbg() << "Process " << pid() << " exec: PD=" << m_page_directory.ptr() << " created";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MM.enter_process_paging_scope(*this);
|
|
||||||
|
|
||||||
Region* region { nullptr };
|
|
||||||
|
|
||||||
InodeMetadata loader_metadata;
|
InodeMetadata loader_metadata;
|
||||||
|
|
||||||
|
@ -848,23 +845,22 @@ int Process::do_exec(NonnullRefPtr<FileDescription> main_program_description, Ve
|
||||||
// FIXME: We should be able to load both the PT_INTERP interpreter and the main program... once the RTLD is smart enough
|
// FIXME: We should be able to load both the PT_INTERP interpreter and the main program... once the RTLD is smart enough
|
||||||
if (interpreter_description) {
|
if (interpreter_description) {
|
||||||
loader_metadata = interpreter_description->metadata();
|
loader_metadata = interpreter_description->metadata();
|
||||||
region = allocate_region_with_vmobject(VirtualAddress(), loader_metadata.size, *vmobject, 0, interpreter_description->absolute_path(), PROT_READ, false);
|
|
||||||
// we don't need the interpreter file desciption after we've loaded (or not) it into memory
|
// we don't need the interpreter file desciption after we've loaded (or not) it into memory
|
||||||
interpreter_description = nullptr;
|
interpreter_description = nullptr;
|
||||||
} else {
|
} else {
|
||||||
loader_metadata = main_program_description->metadata();
|
loader_metadata = main_program_description->metadata();
|
||||||
region = allocate_region_with_vmobject(VirtualAddress(), loader_metadata.size, *vmobject, 0, main_program_description->absolute_path(), PROT_READ, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(region);
|
auto region = MM.allocate_kernel_region_with_vmobject(*vmobject, PAGE_ROUND_UP(loader_metadata.size), "ELF loading", Region::Access::Read);
|
||||||
|
if (!region)
|
||||||
region->set_shared(true);
|
return -ENOMEM;
|
||||||
|
|
||||||
Region* master_tls_region { nullptr };
|
Region* master_tls_region { nullptr };
|
||||||
size_t master_tls_size = 0;
|
size_t master_tls_size = 0;
|
||||||
size_t master_tls_alignment = 0;
|
size_t master_tls_alignment = 0;
|
||||||
u32 entry_eip = 0;
|
u32 entry_eip = 0;
|
||||||
|
|
||||||
|
MM.enter_process_paging_scope(*this);
|
||||||
OwnPtr<ELFLoader> loader;
|
OwnPtr<ELFLoader> loader;
|
||||||
{
|
{
|
||||||
ArmedScopeGuard rollback_regions_guard([&]() {
|
ArmedScopeGuard rollback_regions_guard([&]() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue