"Understanding the Linux Kernel", by Bovet and Cesati, has a pretty nice section at the beginning that discusses bootup. Of course, the discussion of the Linux kernel boot sequence is extremely nice and detailed, but there is also a nice appendix that gives a pretty decent overview of the pre-kernel stuff, too.<p>Crucially, for x86, you will need to understand segmentation and paging, which Bovet and Cesati discuss at length. Highly recommended.<p>It's quite fun to download the 2.6 sources yourself and dig in the code along as you read. The book makes it quite easy to find the relevant files.
Related (I'm not sure if it's Linux), "Write Your Own Operating System" playlist and the links he provides:
<a href="https://www.youtube.com/channel/UCQdZltW7bh1ta-_nCH7LWYw" rel="nofollow">https://www.youtube.com/channel/UCQdZltW7bh1ta-_nCH7LWYw</a>
1. Bootloader such as grub/systemd-boot unpacks the Linux kernel binary and load it into memory. If the kernel is not compressed, it is loaded directly.<p>2. The Linux kernel booting main procedure, _start will be called, and setup all the relevant and important CPU stuff such as floating point initialization, various vector tables, setup paging, allocate memory space for PCI and interrupts, etc.<p>3. At this point Linux kernel part are done, it will pass the remaining to initrd.<p>4. Initrd will do userland loading stuff, like calling '/sbin/init' (sometimes /init). If this process cannot be found, a kernel panic is issued.<p>5. Feedback loop of userland and kernel stuff, at this point the operating system is functional.