Great goal--and there are a lot of different ways to achieve it.
I would work from both books and from experience. If you really want to know what is going on at every level (a very admirable goal!) I'd recommend trying to learn an assembly language.
Just a single experiment with a micro-controller will teach you more than a dozen books. Do something fun with it.
I'd also recommend an intermediate language like C so that you can get a firm grasp of how a higher level language might interact with memory structures.
Contribute to an open-source Operating System--or at least try to.
If you want to know more about how the hardware works, try to make a flip-flop out of gates... See if you can make a simple adder with a radio-shack kit (there must be a computer-oriented spring based kit out there that actually teaches you how to make more than a radio)
If you are still in school, try to get part-time jobs doing things you don't understand or aren't comfortable with. Building and repairing PCs for a small PC shop, coding in a language you don't know yet, or take an intern position in a company that manufactures some kind of electronics (I mean something with a programmable CPU based product--which most electronic companies are these days).
I'm not saying don't read the books--I'm saying that you get more out of them when your need to read them is project driven and not simple curiosity.