Trong các kiến trúc cũ hơn, các thiết bị ngoại vi được truy cập thông qua một cơ chế riêng biệt để truy cập bộ nhớ với các lệnh I/O đặc biệt. Trên x86, đã có (và vẫn còn!) "Trong" và "ra" hướng dẫn để chuyển byte giữa CPU và một thiết bị ngoại vi. Thiết bị ngoại vi được cung cấp địa chỉ, ví dụ 0x80 cho bàn phím. Đơn giản hóa rất nhiều, làm "trong 0x80" sẽ đọc một byte từ bộ điều khiển bàn phím để CPU đăng ký "AL".
Trên kiến trúc hiện đại, thiết bị ngoại vi được truy cập theo cách tương tự như bộ nhớ: thông qua địa chỉ bộ nhớ được ánh xạ trên xe buýt. Bạn không nên nghĩ đến một chiếc xe buýt như một cách để truy cập vào bộ nhớ. Đó là một cách để giải quyết các thiết bị ngoại vi riêng lẻ, trong đó bộ nhớ (RAM/DDR) chỉ là một loại. Ví dụ: bạn có thể có 2GB bộ nhớ RAM tại địa chỉ 0x00000000..0x7fffffff. Sau đó bạn có thể có một card đồ họa tại 0x80000000..0x80001fff. Bộ điều khiển bus (PCIe hoặc bất cứ điều gì) biết phạm vi địa chỉ nào đi đến ngoại vi nào.
Bộ nhớ thường đặc biệt ở chỗ nó có thể được lưu vào bộ nhớ cache, vì vậy mỗi lần đọc/ghi riêng vào bộ nhớ có xu hướng không dịch trực tiếp sang từng lần đọc/ghi vào chip RAM. Các thiết bị ngoại vi được đánh dấu là đặc biệt - các truy cập CPU nên đi ra ngoài ngoại vi chính xác như được viết trong chương trình của bạn.
Ngôn ngữ bạn nói với thiết bị ngoại vi có khá nhiều tùy thuộc vào thiết bị. Chủ đề chung là thiết bị ngoại vi được ánh xạ ở đâu đó trong bộ nhớ (ví dụ: 0x80000000 cho một vài KB như trên), với một chút trạng thái và hành động được điều khiển bởi các từ khác nhau (thường là 32 hoặc 64bit). Ví dụ huyền thoại về cổng nối tiếp tại 0x80000000:
- Viết từ 32 bit 'A' thành 0x80000000, xếp hàng ký tự 'A' trong đầu ra FIFO.
- Viết từ 32 bit 0x1 đến 0x80000004, cho biết cổng nối tiếp gửi hàng đợi của nó.
Một lần nữa, hoàn toàn được tạo ra chỉ vì lợi ích của ví dụ, nhưng một cổng nối tiếp thực (uart) không phải là tất cả những gì khác nhau.
Sự cố là bạn sẽ không thực sự xem bất kỳ bố cục bộ nhớ nào ở trên trong hệ điều hành hiện đại, do bộ nhớ ảo. Các địa chỉ trên sẽ được gọi là "địa chỉ bộ nhớ vật lý" (hoặc địa chỉ xe buýt) - địa chỉ thực tế xuất hiện trên xe buýt. Thay vào đó, CPU nhìn thấy các địa chỉ bộ nhớ ảo. Thiết bị ngoại vi cá nhân sẽ cần phải được ánh xạ vào không gian địa chỉ ảo. Đây là loại phức tạp để giải thích và có lẽ tốt nhất trong một câu hỏi khác, nhưng vấn đề là bạn không thể truy cập một thiết bị ngoại vi bằng địa chỉ vật lý thực tế của nó trong một hệ điều hành hiện đại.
Nguồn
2011-07-28 00:57:13
Đây là một câu trả lời tuyệt vời. Bạn nghĩ loại sách nào có thể rộng hơn một chút và/hoặc sâu hơn về chủ đề này? – Lavya
@JohnRipley Vâng, tôi đồng ý với Lavya. Vui lòng giới thiệu cho chúng tôi một số nguồn tốt nơi bạn đã học được những điều này. – Utku
Cảm ơn rất nhiều. Tôi không làm việc ở cấp hạt nhân ngay bây giờ, nhưng tôi thú vị trong một điều. Nếu nói về kiến trúc i386 phổ biến nhất. Tôi không nhớ bất cứ điều gì đặc biệt trong thông tin phân đoạn định dạng của GDTR, LDTR liên quan đến những thứ như "lập bản đồ phân đoạn này hoặc các trang tới bộ nhớ thiết bị này" .... Có vẻ như nó phải được định cấu hình thông qua nói chuyện với bộ điều khiển bộ nhớ lệnh đặc biệt để cấu hình nó? – bruziuz