Learn the inner workings of modern computer systems. From binary numbers to assembly programming.
All courses assume no prior knowledge and gradually increase in complexity.
Introduction to Modern Computers
- What is a computer?
- Analog vs. digital computers
- Why we use digital computers
- From Components and Circuits to Modern Computers
- Basic Computer Architecture
- An Overview of Computer Components and Hardware
- The Motherboard
- CPUs: How the Central Processing Unit Works
- Random Access Memory (RAM)
- Graphics Cards
- Network Interface Cards
- Computer Power Systems
- Binary numbers: The heart of digital computers
- Introduction to binary numbers
- Binary, decimal, and hexadecimal
- Digital logic gates
- AND Gate
- OR Gate
- NOT Gate
- NAND Gate
- NOR Gate
- XOR Gate
- XNOR Gate
- Assembly Language: The Best Way to Learn How Computers Really Work
- Getting Started with x64 Assembly Programming
Host and Network Hacking
What is a Computer?
A computer is a machine that performs an operation or calculation.
An early predecessor to the computer is the abacus. Abacus are mostly popular as a children’s toy in the West. However, abacus competitions have become popular in some areas in modern times (particularly India and China), sparking a renewed interest in this ancient tool.
The first computer we have record is probably the Antikythera mechanism, dated between about 205 and 60 BC:
Throughout history, computers have been made with gears, pistons, relays, tubes, punch cards, and lots of precision-made machinery.
In contrast, modern computers are made with circuit boards and high-tech components. In large part, this is thanks to the invention of the semiconductor transistor, which we have been able to make smaller and smaller.
The transistor is the basic element of logic in a computer. It operates like a switch; when the transistor is conducting, we say that the switch is on and assign the value of ‘1’. When we flip the transistor off, we we assign the value of ‘0’. These are the ‘1’s and ‘0’s of binary logic that allow computers to function.
What can we do with a bunch of ‘1’s and ‘0’s? Quite a lot, it turns out. And what we can do depends on how many transistors we have.
Modern computers have hundreds of billions of transistors, so they can do quite a lot.
The Two Types of Computers
There are two types of computers: analog computers and digital computers.
Analog computers use physical characteristics like electrical or mechanical quantities in order to model a problem. In other words, they create a physical representation of the specific problem that they are trying to solve.
Analog computers can be incredibly good at solving one specific problem extremely fast and with excellent precision.
Their only downside is that they aren’t programmable; they can only do the one task that they are designed for.
This is where digital computers come into play, and why they are so popular today.
Digital computers are more complex than analog computers. Instead of modeling one problem and trying to solve it, a digital computer uses a bunch of transistors that can hold the value of a ‘1’ or a ‘0’. This is called binary.
The magic of this system is that if we’re clever, we can do a lot of things with a bunch of ‘1’s and ‘0’s. We can do complex mathematics and we can create logic gates that allow us to build even more functionality. It turns out that we can do all of things that we want daily use computers to do; text editing, web browsing, video watching, emailing, printing, etc.
When we say the word ‘computer’ today, what you think of is probably a modern computer, not a historic one.
Modern computers are made of lots of different components that do specific things. You’ve probably heard of a lot of them, like processor/CPU, memory/RAM, storage or disk space, power supply, etc.
Each of these components work together to build a functioning computer that is capable of being programmed to do an infinite number of tasks.
Central Processing Unit (CPU)
The central processing unit (CPU), commonly called processor, is an integrated circuit that executes programs. The CPU is the most important part of the computer; it performs input/out, math, and logical operations in order for programs to run.
Computers need to be able to store information that can be quickly accessed for use in programs. This is where memory, particularly the different kinds of RAM (random access memory) come into play.
Not all data needs to be accessed immediately or is needed for a program to run. Storage provides a way to store data for longer periods of time. It also allows us to create more complex sets of programs like operating systems, which are way too big to economically keep in memory. Storage devices include hard disk drives (HDD) as well as newer, faster solid state drives (SSD).
A computer needs power. More than that, it needs a steady source of high quality power that will stay constant and won’t wreak havoc on all of the sensitive components. That’s where the power supply comes in.
The motherboard is a printed circuit board (PCB) that functions as the central hub of data flow in a computer. You can think of the mother board as a circuit board that everything else gets plugged into. The CPU, memory, storage, graphics card, power supply are all connected to the motherboard either directly or with a plug.
A computer doesn’t do any good if you can’t interact with it. That’s where peripheral devices come in. Peripheral devices include input devices like a mouse and keyboard, as well as output devices like a screen, projector, or printer.
So far we’ve covered the physical components of computers; the physical components make up the hardware of the computer system.
Everything that is not physical hardware is classified as software. This includes the programs, data, protocols, and applications that we, as users, interact with on the computer.
Assembly and Machine Code
How does the software actually interact with the hardware?
Computers rely on the concept of abstraction in order to build projects of increasingly greater complexity.
At the lowest level, the processor only has a small number of things that it actually does with data, like move data from one position to another or add two numbers together.
The actual ‘0’s and ‘1’s, called bits, represent the actual machine code that gets processed by the computer.
Instead of having to work with ‘1’s and ‘0’s, processors have an assembly language that gives programmers one layer of abstraction from the machine code. Assembly is relatively readable but still very limited in what it can do by itself because allows programmers to interface directly with the processor.
Other programming languages (such as C) are then built directly on top of the assembly language. Using the relatively small number of operations that we can do in Assembly, we can now do a much larger number of operations with a more complex programming language. The only downside is that we are no longer interfacing directly with hardware.