64 bit? 32 bit?


Mỗi khi cài đặt Windows, Linux, các phần mềm, ta lại nghe đến khái niệm 32bit hoặc 64bit, vậy chúng là gì? Ta cùng tìm hiểu xem nhé.

👉 Bộ nhớ máy tính:Bộ nhớ máy tính là một dãy byte liên tiếp được sắp xếp từ vị trí 0, sau đó tăng dần, byte kế tiếp nằm ở vị trí 1, rồi 2, 3, 4…, mỗi byte có thể được truy xuất thông qua vị trí, hay còn gọi là địa chỉ. Như vậy byte đầu tiên sẽ có địa chỉ 0, byte thứ 1000 có địa chỉ 999. Để truy xuất vào 1 byte nào đó ta cần biết địa chỉ của nó.

👉 Thanh ghi trong máy tính:Thanh ghi là các vùng bộ nhớ nhỏ trong CPU, được dùng lưu trữ dữ liệu để làm việc, ta có thể coi nó giống như các tờ giấy note nhỏ CPU sử dụng trong lúc làm việc. Có nhiều thanh ghi khác nhau, mỗi thanh sẽ có tên và nhiệm vụ riêng, một số thanh ghi bạn có thể dùng lưu trữ chung như AL, AH, AX, EAX, EBX, ECX… một số khác được sử dụng cho một mục đích cụ thể: IP lưu địa chỉ lệnh kế tiếp sẽ được thực hiện, SP chỉ đến stack, CS, DS, ES… chỉ đến các phân đoạn (segment) bộ nhớ… Các thanh ghi có đuôi L (low) và H (high) là các thanh ghi 8 bit, vốn là 2 nửa của các thanh ghi đuôi X, AL và AH chính là 2 phần của AX, tương tự cho BX, CX… Vì là hai nửa cao và thấp nên thay đổi giá trị của AL hoặc AH cũng làm thay đổi AX. Tưởng tượng AL có giá trị là 0x20, AH là 0xFF, thì AX sẽ có giá trị là 0xFF20.

Các thanh ghi AX, BX,CX, DX, IP, SP… là các thanh ghi 16 bit, tức giá trị tối đa nó có thể chứa là 65535.

👉 Thanh ghi IP: Như đã nói ở trên, IP dùng để chứa địa chỉ mà CPU sẽ đọc code để thực hiện, tức muốn máy tính thực hiện lệnh gì, bạn sẽ đọc lệnh đó vào bộ nhớ (tất nhiên vào một địa chỉ nào đó), rồi đặt địa chỉ của lệnh đó vào thanh ghi IP. CPU sẽ đọc và thực thi lệnh tại địa chỉ mà IP đang chứa.Thanh ghi IP là thanh ghi 16 bit, vậy ta chỉ có thể thực thi được các lệnh nằm trong khoảng 0 đến 65535 (64KB) mà thôi. Kết hợp với thanh ghi phân đoạn CS, CPU sẽ truy cập được vào 1MB bộ nhớ.Vì 1 đoạn 64KB quá nhỏ, nên sau này người ta mở rộng IP thêm 16 bit nữa, đặt tên nó là EIP, phần 16 bit thấp của EIP chính là IP. Vậy ta có EIP là thanh ghi 32 bit, dùng EIP ta có thể thực thi được các lệnh trong 1 đoạn dài tới 32 bit địa chỉ (4GB).Sau một thời gian nữa, người ta thấy 4GB lại chật, vậy là tiếp tục mở rộng EIP thêm gấp đôi, gọi là thanh ghi RIP, phần 32 bit phía dưới của RIP cũng chính là EIP. Còn RIP là thanh ghi 64 bit.

Ta thấy kích cỡ của IP (hay EIP, RIP) sẽ quyết định được việc bạn có thể truy cập được vào vị trí nào trong bộ nhớ để thực thi lệnh.

👉 Còn nhiều thanh ghi khác nữa: Ngoài IP kể trên, ta còn một số thanh ghi địa chỉ khác, vì ngoài nhu cầu biết vị trí chuẩn bị thực thi, ta còn có nhu cầu đọc/ghi dữ liệu trong bộ nhớ, hay đọc dữ liệu trong stack, vv và vv… Vậy nên ta sẽ có thêm vài thanh ghi như ESP, ESI, EDI, chúng sẽ có kích cỡ bằng với IP/EIP/RIP luôn.Các phép tính số nguyên được thực hiện bởi CPU (cộng, trừ, nhân, chia) sẽ được thực hiện trên các thanh ghi, ví dụ CPU sẽ quy định muốn thực hiện phép cộng a + b, ta sẽ phải lưu a vào thanh ghi EAX, b vào EBX, rồi lưu tổng vào lại EAX. Do vậy kích cỡ thanh ghi cũng quy định kích cỡ của các số nguyên mà các CPU sử dụng để thực hiện các phép toán.Đây chính là lý do tại sao kiểu int khi viết ứng dụng 16 bit thì có kích cỡ 16 bit, còn khi dịch và chạy trên 32 bit lại có kích cỡ 32 bit.

👉 Nhưng tôi chỉ có 32GB RAM??? Ta thấy thanh ghi RIP có kích cỡ tới 64 bit, tức nó có thể truy xuất đến 2 mũ 64, tức hơn 18 tỷ GB, hơn rất nhiều so với lượng RAM thực tế có trong máy tính, vậy điều gì xảy ra nếu ta ra lệnh máy tính truy cập vào một vùng nhớ không có sẵn?

Địa chỉ mà ta nói ở trên gọi là địa chỉ ảo, khi sử dụng nó sẽ ánh xạ từ địa chỉ ảo vào địa chỉ thực tế, nó có thể ánh xạ vào ROM, vào RAM, dù các phần bộ nhớ này thực tế được lưu trữ ở những chỗ khác nhau. Hệ điều hành sẽ quản lý việc này, mỗi khi một chương trình xin cấp phát bộ nhớ, nó sẽ ánh xạ một vùng trống trong RAM vào địa chỉ nào đó chưa dùng, rồi đưa cho chương trình của bạn dùng, nếu không có chỗ nào trống, nó sẽ tìm phần nào lâu không dùng ghi ra file trên đĩa, ta gọi là paging file, rồi cấp phát vùng nhớ đó.

❗️ TỔNG KẾT

– Các CPU có các thanh ghi 64 bit thì gọi là CPU 64 bit, nếu chỉ có thanh ghi 32 bit thì là CPU 32 bit.

– Các phần mềm và hệ điều hành 32 bit hoàn toàn chạy được trên CPU 64 bit, nhưng ngược lại thì không được.

Ghi chú:

– Bạn không thể thay đổi giá trị của IP, EIP, RIP bằng cách gán giá trị cho nó, kiểu như IP = 100, bạn phải dùng một lệnh nào đó như JMP, CALL, INT, RET… để thay đổi.

– Cú pháp 0x để biểu thị số đang được viết ở dạng thập lục phân.

– Việc quản lý bộ nhớ đi vào chi tiết rất phức tạp, bài viết này chỉ tập trung cố gắng giúp mọi người hiểu sự khác nhau cơ bản giữa các khái niệm 32bit và 64bit.

No photo description available.
No photo description available.
No photo description available.
No photo description available.

One thought on “64 bit? 32 bit?

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s