Sure, there is a gradient of complexity here, first you can just do your stuff in kernel in a single thread, then you'll probably want to load programs and execute them in userspace [0], then you'll want multitasking and task scheduling, memory isolation and process syncronization etc. You can call any of those steps an OS of course, its just I personally find earlier steps not that interesting.
Another one great resource (that actually inspired me to tinker with all this awesome stuff) is this book [1]