2011-07-27 25 views
19

tôi giả sử cpu có quyền truy cập trực tiếp vào BIOS và RAM của bo mạch chủ (sửa tôi nếu tôi sai)Làm thế nào để CPU giao tiếp với các thiết bị ngoại vi?

Nhưng cpu giao tiếp với các phần cứng khác như hdd, card mở rộng, thiết bị ngoại vi, các BIOS khác vv.

Tôi biết về hệ điều hành và trình điều khiển của nó, nhưng chúng là phần mềm - chúng nằm trong RAM. Làm thế nào để CPU giao tiếp với tất cả phần cứng này trên cấp phần cứng? Không chỉ giới hạn ở BIOS và RAM của bo mạch chủ?

Trả lời

31

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.

+4

Đâ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

+2

@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

+0

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

0

Điều đó phụ thuộc vào ý bạn là "truy cập trực tiếp". Một lõi CPU giao tiếp với bộ nhớ chính (RAM) trên một bus. (Lõi có thể có nhiều truy cập trực tiếp hơn tới lượng bộ nhớ tương đối nhỏ (bộ nhớ cache hoặc thanh ghi), nhưng đó là một vấn đề khác.) CPU cũng giao tiếp với các thiết bị ngoại vi thông qua xe buýt. Một số loại xe buýt mà bạn có thể đã nghe nói là xe buýt nối tiếp phổ thông (USB, thông thường cho thiết bị bên ngoài), PCI, bus phía trước (một loại bus kết nối lõi CPU và bộ nhớ chính), hoặc Serial-ATA (SATA; thường được sử dụng) cho các thiết bị như đĩa cứng).

ETA: Tôi đã đề cập rằng trong bình luận của tôi bên dưới rằng trình điều khiển thiết bị xử lý giao tiếp mức phần cứng giữa CPU và thiết bị ngoại vi. Cơ chế thực sự của giao tiếp có thể liên quan đến việc sử dụng các phần cụ thể của không gian địa chỉ để chuyển dữ liệu (memory-mapped I/O), để đọc từ hoặc ghi vào một thiết bị giống như truy cập bộ nhớ thông thường. Trình điều khiển thiết bị cũng đề cập đến cách CPU sẽ trả lời interrupts từ một thiết bị.

+0

Nhưng điều gì làm cho nó sử dụng xe buýt, ví dụ: PCI ?? Có một số hướng dẫn lắp ráp đặc biệt mà làm cho xe buýt sử dụng CPU chính xác PCI ?? – DrStrangeLove

+0

Xe buýt được định nghĩa khá rộng rãi. Trên một PC thông thường, CPU sẽ liên lạc với các bus khác nhau thông qua một [chipset] (http://en.wikipedia.org/wiki/Chipset), sử dụng phần mềm [device driver] (http: //en.wikipedia. org/wiki/Device_driver) để kiểm soát phần cứng. –

-4

Giao tiếp CPU với thiết bị ngoại vi (thiết bị I/O) với sự trợ giúp của dây dẫn. Vì tất cả các thiết bị Đầu vào/Đầu ra đều được kết nối với CPU với sự trợ giúp của dây dẫn, các dây này giúp trong việc liên lạc giữa CPU và các thiết bị ngoại vi.

Nhưng bây giờ một thiết bị không dây ngày đã khởi chạy do có thể nói rằng tất cả các giao tiếp ngoại vi với CPU với sự trợ giúp của dây dẫn.

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