Máy tính hoạt động như thế nào: Giải thích từ cấp thấp nhất
Bắt đầu với một lần nhấn phím
Bạn nhấn chữ ‘A’ trên bàn phím.
Trong vòng chưa đầy 1 mili giây, ký tự xuất hiện trên màn hình.
Có vẻ đơn giản? Trên thực tế, trong 1 mili giây đó, một tín hiệu điện đi qua ít nhất 6 lớp trừu tượng hóa, đi qua hàng chục thành phần phần cứng, và vượt qua nhiều bus để hoàn thành tương tác “đơn giản” này.
Bản chất của máy tính không phải là tính toán, mà là trừu tượng hóa.
Mỗi lớp ẩn đi sự phức tạp bên dưới và chỉ để lộ một giao diện sạch sẽ cho lớp phía trên. Chính nhờ những lớp trừu tượng này mà lập trình viên có thể viết mã bằng ngôn ngữ cấp cao mà không cần quan tâm đến cách các electron chảy qua bóng bán dẫn.
Hôm nay, chúng ta theo dõi hành trình hoàn chỉnh của một tín hiệu nhấn phím, xem cách máy tính, qua từng lớp trừu tượng hóa, biến một hành động vật lý thành một ký tự trên màn hình.
Lớp thứ nhất: Từ tín hiệu vật lý đến mã quét

Thứ bạn nhấn không phải là một chữ cái, mà là một công tắc.
Bên dưới mỗi phím trên bàn phím là một công tắc cơ học. Khi bạn nhấn phím ‘A’, công tắc đóng lại và dòng điện chạy qua. Đây là thực tế vật lý thấp nhất — chỉ có đóng và mở, không có ‘A’.
Nhiệm vụ của bộ điều khiển bàn phím là dịch tín hiệu vật lý này thành những con số mà máy tính có thể hiểu.
Nó làm điều đó như thế nào?
Quét ma trận
Hơn 100 phím trên một bàn phím. Nếu mỗi phím có một dây riêng kết nối với máy tính, dây cáp bàn phím sẽ dày hơn ngón tay của bạn. Vì vậy, bàn phím sử dụng một thiết kế thông minh: quét ma trận.
Hãy tưởng tượng một bàn cờ, với các đường hàng và đường cột giao nhau. Mỗi phím nằm tại một điểm giao nhau. Bộ điều khiển nhanh chóng cấp điện cho từng hàng và phát hiện xem có dòng điện trên mỗi cột hay không. Nếu cột 5 phát hiện dòng điện khi hàng 3 được cấp điện, điều đó có nghĩa là phím ở hàng 3, cột 5 đã được nhấn.
Đây là nơi mã quét (scan code) ra đời — một con số đại diện cho vị trí của một phím.
Nhấn ‘A’ có thể xuất ra mã quét 0x1E. Nhả ‘A’ ra xuất 0x9E (với một bit cao bổ sung chỉ “nhả”).
Lớp thứ nhất hoàn thành: hành động vật lý → mã hóa kỹ thuật số.
Nhưng chưa kết thúc. Mã quét vẫn còn trong bộ đệm nội bộ của bàn phím, chờ được gửi đi.
Lớp thứ hai: Từ thiết bị I/O đến bộ nhớ

Mã quét cần đến được CPU, nhưng CPU không thể ngồi chờ đầu vào bàn phím.
CPU hoạt động với tốc độ hàng tỷ thao tác mỗi giây; đầu vào bàn phím đến với tốc độ hàng chục đầu vào mỗi giây. Nếu CPU kiểm tra “có đầu vào bàn phím không?” trước mỗi lệnh, 99,9999% thời gian của nó sẽ bị lãng phí.
Giải pháp là gì? Cơ chế ngắt (interrupt).
Ngắt: Phiên bản phần cứng của “gọi tôi khi bạn sẵn sàng”
Triết lý thiết kế của ngắt phản ánh cuộc sống hàng ngày: bạn không gọi cho người giao hàng mỗi 5 phút để hỏi “hàng của tôi đã đến chưa?” Thay vào đó, người giao hàng gọi cho bạn khi họ đến.
Sau khi bộ điều khiển bàn phím tạo ra mã quét, nó gửi một tín hiệu Yêu cầu Ngắt (IRQ) đến CPU.
Tín hiệu này đi qua bộ điều khiển ngắt (8259A hoặc thiết bị tương đương hiện đại) và được gán một số ngắt. Bàn phím thường là IRQ1, số ngắt 0x21.
Sau khi thực thi mỗi lệnh, CPU kiểm tra xem có tín hiệu ngắt không. Nếu có, nó tạm dừng công việc hiện tại và xử lý ngắt.
Bảng vectơ ngắt
Làm thế nào CPU biết cách xử lý một ngắt bàn phím?
Trong bộ nhớ có một Bảng Vectơ Ngắt (Interrupt Vector Table) lưu trữ địa chỉ của chương trình xử lý cho mỗi số ngắt. Nó giống như một danh bạ điện thoại: số ngắt 0x21 tương ứng với địa chỉ của bộ xử lý bàn phím.
Khi CPU nhận được một ngắt bàn phím:
- Đẩy Bộ đếm Chương trình (PC), thanh ghi trạng thái, v.v. vào ngăn xếp
- Tra bảng bằng số ngắt để tìm địa chỉ bộ xử lý
- Nhảy đến bộ xử lý và thực thi nó
Bộ xử lý bàn phím đọc mã quét qua một cổng I/O (thường là 0x60), sau đó lưu nó vào bộ đệm bàn phím trong bộ nhớ.
Lớp thứ hai hoàn thành: sự kiện I/O → dữ liệu trong bộ nhớ.
Bây giờ mã quét đã nằm an toàn trong bộ nhớ. Nhưng nó vẫn là mã quét, không phải ký tự ‘A’.
Lớp thứ ba: Từ mã quét đến ký tự

Mã quét 0x1E đại diện cho “vị trí của phím A trên bàn phím”, không phải ký tự ‘A’.
Tại sao? Vì cùng một phím có thể đại diện cho các ký tự khác nhau trên bàn phím ở các quốc gia khác nhau. Người Mỹ nhấn nó và nhận được ‘A’; người Pháp nhấn nó và nhận được ‘Q’ (bố trí bàn phím của họ khác nhau).
Hệ điều hành chịu trách nhiệm chuyển đổi mã quét thành ký tự.
Hệ thống con đầu vào
Các hệ điều hành hiện đại đều có Hệ thống con Đầu vào (Input Subsystem), xử lý:
- Đọc mã quét từ bộ đệm hạt nhân
- Chuyển đổi chúng thành ký tự dựa trên bố trí bàn phím hiện tại
- Xử lý các phím bổ trợ (Shift+A = ‘A’ hoa, Ctrl+C = lệnh sao chép)
- Phân phối ký tự đến cửa sổ đang hoạt động
Việc chuyển đổi này liên quan đến một bảng ánh xạ bố trí bàn phím. Registry Windows chứa HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts, nơi lưu trữ ánh xạ cho các ngôn ngữ khác nhau.
Sau khi chuyển đổi, ký tự ‘A’ được đặt vào hàng đợi thông điệp, chờ được ứng dụng đọc.
Lớp thứ ba hoàn thành: mã hóa phụ thuộc phần cứng → mã hóa ký tự thống nhất.
Lớp thứ tư: Từ ký tự đến điểm ảnh

Ứng dụng nhận được ký tự ‘A’ và cần hiển thị nó trên màn hình.
Nhưng những gì bạn thấy không phải là ký tự — đó là các điểm ảnh (pixel).
Màn hình chỉ hiểu các điểm ảnh — mỗi điểm có màu gì. Ký tự ‘A’ là một mẫu được tạo thành từ một tập hợp các điểm ảnh, được lưu trữ trong một tệp phông chữ.
Kết xuất phông chữ
Khi bạn gõ ‘A’, ứng dụng sẽ:
- Tìm tệp phông chữ (ví dụ: Microsoft YaHei, SimSun)
- Lấy mô tả glyph cho ‘A’ (đường cong vector hoặc bitmap)
- Thu nhỏ/phóng to glyph theo kích thước phông chữ
- Raster hóa: chuyển đổi các đường cong vector thành lưới điểm ảnh
- Áp dụng khử răng cưa (anti-aliasing) để làm mịn các cạnh
Dữ liệu điểm ảnh này được ghi vào bộ nhớ video (VRAM), tức là bộ nhớ trên card đồ họa.
Từ VRAM đến màn hình
Bộ điều khiển hiển thị trên card đồ họa đọc dữ liệu từ VRAM 60 lần mỗi giây (60Hz), chuyển đổi thành tín hiệu video và gửi đến màn hình.
Màn hình nhận tín hiệu, điều khiển màu sắc của mỗi điểm ảnh, và bạn thấy ký tự ‘A’.
Lớp thứ tư hoàn thành: mã hóa ký tự → ma trận điểm ảnh.
Lớp thứ năm: CPU thực thi các lệnh này như thế nào

Tất cả các thao tác được đề cập ở trên — quét, ngắt, chuyển đổi, kết xuất — cuối cùng phải được CPU thực thi.
CPU thực thi lệnh như thế nào?
Chu kỳ lệnh: Nạp-Giải mã-Thực thi
Việc thực thi một lệnh có ba giai đoạn:
-
Nạp (Fetch)
- Bộ đếm Chương trình (PC) lưu trữ địa chỉ của lệnh tiếp theo
- Gửi địa chỉ đến bộ nhớ, lấy lệnh về
- Lưu lệnh vào Thanh ghi Lệnh (IR)
-
Giải mã (Decode)
- Bộ điều khiển phân tích mã thao tác của lệnh
- Xác định thao tác cần thực hiện (cộng? tải? nhảy?)
- Xác định vị trí của các toán hạng
-
Thực thi (Execute)
- Đơn vị Số học và Logic (ALU) thực hiện tính toán
- Hoặc truy cập bộ nhớ để đọc/ghi dữ liệu
- Cập nhật Bộ đếm Chương trình
Sau đó lặp lại.
Một ví dụ
Giả sử CPU cần thực thi ADD R1, R2, R3 (cộng giá trị trong R2 và R3, lưu vào R1):
- Nạp: Đọc mã máy cho lệnh này từ bộ nhớ
- Giải mã: Nhận ra đây là lệnh cộng, toán hạng trong R2 và R3
- Thực thi: ALU gửi giá trị của R2 và R3 đến bộ cộng, ghi kết quả vào R1
Mỗi lệnh được hoàn thành trong nano giây.
Lớp thứ năm hoàn thành: ngôn ngữ cấp cao → lệnh máy → tín hiệu điện.
Cái giá của trừu tượng hóa
Trừu tượng hóa không miễn phí.
Mỗi lớp trừu tượng đều đi kèm với chi phí hiệu suất:
- Quét bàn phím: vài micro giây
- Xử lý ngắt: hàng chục micro giây
- Chuyển đổi hệ điều hành: hàng trăm micro giây
- Kết xuất phông chữ: vài mili giây
- Ghi VRAM: vài micro giây
Tổng cộng lại, đây là “độ trễ đầu vào” (input lag) mà bạn cảm nhận được, thường từ 10 đến 50 mili giây.
Đối với người bình thường, độ trễ này không đáng kể. Nhưng đối với người chơi thể thao điện tử, đó là sự khác biệt giữa sống và chết. Đó là lý do tại sao họ sử dụng bàn phím cơ (kích hoạt nhanh hơn), màn hình tần số quét cao (144Hz trở lên) và kết nối có dây (không dây thêm độ trễ).
Một điều cần ghi nhớ
Bản chất của máy tính là trừu tượng hóa: đóng gói sự phức tạp, chỉ để lộ giao diện đơn giản.
Hành trình của một tín hiệu nhấn phím:
Công tắc vật lý → mã quét → ngắt → bộ đệm bộ nhớ → mã hóa ký tự → hàng đợi thông điệp → kết xuất phông chữ → VRAM → điểm ảnh
Mỗi lớp chỉ làm một việc: nhận đầu ra đã được đơn giản hóa từ lớp bên dưới, xử lý nó và cung cấp giao diện đơn giản hóa cho lớp bên trên.
Chính sự trừu tượng hóa phân lớp này cho phép con người làm chủ các hệ thống máy tính cực kỳ phức tạp.
Lập trình viên không cần biết cách bàn phím quét hoạt động — họ chỉ cần đọc giá trị trả về của getchar().
Lập trình viên không cần biết cách card đồ họa kết xuất — họ chỉ cần gọi hàm DrawText().
Sức mạnh của trừu tượng hóa là làm cho sự phức tạp trở nên dễ quản lý.
