Thanks for reading and thanks for all the corrections, in glorious Hacker News fashion. It's definitely a pleasant surprise to see my project here. Putting the "You" in CPU is still very much a work in progress — I was hoping to polish it a lot more and even add some more content before posting on HN later next week :)
Some backstory on me: I'm 17 and left high school a year ago to work full-time at Hack Club (https://hackclub.com/). I've been programming for as long as I can remember, and started homeschooling about 6 years ago to focus more on that (and my other interests).
Since I'm entirely self-taught, I haven't taken any college systems classes — and while I had picked up a lot, I wasn't happy with my answer to "what happens when you run a thing." So I let myself spend a shit ton of time actually learning as much as possible. What I found was that:
1. Operating systems and hardware are really fun to learn about!
2. Wow, online resources on this stuff are terrible.
A decent portion of my research ended up at PDFs of lecture slides from 2014, or StackOverflow answers that were, in fact, incorrect or vastly oversimplified.
So, I wrote Putting the "You" in CPU to hopefully provide a better resource to people who wanted to start teaching themselves all this stuff! While I don't provide perfect coverage (still need to write a couple paragraphs on SMP), it's a lot better than most of what I've seen. I also had fun drawing and making diagrams for the first time, I think I definitely got progressively better and I'm really proud of some of the drawings in the latter few chapters.
P.S. The whole thing is open source on GitHub if you want to look under the hood: https://github.com/hackclub/putting-the-you-in-cpu
I've been thinking this a lot lately, searching for things like: a detailed block diagram of the Linux kernel, how page tables work, a comparison of function call ABIs on different platforms, details about low-level network protocols, reserved Linux PID numbers, etc.
Occasionally I would find a Reddit thread with an answer, but it was mixed in with the usual Reddit dross, and I doubt that Reddit is a reliable place to store knowledge. StackOverflow was particularly unhelpful, as the questions are mostly oriented around accomplishing particular tasks, and the answers are necessarily brief.
Nowadays, for general knowledge, I skip Google's enshittified search and go straight to Wikipedia, but Wikipedia has limits on how much detail it will go into about technical topics.
I wonder if there's a need for a comprehensive wiki for all the details of computer guts? There are lots of scattered resources, but having them all compiled in one place would be awesome.
That's on me, I'm a fan of your work and saw this pop up on my GitHub feed. I probably should have considered if you were ready for it to be shared. I hope the attention was mostly positive!
glad you like it :3
Have you actually gone down already the rabbit hole that is the history of computing and alternative approaches to what we have today?
At least if you didn't skip the computer architecture and operating systems classes.
For me it was a common thing to define an ISA, implement a simulator and assembler, and hand-write some assembly as part of learning how computers work. A dedicated man might go the extra mile and implement it in FPGA, or write a LLVM backend.
Then there is all the operating system aspect. It's quite common to implement your own kernel there to learn, or at least to modify an existing one.
Fixed the code example and merged!
> The first byte (05) is an opcode specifically representing adding the EAX register to a 16-bit number. The remaining bytes are 512 (0x200) in little-endian byte order.
That explains only the first 3 of the 5 bytes in the instruction. What are the remaining 00s for? Did he perhaps mean that the opcode is for adding EAX to a 32-bit number?
From [0]:
> Since shebangs are handled by the kernel, and pull from buf instead of loading the whole file, they’re always truncated to the length of buf. Apparently, 4 years ago, someone got annoyed by the kernel truncating their >128-character paths, and their solution was to double the truncation point by doubling the buffer size! Today, on your very own Linux machine, if you have a shebang line more than 256 characters long, everything past 256 characters will be completely lost.
What is the reason for silently truncating someone's filepath? The kernel, of all places, should not be doing such things. Granted, 256-byte long file paths don't make sense, but 256-byte long path+argument strings will almost certainly happen sometimes. To just silently break someone's script is wrong.
A couple years ago someone attempted a patch to the kernel that would at least fail loudly in the case of oversized shebangs. This ended up causing problems for NixOS which, being Nix, already was using oversized shebangs with lots of long nix-store paths. They were previously being silently truncated but still working, and suddenly all those scripts failing caused a lapse in backwards compatibility! So the patch had to be undone and we haven't gotten anything similar since.
See https://lwn.net/Articles/779997/ for more info.
it's there to tell where the interpreter for the current file is.
shebang can't even handle more than a single argument on its own. if you have `#!/bin/program -args somescript`, it will divide it into ['/bin/program','-args somescript'], which is almost never what you actually wanted. ( this is linux specific, shebangs aren't necessarily universally portable between all unices )
if you want to do something complex, make it `#!/bin/sh` and then `exec` from the current file with whatever arguments you need.
one thing that link doesn't mention is that you can use env to lookup an interpreter via the current path.
`#!/usr/bin/env python3` for example, will find whatever `python3` the users is using, without having to know where it is.
this can be useful for scripts that you will be running from virtual environments, for example, which work by overriding the PATH to the python interpreter.
you wouldn't want to do this with anything installed, however, since you wouldn't want installed programs to let the user control what interpreter to use. instead, you should just use an absolute path.
there is an option in env, -S, that can be used to parse a command line from a single string specifically to handle this limitation.
after years of avoiding much trickery in shebang lines, it seems like a questionable practice at best.
Clearly this is targets only people with multiple PhDs in electrical engineering and computer science.
How do you get it all on one page? That gives you the ability to ctrl+f stuff, skip past things you know by skimming their contents, scroll back up to things you need to re-read, and way more.
What does this mean?
Very considerate!
- Computer architecture or CPU design book covering modern designs with their tradeoffs
https://www.amazon.com/Computer-Architecture-Quantitative-Ap...
- Introduction to Verilog or VHDL (languages for hardware) maybe on FPGA's or well-known boards
https://www.amazon.com/Programming-FPGAs-Getting-Started-Ver...
- High Speed Digital Design (many recommended it)
https://www.amazon.com/High-Speed-Digital-Design-Handbook/dp...
- Cookbook with many examples for FPGA's
I don't have one. Most with these titles are expensive. One that looked promising had bad reviews. I'll leave it to HN to fill in the blanks.
- High-level synthesis
Most exciting one I remember when I stopped researching this stuff was Synflow. I don't know if they're still around.
Before that, I had saved Baranov's work which showed how to turn Abstract, State Machines into actual hardware. It was like a how-to on high-level synthesis that he used commercially at Synthezza. I still share them periodically in case someone wants to build an OSS version. I also saw ASM's used in verifying compilers and hardware in separate work. There's a good chance someone can turn many things into a unified, field theory of sorts using ASM's.
https://www.amazon.com/Finite-State-Machines-Algorithmic-Com...
https://www.linkedin.com/pulse/second-ebook-samary-baranov-h...