mirror of
https://github.com/RGBCube/serenity
synced 2025-05-18 01:45:07 +00:00
Implement fork()!
This is quite cool! The syscall entry point plumbs the register dump down to sys$fork(), which uses it to set up the child process's TSS in order to resume execution right after the int 0x80 fork() call. :^) This works pretty well, although there is some problem with the kernel alias mappings used to clone the parent process's regions. If I disable the MM::release_page_directory() code, there's no problem. Probably there's a premature freeing of a physical page somehow.
This commit is contained in:
parent
10b666f69a
commit
8accc92c3c
16 changed files with 228 additions and 78 deletions
|
@ -15,6 +15,19 @@ FileHandle::~FileHandle()
|
|||
{
|
||||
}
|
||||
|
||||
OwnPtr<FileHandle> FileHandle::clone()
|
||||
{
|
||||
auto handle = make<FileHandle>(m_vnode.copyRef());
|
||||
if (!handle)
|
||||
return nullptr;
|
||||
handle->m_currentOffset = m_currentOffset;
|
||||
#ifdef SERENITY
|
||||
handle->m_fd = m_fd;
|
||||
handle->m_isBlocking = m_isBlocking;
|
||||
#endif
|
||||
return handle;
|
||||
}
|
||||
|
||||
#ifndef SERENITY
|
||||
bool additionWouldOverflow(Unix::off_t a, Unix::off_t b)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue