ToaruOS v2.1.0
What's New in v2.1.0
- Initial architecture support for AArch64 (ARMv8) has been added:
- Initial platform target support for the
virt-2.12
machine target inqemu-system-aarch64
has been added. - Experimental support for Raspberry Pi 400 has been added.
- Hardware driver support for this platform is limited and will be expanded in ToaruOS 2.2.
- Initial platform target support for the
- Several bugs have been fixed:
- An issue in which the e1000 network device driver mapped pages as user-accessible has been resolved.
- An issue in which segmentation faults were not properly delivered to processes on x86-64 has been resolved.
- An issue in which animating windows were incorrectly rendered in the compositor has been resolved.
- An issue in which exiting processes could be scheduled and delay cleanup has been resolved.
- An issue in which
mktime
calculated incorrect dates has been resolved. - A number of issues related to incorrect or insufficient lock ordering around IPC primitives have been resolved.
- An issue in which the PC serial console can cause unexpected lockups has been resolved.
- Various issues with invalid/corrupt ELF files have been resolved in
readelf
. - An issue in which attempting to delete directories from a tmpfs would cause a kernel panic has been resolved.
- An issue in which traced processes could exec SUID binaries as been resolved.
- The implementation of signals has been largely replaced:
- Signal delivery no longer induces a nested kernel execution context.
- Signal handling occurs only during transitions to userspace.
- Userspace signal context is now stored on the userspace stack.
- Basic signals are now blocked on execution of their handlers.
- Several issues related to nested signal handling have been resolved.
- System call interfaces can now support automatic restart when interrupted by a signal.
- Signal delivery in the debugger /
ptrace
interface has been improved. sigaction
,sigprocmask
,sigwait
,sigsuspend
have been implemented.waitpid
will no longer return immediately when a candidate process is suspended and did not change state.- Adjustments have been made to the text printed when a signal key sequence is sent to a TTY.
- Userspace memory management has been improved:
- An experimental
munmap
system call has been added. - The libc
malloc
/free
can now release memory from large allocations. - The fixed addresses of shared memory mappings have been relocated.
- An experimental
- Some functionality of the compositor has been improved:
- Resize events are now sent during mouse-initiated window resize.
- When the cursor is over a rotated window, it will be rotated to match the orientation of the window during software rendering. (Hardware cursors, where supported, are not rotated.)
- Blur effects are now available.
- Window advertisement events are now sent when a window is resized.
- Terminal rendering has been improved.
- Deferred rendering has been implemented and improved.
- A glyph cache for TrueType text provides greatly improved rendering speed.
- Specialized rendering of some box drawing characters has been implemented, improving the appearance of lines and shaded blocks.
- The dynamic linker has been improved:
- Symbol resolution in some corner cases that were previously mishandled has been fixed.
- TLS (thread-local storage) data has been relocated relative to the thread pointer.
- Some dynamic TLS relocations are now supported.
- Kuroko and Bim have received upstream updates.
- Mechanisms for the setting the clock time have been added:
- A
settimeofday
system call and corresponding libc function are now available. - The
date
utility can now parse some time strings and set the time when run asroot
.
- A
- Some improvements have been made to the networking stack:
ifconfig
now supports setting IPv4 addresses and some route configuration.recvfrom
on UDP and ICMP sockets is now supported for obtaining source address information.- ICMP sockets have been made to work like other operating systems, returning only the ICMP payload.
- The PC BIOS loader now uses BIOS calls to read keyboard input, which should allow it to work with USB keyboards.
- The File Browser now has a context menu option to delete files.
- The display of graphs in the System Monitor application has been improved.
- A regex-capable
grep
utility has been added.- The regex dialect is not compatible with POSIX BREs, but this is subject to change; the current regex engine comes from Bim.
- The output format of the
ps
command has been improved with additional columns.
What is ToaruOS?
ToaruOS is a hobbyist, educational operating system for x86-64 PCs, focused primarily on use in virtual machines. It provides a Unix-like environment, complete with a graphical desktop interface, shared libraries, feature-rich terminal emulator, and support for running, GCC, Quake, and several other ports. The core of ToaruOS, provided by the CD images in this release, is built completely from scratch. The bootloader, kernel, drivers, C standard library, and userspace applications are all original software created by the authors, as are the graphical assets.
Who wrote ToaruOS?
ToaruOS is primarily written by a single maintainer, with several contributions from others. A complete list of contributors is available from AUTHORS.
Running ToaruOS
It is recommended that you run ToaruOS in a virtual machine / emulator, for maximum compatibility. ToaruOS's driver support is limited, and running on real "bare metal", while possible, does not provide the most complete experience of the OS's capabilities except on very particular hardware. ToaruOS is regularly tested in VirtualBox, QEMU, and VMWare Player, and can be successfully booted (with poor performance) in Bochs. ToaruOS is intended to run from a live CD, though it is possible to install to a hard disk. Additional details on running ToaruOS in different virtual machines is available from the README.
Release Files
image.iso
is the standard x86-64 build of ToaruOS, built by the Github Actions CI workflow. It uses ToaruOS's native bootloaders and should work in most virtual machines using BIOS, and in some EFI environments.
aarch64.tar.gz
contains files for running QEMU ARMv8 VMs. Use the run.sh
shell script to start QEMU, and adjust as needed to enable accelerated operation under KVM or HVF.
Changelog
aarch64
: (wip) support kernel modulesaarch64
: Actually reset kernel stack on execaarch64
: Add a tty driver for the pl011 uartaarch64
: Load kernel symbol tableaarch64
: ac97 driver as moduleaarch64
: add ext2, iso9660 modules; JUMP26 relocaarch64
: apply e1000 permission changesaarch64
: atan2() by polynomial approximationaarch64
: basic kernel tracebacks on el1-el1 faultaarch64
: basic relocations, enough for test.koaarch64
: be more flexible about where the kernel is physicallyaarch64
: cleanupaarch64
: cleanup some warningsaarch64
: cleanup, fix warningsaarch64
: clear instruction cache on new pages when forkingaarch64
: disable lock debuggingaarch64
: don't be so intent on running driver bringup on cpu0aarch64
: dospart.ko as wellaarch64
: dump regs on unknown fatal exceptionsaarch64
: e1000 driver as moduleaarch64
: enable userspace access to timer physical counteraarch64
: expose aarch64_interrupt_dispatch as a symbolaarch64
: expose dtb as a device fileaarch64
: fix mmu_first_n_frames since ram movedaarch64
: fixup warning about discarded volatileaarch64
: flip smp mutex after doing init for better startup synchronizationaarch64
: force task switch when idle gets wakeup signalaarch64
: idle task loops should be the same for BP and APsaarch64
: implement a better spinlockaarch64
: implement panic halting with sgisaarch64
: increase inital stack size for kernel startupaarch64
: interrupt mapping improvements, chained interrupt handlersaarch64
: mmu: be more paranoid about frame allocation/clearingaarch64
: mmu: fix up insufficient locking around mulitlevel page mappingaarch64
: read rtc time again on qemuaarch64
: remove some debug messagesaarch64
: remove superfluous reload of TTBR1aarch64
: reset timer on entry into idle waitaarch64
: save/restore fpu status registersaarch64
: start work on interrupt dispatchaarch64
: temporary device drivers until modules are readyaarch64
: this seems to be necessary or hvf can occasionally throw a fault on syscall return?aarch64
: traceback: fix incorrect base pointer on manual tracebackaarch64
: virtio: be even pickier about cache maintenanceaarch64
: virtio: make sure irq handler symbols are in our table for debuggingabout
: use markup_text for renderingbase
: Don't use large pages when building libs for x86-64base
: New default wallpaper.base
: g++ doesn't like these restrictsbim
: Syncbim
: Update syntax definitionsbim
: at least attempt to wait for forked childrenbim
: lua highlighterbim
: more search improvementsbim
: regex search/replace improvementsbim
: sync upstreambim
: sync with kuroko changesbim
: sync with upstreambim
: tab completion for 'import'; krk api updatesboot
: Use BIOS calls to read keyboard, which should work for USBcalculator
: slightly more sensible input handlingcalculator
: use markup_text for renderingcompositor
: Implement semi-lazy window resizingcompositor
: blur-behind windowscompositor
: resize extended clip context when display resizescompositor
: rotate mouse cursor to match rotation of window under cursorcompositor
: send window advertisements when windows are resizedcpu-name.krk
: int() is base 10 by default now; specify 0cpu-name
: aarch64: 0/0 means hypverisor is hiding thingscpuwidget
: Fancier persistent graphscpuwidget
: fix permissions on netif statusdate
: add rudimentary support for setting date/timee1000
: restrict access to SIOCS* family, write()file-browser
: Add 'Delete' to context menufile-browser
: don't make the path input look focused when the window isn'tfile-browser
: prevent backspace from navigating up on the desktopgithub
: Attempt to add a new workflow for aarch64graphics
: fix bad bounds checks in draw_sprite_alpha*graphics
: fix bad translate in draw_sprite_rotategrep
: Add a basic regex-matching grep with some optionsgrep
: don't print (standard input) when input is implicitly stdini965
: cleanup, clear screen on initial mode setifconfig
: cleanup, add commands to set addresseskernel
: Add sigactionkernel
: Don't let things clear frames without holding the frame alloc lockkernel
: Handle some invalid arguments in signal syscallskernel
: More lock fixes around pipes...kernel
: Restart some signals, fix up suspend to work with new signal managementkernel
: Return signal number that caused process to stopkernel
: Support SA_NODEFERkernel
: Update version codenamekernel
: aarch64: initial pass at clearing upper page structures on unmapkernel
: add a temporary 'munmap' sysfunckernel
: add missing PTRCHECK to sys_readline; fixes #250kernel
: add sigsuspendkernel
: clear signal disposition when running a handler, as we shouldkernel
: complete redesign of signal handlingkernel
: disable some printfskernel
: don't SUID traced processeskernel
: enable -Wstrict-prototypeskernel
: ensure we're saving/restoring all process state on signalskernel
: fix faulty lock around sleep nodes not capturing potential change in ownerkernel
: fix waitpid() with WSTOPPED; only return on state change?kernel
: fixup ptrace signal delivery, againkernel
: improve comments in sys/ptrace.ckernel
: improve comments in sys/signal.ckernel
: more lock ordering shenaniganskernel
: more signal functionskernel
: packetfs: handle -ERESTARTSYS from underlying pipekernel
: print more details when trying to alert invalid processkernel
: relocate some user virtual addresseskernel
: rudimentary sigwaitkernel
: we have more than 31 signals...kernel
: x86-64: copy over unmap improvements from aarch64kuroko
: DYNAMIC_PROPERTY is no longer a thingkuroko
: Sync for bugfixeskuroko
: Sync with upstreamkuroko
: add waitpid bindings (temporary; should be in 'os')kuroko
: apply const argument fixes to moduleskuroko
: apply more API changeskuroko
: disable gc in krk_test_noisekuroko
: small cleanupskuroko
: sync for upstream 1.3.0 releasekuroko
: sync upstreamkuroko
: sync upstreamkuroko
: sync upstreamkuroko
: sync upstreamkuroko
: sync upstream, rc1kuroko
: sync with upstreamkuroko
: sync with upstreamkuroko
: sync with upstreamkuroko
: sync with upstreamkuroko
: sync with upstreamkuroko
: sync with upstreamkuroko
: sync with upstreamkuroko
: sync with upstreamkuroko
: sync with upstreamkuroko
: sync with upstreamkuroko
: sync with upstreamkuroko
: sync with upstreamkuroko
: sync with upstream 1.3.0-alphakuroko
: sync with upstream, againkuroko
: update to 1.3-beta and sync bimkuroko
: use sigaction for sigint handler on ToaruOSkuroko
: yet more upstream syncingld.so
: Handle local TLSDESC entry from libstdc++?ld.so
: Ignore DTPMOD, DTPOFF rather than bailingld.so
: Possibly incorrect dynamic TLS implementationld.so
: __tlsdesc_static is potentially unusedlibc
: aarch64: tan() can be expressed as sin()/cos()libc
: fix conversions of negative timestamps (eg., 0 in western timezones)libc
: fix terribly broken mktimelibc
: ioctl sets errnolibc
: make pthread_t scalarlibc
: make srand repeatable and better for seeding with timelibc
: more useful stub pow() for aarch64 so Quake playslibc
: qsort_rlibc
: strsignallibc
: stub tgamma for kurokolibc
: use munmap sysfunc in free() for 'big bins'linker
: rudimentary TLSDESC for aarch64; kuroko modulesmarkup_text
: Implement a glyph cache and expose a more detailed APImeta
: Add some magic to figure out what modules to buildmeta
: Fixup build-toolchain to build libgcc, crts correctlymeta
: If a filed called '.arch' exists, use it as ARCH by defaultmeta
: README typo missing wordmeta
: That may need to be defined in the individual target Makefiles...meta
: Update some copyright yearsmeta
: Upload RPi400 kernel8.img as an artifactmeta
: Use 'strip' from toolchainmeta
: add 'hvf' phony target to arch makefilemeta
: capture only up to first : when generating release notesmeta
: fix permissions on util/build-in-docker-aarch64.shmeta
: replace missing host kuroko build in Makefilemeta
: uh, where did that come frommkdisk
: FAT overhead is too high again... overestimate morenet
: Cleanup headersnet
: Make ICMP sockets more normalnet
: Support recvfrom on udp socketspackage-manager
: Show a message when no packages are availablepanel
: Don't crash when window buffer disappears between ad refreshespanel
: fixup inefficient window list redrawingprocfs
: RUNNING processes should have state Rprocfs
: avoid crashes on empty module, filesystem tablesprocfs
: expose heap break point in /proc/{PID}/statusprocfs
: fill on open for consistent readsprocfs
: times are reported in microsecondsps
: more bsd-y format for time?ps
: report TIME column from TotalTimepthread
: Remove magic thread exit; pthread_exit() is just syscall_exitreadelf
: Add several sanity checks.readelf
: fix incorrect handling of RELA sectionsreadelf
: missing returnreadelf
: use strings for more columnsrline
: Merge fixes from Kurokorline
: pull in cleanup from kuroko versionrpi400
: fbterm: only do that on armrpi400
: initial platform supportrpi400
: mini uart driverrpi400
: request maximum clock speed at startuprpi400
: smp startuprpi400
: try to clean up rpi stuffsh
: Hack to fix display width when prompt contains wide characterssh
: tab completion for ifconfigsh
: that decoder is in a header...sh
: use strsignal, improve job list slightlystrace
: sys_execve doesn't return on success; handle that common case bettersudo
: bail early of euid isn't 0terminal
: don't need to reset mouse_ticks in draw_cursorterminal
: dumb glyph cache for truetype textterminal
: render box drawing characters speciallytext
: Add methods for rasterizing single glyphstext
: Allow x-adjusted glyph rendering, for better kerning in cachestext
: faster, though not as nice, stroking methodtmpfs
: Don't completely bomb on trying to unlink a directorytop
: 'W' to switch sort column lefttop
: add 'S' column for statetop
: commentstty
: do not print line feed after ^C, et al.tty
: fix permanently set EOF status on ttyvirtio
: Remove unused PCI cap parsingvirtio
: map command to left supervirtio
: these F keys should work toox86-64
: fixup serial receive loop as this one was kinda badx86_64
: fix segfault not being delivered due to cow regressionxhci
: Basic initializationyutani-tty-pipe
: Dumb tool to act as a keyboard over a ttyyutani
: pex read() can return error code
Known Issues
- AArch64 builds are not production-ready and should not be used on hardware targets.
- Several utilities, libc functions, and hardware drivers are missing functionality.
- There are many known security issues with ToaruOS. You should not use ToaruOS in a production environment - it is a hobby project, not a production operating system. If you find security issues in ToaruOS and would like to responsibly report them, please file a regular issue report here on GitHub.