I want to get involved in systems programming, but don't know where to start.
My background is in developing web applications, and have used PHP, Ruby, Python and JavaScript heavily over the years. I don't have a formal education in computer science.
I've recently started looking at Rust[1], and have found myself having to learn about things like memory, pointers, lifetimes, ownership, (de)referencing and so on. I've found that I've been spoiled by dynamic languages over the years in not having to think/worry about any of that.
Where did you start in learning all of this? Can you show me any resources which would help me in learning this sort of thing?
What computer science concepts do you find most valuable when it comes to systems programming?
Thanks for the help in advance!
1. Rust - http://rust-lang.org
You will learn a lot about what goes into making a distro actually boot, how the different pieces of software are interacting with each other, and how to solve and debug typical issues and kernel panics.
From there, I think many would recommend attempting to make some sort of Kernel Module, even if it's a very basic one that isn't of much use. The experience alone will teach you a lot of valuable skills and knowledge.[2]
Learning some assembler will help as well. There is a great free ebook from the gnu assembler (GAS) project [3]. Assembler will help teach you how the computer is really doing what it does. This is important if you are going to be working closer to the kernel and most of the critical subsystems, be in Linux or the BSD's (even Windows actually). There are many different Assembler languages, but learning some basics in one will help you understand how others work.
[1] http://www.linuxfromscratch.org/lfs/
[2] http://www.linuxchix.org/content/courses/kernel_hacking/less...
[3] http://download.savannah.gnu.org/releases/pgubook/Programmin...