From 9a296d63f3c89eb1d4e123d322e4c3fb4e6cf18f Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 24 Oct 2018 09:48:24 +0200 Subject: [PATCH] Add simplified mmap() and munmap() syscalls. --- .gitignore | 5 +++++ Kernel/Syscall.cpp | 4 ++++ Kernel/Syscall.h | 2 ++ Kernel/Task.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ Kernel/Task.h | 5 +++++ Kernel/_fs_contents | Bin 1024000 -> 1024000 bytes Kernel/sync-sh | 1 + LibC/Makefile | 1 + LibC/mman.cpp | 16 ++++++++++++++++ LibC/mman.h | 10 ++++++++++ Userland/.gitignore | 1 + Userland/Makefile | 9 +++++++-- Userland/ls.cpp | 21 +++++++++++++++++++++ 13 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 LibC/mman.cpp create mode 100644 LibC/mman.h create mode 100644 Userland/ls.cpp diff --git a/.gitignore b/.gitignore index 1377554ebe..11d77b9424 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,6 @@ *.swp +Serenity.config +Serenity.creator +Serenity.creator.user +Serenity.files +Serenity.includes diff --git a/Kernel/Syscall.cpp b/Kernel/Syscall.cpp index a5701b452f..1e70f9a510 100644 --- a/Kernel/Syscall.cpp +++ b/Kernel/Syscall.cpp @@ -90,6 +90,10 @@ DWORD handle(DWORD function, DWORD arg1, DWORD arg2, DWORD arg3) return current->sys$getpid(); case Syscall::PosixWaitpid: return current->sys$waitpid((pid_t)arg1); + case Syscall::PosixMmap: + return (dword)current->sys$mmap((void*)arg1, (size_t)arg2); + case Syscall::PosixMunmap: + return current->sys$munmap((void*)arg1, (size_t)arg2); case Syscall::PosixExit: cli(); locker.unlock(); diff --git a/Kernel/Syscall.h b/Kernel/Syscall.h index edc24d610b..22f6fb3812 100644 --- a/Kernel/Syscall.h +++ b/Kernel/Syscall.h @@ -24,6 +24,8 @@ enum Function { PosixGetgid = 0x1992, PosixGetpid = 0x1993, PosixWaitpid = 0x1994, + PosixMmap = 0x1995, + PosixMunmap = 0x1996, }; void initialize(); diff --git a/Kernel/Task.cpp b/Kernel/Task.cpp index 564ba726f9..4382b8db73 100644 --- a/Kernel/Task.cpp +++ b/Kernel/Task.cpp @@ -120,6 +120,49 @@ Task::Region* Task::allocateRegion(size_t size, String&& name) return m_regions.last().ptr(); } +bool Task::deallocateRegion(Region& region) +{ + for (size_t i = 0; i < m_regions.size(); ++i) { + if (m_regions[i].ptr() == ®ion) { + // FIXME: This seems racy. + MemoryManager::the().unmapRegion(*this, region); + m_regions.remove(i); + return true; + } + } + return false; +} + +Task::Region* Task::regionFromRange(LinearAddress laddr, size_t size) +{ + for (auto& region : m_regions) { + if (region->linearAddress == laddr && region->size == size) + return region.ptr(); + } + return nullptr; +} + +void* Task::sys$mmap(void* addr, size_t size) +{ + // FIXME: Implement mapping at a client-preferred address. + ASSERT(addr == nullptr); + auto* region = allocateRegion(size, "mmap"); + if (!region) + return (void*)-1; + MemoryManager::the().mapRegion(*this, *region); + return (void*)region->linearAddress.get(); +} + +int Task::sys$munmap(void* addr, size_t size) +{ + auto* region = regionFromRange(LinearAddress((dword)addr), size); + if (!region) + return -1; + if (!deallocateRegion(*region)) + return -1; + return 0; +} + int Task::sys$spawn(const char* path) { auto* child = Task::create(path, m_uid, m_gid); diff --git a/Kernel/Task.h b/Kernel/Task.h index 7427daee80..f79ccc267d 100644 --- a/Kernel/Task.h +++ b/Kernel/Task.h @@ -99,6 +99,8 @@ public: void sys$exit(int status); int sys$spawn(const char* path); pid_t sys$waitpid(pid_t); + void* sys$mmap(void*, size_t size); + int sys$munmap(void*, size_t size); struct { @@ -160,6 +162,9 @@ private: String name; }; Region* allocateRegion(size_t, String&& name); + bool deallocateRegion(Region& region); + + Region* regionFromRange(LinearAddress, size_t); Vector> m_regions; diff --git a/Kernel/_fs_contents b/Kernel/_fs_contents index 70277d8a7b6b46678562f84003bee4969fa4821e..315825570efed2d33dad720c6d561cae18cbe31b 100644 GIT binary patch delta 1713 zcmZoTVApWKZUYYs>qKS-hM>uUEYh5}lrBVru)$_i7H3ALDa;!g+n6SC@Gwtg4%*Dm z@tvRPfBi&83zq-Q|M@2}T5PV7=w#-$XMlsvf->)!H~*LK6_f-S1HuqFCI%)5gMoc| zB0r<>L;;=2PYg8-K`KBPBFV_W17R>QGB7ZhGB7ZhF)%QgGcYh%FfcG!GB7Y$O=MJ` zoMN;B&3HxzE||v2nnualm>$mgCawCZ;c8^^OFz%%m0LSJ`E4t0g`+1 z=l}oz4yEGFZ+J35!3^d%9}(CA3dPqdyBHi87z_`9MUOLhWGXTQ1q5V>GcYiKg_@5D z7#`@Z{d2N6{YU)a&OocS!X6B@(D3s(Yc*97AROLs1|Rwzx|q#QEYm@B&YuLbFCag z)BkWX3QRAU%^@&7z?4ysQF?m4DWhdQ$S*7mAOAao7z_*yybKHsLJTYno=`q0j)fQm z7y_Yu4zN5ILkpDu0~8?)tPBxQz5rNWlp!9AhAifX-11l2)1EUB7g8`Hd zhti-l1QOo{<%5EoQ5ce8K;m9Z3=CQzMj2E=3zR+vrP)CiX)`c@!kbBR^RD}$OkyRe z6(xEg=QHR*m|*Ws-&e@tJ-PO$^W^3zbdG2F%P759e1_K5L2KmWnAImfDntsumQGEIVYeoUa zLm;*~<0%j&K3%|uQGoH%bVVCRboGrpZ(Xv3(^$U1#uFNgT_4IqX5 zAhtS_B>QB&r)rGq(;xP7sB;#;wF&ldi1V^RBhi(efk9yM#z(@UZ$Saez`y{L35Co2 zg31^{^`x>hFepq<6k-$>6k=ommv*3x3zF@ao@mP`Zpp{Uz`)7C0Lr=`QHBa01_n@O zmuFyL0A*bk28bV2(X>ASYqwQI({8|v&@RcqzyQ;3il*Ix1LT>DPlW}Yp)$;1>lqjV zrU%+FiVJ!&LhMBo_JgX1DrN|nUf9o}&KtnN!0>>Hfk6QjL(>(Pb4arqa5FH>o$k1t zLz(pjF9So|c1ID$YUXV*911Mk6>2yh2)C7Rw3TqSm2kC{aJQB4w3YC-mGCVq;nx8G DUhYsC delta 992 zcmZoTVApWKZUYYs>vU!YhTzG9EYh6UXP%D+Vg1dfEY6HfWy~8H+n6SC@Gwtj4&Kbq z@tvQEziuL<1?T@}2L=WPh6Dd6G8%8Lk?3URmIv`6c(b6)d*;pm<$DDsot~YG24RQ< z69W^3!N4{>k)Kg`qJYliCx#lbAR9p#BFV_W17R>QGB7Y$O;$Cwo}6N|LKmb0gdviQ z3|tTfSd~2!1A_w-1A`+I1A`M21B3HqLjDaIO1c(u7OF)+9?F)+9>F)+9@F)(<5 zv`v0uI%oTWYQ_f5O$jCiY!{fB7z>IwG9F{z^hQBsvBDLJRt3gZ1*TR7=2iukRt45p z1-4cN_N59OE?X5CABb;@;ZR@^wh)52&IC+pFsL!8PBy+$#HcWN*%cd}#|#V%%|Dpx z1OfuWCcnF4z_@(6{6vm?Yk|PPpp1G328I`Z{{R2qd_*81AUtCtjNkbKEPSl>#lQdm z;Yth-ysY~F|NrLPH}lvOf}7t6bROE#D9ONZwxRQIKnBQqu&&M<%||4nrx`QKZ||GI z(ZtA6Tu`2;pjyf`kx^lKfC8h@WUYG#rt_IHI!yn?$tW<{>%J0Flrk_dGbn=0f@5X| zrRno$bJ#P=O}{^zW2HDqR)|4_p&F_}j)8$eh(T=n{5c$wjOEjJ&f)mNs6Kt&Tn_Pi zRR#u-(TqY23@Qu^3`}|q45kbW3?RN0h_A}P-~*zW7#LDOv=#$H5mde$#8+it0EG!i z{WK_l9aMfZlz#$5D={!|F+$80V`N}p(qUkbWn^H`Wzt|^FojB3fh1HJ7+j%zFDO3{ zL@P5e#7-}q$B`qc%fKKAvOIX*!rfNF(^kUUR>HTegkJ{$zB&9J diff --git a/Kernel/sync-sh b/Kernel/sync-sh index 971ab5c9cb..a0f071bd68 100755 --- a/Kernel/sync-sh +++ b/Kernel/sync-sh @@ -3,5 +3,6 @@ mount -o loop _fs_contents mnt/ cp ../Userland/sh mnt/bin/sh cp ../Userland/id mnt/bin/id cp ../Userland/ps mnt/bin/ps +cp ../Userland/ls mnt/bin/ls umount mnt sync diff --git a/LibC/Makefile b/LibC/Makefile index 47485d29fd..ed1e157531 100644 --- a/LibC/Makefile +++ b/LibC/Makefile @@ -3,6 +3,7 @@ OBJS = \ unistd.o \ string.o \ process.o \ + mman.o \ entry.o LIBRARY = LibC.a diff --git a/LibC/mman.cpp b/LibC/mman.cpp new file mode 100644 index 0000000000..ad8aae334c --- /dev/null +++ b/LibC/mman.cpp @@ -0,0 +1,16 @@ +#include "mman.h" +#include + +extern "C" { + +void* mmap(void* addr, size_t size) +{ + return (void*)Syscall::invoke(Syscall::PosixMmap, (dword)addr, (dword)size); +} + +int munmap(void* addr, size_t size) +{ + return Syscall::invoke(Syscall::PosixMunmap, (dword)addr, (dword)size); +} + +} diff --git a/LibC/mman.h b/LibC/mman.h new file mode 100644 index 0000000000..fb6f2af844 --- /dev/null +++ b/LibC/mman.h @@ -0,0 +1,10 @@ +#pragma once + +#include "types.h" + +extern "C" { + +void* mmap(void*, size_t); +int munmap(void*, size_t); + +} diff --git a/Userland/.gitignore b/Userland/.gitignore index 27529b9b9b..5f641bf9a1 100644 --- a/Userland/.gitignore +++ b/Userland/.gitignore @@ -1,4 +1,5 @@ id sh ps +ls *.o diff --git a/Userland/Makefile b/Userland/Makefile index ec3fddd381..c1cd22033c 100644 --- a/Userland/Makefile +++ b/Userland/Makefile @@ -1,12 +1,14 @@ OBJS = \ id.o \ sh.o \ - ps.o + ps.o \ + ls.o APPS = \ id \ sh \ - ps + ps \ + ls ARCH_FLAGS = STANDARD_FLAGS = -std=c++17 -nostdinc++ -nostdlib @@ -35,6 +37,9 @@ sh: sh.o ps: ps.o $(LD) -o $@ $(LDFLAGS) $< ../LibC/LibC.a +ls: ls.o + $(LD) -o $@ $(LDFLAGS) $< ../LibC/LibC.a + .cpp.o: @echo "CXX $<"; $(CXX) $(CXXFLAGS) -o $@ -c $< diff --git a/Userland/ls.cpp b/Userland/ls.cpp new file mode 100644 index 0000000000..f6a90568b9 --- /dev/null +++ b/Userland/ls.cpp @@ -0,0 +1,21 @@ +#include +#include +#include + +int main(int c, char** v) +{ + int fd = open("/"); + if (fd == -1) { + printf("failed to open / :(\n"); + return 1; + } + + byte* memory = (byte*)mmap(nullptr, 16384); + printf("%p\n", memory); + memory[0] = 'H'; + memory[1] = 'i'; + memory[2] = '!'; + memory[3] = '\0'; + printf("%p : %s\n", memory, memory); + return 0; +}