Start with the basics. It will give you a basic foundation to appreciate how computers work.<p><a href="https://www.nand2tetris.org/" rel="nofollow">https://www.nand2tetris.org/</a><p><a href="https://nandgame.com/" rel="nofollow">https://nandgame.com/</a><p>After this, start learning C. There will be a bunch of semantics to learn, which are all important, however with every small program that you write , you should generate the assembly code with gdb, and aim to understand what the assembly is doing (calling convention for functions, registers, syscalls, e.t.c). This will<p>Then, figure out how linking and loading works (i.e turning assembly code into the shape of an executable understood by the OS). Objdump and readelf are going to be your friends, as well as getting familiar with gdb debugger.<p><a href="https://eli.thegreenplace.net/tag/linkers-and-loaders" rel="nofollow">https://eli.thegreenplace.net/tag/linkers-and-loaders</a>.<p>This will give you a good foundation for low level development. You can then branch off to other areas like CUDA/OpenCL/AVX programming, microcontroller programming, kernel development, e.t.c