2009-10-18 35 views
13

Tôi hiểu ý nghĩa của việc truy cập vào bộ nhớ sao cho phù hợp nhưng tôi không hiểu tại sao điều này là cần thiết. Ví dụ: tại sao tôi có thể truy cập một byte đơn lẻ từ địa chỉ 0x…1 nhưng tôi không thể truy cập một nửa từ (hai byte) từ cùng một địa chỉ.Hiểu liên kết từ

Một lần nữa, tôi hiểu rằng nếu bạn có địa chỉ A và đối tượng có kích thước s thì quyền truy cập được căn chỉnh nếu A mod s = 0. Nhưng tôi không hiểu tại sao điều này lại quan trọng ở cấp độ phần cứng.

Trả lời

26

Phần cứng phức tạp; đây là một lời giải thích đơn giản.

Máy tính hiện đại điển hình có thể có bus dữ liệu 32 bit. Điều này có nghĩa rằng bất kỳ tìm nạp nào mà CPU cần làm sẽ lấy tất cả 32 bit của một địa chỉ bộ nhớ cụ thể. Vì bus dữ liệu không thể tìm nạp bất kỳ thứ gì nhỏ hơn 32 bit, nên hai bit địa chỉ thấp nhất thậm chí không được sử dụng trên bus địa chỉ, vì vậy nó giống như RAM được sắp xếp thành chuỗi 32 bit từ thay vì 8- bit byte.

Khi CPU thực hiện tìm nạp một byte, chu trình đọc trên bus sẽ tìm 32 bit và sau đó CPU sẽ loại bỏ 24 bit đó, tải 8 bit còn lại vào bất kỳ thanh ghi nào. Nếu CPU muốn lấy một giá trị 32 bit đó là không xếp trên một ranh giới 32-bit, nó có nhiều lựa chọn chung:

  • thực hiện hai chu kỳ đọc riêng biệt trên xe buýt để tải những phần thích hợp của từ dữ liệu và ghép lại chúng
  • đọc từ 32 bit tại địa chỉ được xác định bằng cách vứt bỏ hai bit thấp của địa chỉ
  • đọc một số kết hợp byte bất ngờ được lắp ráp thành từ 32 bit, có thể không phải là từ bạn muốn
  • ném một ngoại lệ

CPU khác nhau mà tôi đã làm việc với đã lấy tất cả bốn trong số các đường dẫn đó. Nói chung, để có khả năng tương thích tối đa, an toàn nhất là căn chỉnh tất cả các lần đọc n bit thành ranh giới n-bit. Tuy nhiên, bạn chắc chắn có thể thực hiện các lối tắt nếu bạn chắc chắn rằng phần mềm của bạn sẽ chạy trên một số gia đình CPU cụ thể với hành vi đọc chưa được biết. Và ngay cả khi đọc unaligned là có thể (chẳng hạn như trên x86 gia đình CPU), họ sẽ chậm hơn.

+0

http://www.ibm.com/developerworks/library/pa-dalign/ – KawaiKx

+0

* hai bit địa chỉ thấp nhất thậm chí không được sử dụng trên bus địa chỉ * Nếu vậy thì cách địa chỉ 32 bit được giải quyết với chỉ 30 bit? Đúng nếu tôi đã sai lầm. –

7

Máy tính luôn đọc trong một số khối kích thước cố định được căn chỉnh.

Vì vậy, nếu bạn không căn chỉnh dữ liệu của mình trong bộ nhớ, bạn sẽ phải đọc nhiều lần.

Ví dụ

  • kích thước chữ là 8 byte
  • cấu trúc của bạn cũng là 8 byte
  • nếu bạn sắp xếp nó, bạn sẽ phải đọc một đoạn
  • nếu bạn don' Để căn chỉnh nó, bạn sẽ phải đọc hai đoạn

Vì vậy, về cơ bản nó sẽ tăng tốc.

-1

Tôi có câu hỏi rất cơ bản (có thể câm) ở đây: Tại sao bộ nhớ này không được căn chỉnh ở vị trí đầu tiên? Ý tôi là, nếu bạn đang đọc và ghi dữ liệu cho máy đã cho, bạn sẽ tuân thủ các quy tắc căn chỉnh của nó. Trên hệ thống 32 bit, tôi sẽ đảm bảo ghi dữ liệu được căn chỉnh 32 bit.

Điều đó có liên quan gì đến việc sắp xếp byte mạng không?

+0

Đây là một câu hỏi lý thuyết. – ChrisDiRulli

+1

Nó không có gì để làm với thứ tự byte mạng. Lý do cho điều này là dữ liệu phải được lưu trữ trong L1- (Dữ liệu) -Cache, ond mỗi Dòng bộ nhớ cache có kích thước 64 Byte (nó có thể khác với Kiến trúc khác nhưng các quy tắc đều giống nhau) , vì vậy nếu bạn cố gắng lưu nó trên ranh giới của một dòng Cache, hai dòng phải được đọc và viết bởi vì chúng đã được sửa đổi, và điều này gây ra một hit hiệu suất gia tăng. Do dữ liệu này phải được căn chỉnh trên "đường biên". – Quonux

0

Thử đọc một cổng nối tiếp. Dữ liệu rộng 8 bit. Nhà thiết kế phần cứng tốt đẹp đảm bảo nó nằm trên một byte ít quan trọng nhất của từ đó.

Nếu bạn có cấu trúc C có các phần tử không được căn chỉnh từ (tương thích ngược hoặc bảo toàn bộ nhớ) thì địa chỉ của bất kỳ byte nào trong cấu trúc không được căn chỉnh từ.

2

Lý do cho tất cả các quy tắc căn chỉnh là các chiều rộng khác nhau của Cache Line (Instruction-Cache) có 16 Byte lines cho Core2 Architecture và Data-Cache có 64-Byte Lines cho L1 và 128- Byte Lines cho L2).

Vì vậy, nếu bạn muốn lưu trữ/tải dữ liệu vượt qua ranh giới Cahce-Line bạn cần tải và lưu trữ cả hai dòng Cache, truy cập hiệu suất. Vì vậy, bạn chỉ cần không làm điều đó vì hit hiệu suất, nó đơn giản.

+1

bạn có thể xây dựng câu trả lời của mình nhiều hơn không? Nghe thú vị. bộ vi xử lý hiện đại hiếm khi giải quyết bộ nhớ trực tiếp. những gì họ thực sự tìm nạp dữ liệu từ bộ nhớ cache. Vậy sự liên kết từ nên có gì để làm với bộ nhớ cache chỉ? cảm ơn nhiều – KawaiKx

Các vấn đề liên quan