The first problem is getting the OS kernel loaded into memory. Fortunately, systems have firmware that helps with this process.
In the typical case of x86 PC-clone systems, the firmware only helps a little, by having low-level routines for reading sectors from the disk (and maybe only part of the disk), and the ability to read the first sector of a disk and executing the code from it. This is usually enough to allow loading a second-stage bootstrap loader that can read in a kernel image.
Other (non-PC) systems may have more sophisticated firmware which knows how to read standard filesystem layouts to read a kernel image.
Once the kernel image begins executing, it inventories and initializes system hardware (memory, I/O devices, disks).
Once the hardware is initialized, it mounts a specified root filesystem and executes /sbin/init, which then handles "userland" initialization.