Sự khác biệt giữa truy cập ánh xạ cổng và ánh xạ bộ nhớ?


19

Bất cứ ai cũng có thể giải thích sự khác biệt giữa ánh xạ cổng và ánh xạ bộ nhớ, và những gì có cả hai đều hoàn thành? Tại sao có bản đồ cổng, nó có cấu trúc khác với bản đồ bộ nhớ như thế nào và có lý do nào nhiều kiến ​​trúc sử dụng cả hai không? Ngoài ra, "cổng" theo nghĩa này là gì, bởi vì cổng có thể có nghĩa là những thứ khác nhau trong các bối cảnh khác nhau?

Ví dụ: Chuyển tiếp cổng, cổng làm điểm cuối truyền thông, "ánh xạ cổng".

Nói rằng tôi viết OUT tới cổng 400h (giả tưởng; chẳng hạn) (như trong x86-64, v.v.).

Tôi đang viết cái gì hoặc ở đâu nếu nó không có trong bộ nhớ? Làm thế nào là một "cổng" được ánh xạ, và nó có nghĩa gì?



Câu trả lời:


24

I / O được ánh xạ bộ nhớ và I / O được ánh xạ cổng là hai phương thức bổ sung cho I / O.

I / O được gắn bộ nhớ

Trong các hệ thống ánh xạ bộ nhớ, thiết bị I / O được truy cập giống như nó là một phần của bộ nhớ. LoadStorecác lệnh được thực thi để đọc và ghi vào các thiết bị I / O, giống như chúng được sử dụng cho bộ nhớ (ánh xạ cổng có các lệnh đặc biệt cho I / O). Điều này có nghĩa là các thiết bị I / O sử dụng cùng một bus địa chỉ với bộ nhớ, nghĩa là CPU có thể tham chiếu đến bộ nhớ hoặc thiết bị I / O dựa trên giá trị của địa chỉ. Cách tiếp cận này yêu cầu cách ly trong không gian địa chỉ: nghĩa là, các địa chỉ dành riêng cho I / O không nên có sẵn cho bộ nhớ vật lý.

Dưới đây là hình ảnh của một hệ thống máy tính đơn giản, cơ bản . Trường hợp phức tạp hơn nhiều trong các hệ thống đương đại.

nhập mô tả hình ảnh ở đây


Cổng I / O đã ánh xạ

Theo Wikipedia

I / O được ánh xạ cổng thường sử dụng một lớp hướng dẫn CPU đặc biệt để thực hiện I / O. Điều này được tìm thấy trên các bộ vi xử lý Intel, với các hướng dẫn IN và OUT. Các hướng dẫn này có thể đọc và ghi một đến bốn byte (outb, outw, outl) vào thiết bị I / O. Các thiết bị I / O có một không gian địa chỉ riêng biệt từ bộ nhớ chung, được thực hiện bằng một pin "I / O" bổ sung trên giao diện vật lý của CPU hoặc toàn bộ một bus dành riêng cho I / O. Vì không gian địa chỉ cho I / O được tách biệt với không gian cho bộ nhớ chính, nên đôi khi nó được gọi là I / O bị cô lập.


Đối với những lợi thế và bất lợi: vì các thiết bị ngoại vi chậm hơn bộ nhớ, việc chia sẻ dữ liệu và bus địa chỉ có thể làm chậm việc truy cập bộ nhớ. Mặt khác, do các hệ thống ánh xạ bộ nhớ đơn giản I / O cung cấp, CPU yêu cầu ít logic bên trong hơn và điều này giúp cho các CPU nhanh hơn, rẻ hơn, tiêu thụ ít năng lượng hơn được thực hiện. Logic tương tự như các hệ thống RISC: giảm độ phức tạp, lấy một hệ thống chuyên dụng hơn và mạnh mẽ hơn, khá tiện dụng cho các hệ thống nhúng, chẳng hạn.

Ngược lại (một lần nữa từ Wiki):

Các lệnh I / O được ánh xạ cổng thường rất hạn chế, thường chỉ cung cấp cho các hoạt động tải và lưu trữ đơn giản giữa các thanh ghi CPU và cổng I / O, do đó, để thêm một hằng số vào thanh ghi thiết bị được ánh xạ cổng sẽ cần ba hướng dẫn: đọc cổng vào thanh ghi CPU, thêm hằng số vào thanh ghi CPU và ghi kết quả trở lại cổng.

Tôi thực sự khuyên bạn nên đọc bài viết wiki đó để biết thêm thông tin.


Để trả lời một trong những câu hỏi của bạn:

Tôi đang viết cái gì hoặc ở đâu nếu nó không có trong bộ nhớ?

Bạn đang ghi vào các thanh ghi của giao diện I / O thông qua bus dữ liệu, sau này (khi sẵn sàng) sẽ gửi dữ liệu đến thiết bị I / O thực tế. Dưới đây là hình ảnh của một giao diện thiết bị I / O mẫu.

nhập mô tả hình ảnh ở đây


Điều này có nghĩa là gì mà bạn viết cho bộ nhớ được ánh xạ "Cách tiếp cận này yêu cầu sự cô lập trong không gian địa chỉ: nghĩa là, các địa chỉ dành riêng cho I / O không nên có sẵn cho bộ nhớ vật lý." Bạn có nghĩa là địa chỉ dành riêng cho I / O nằm trong bộ nhớ chính và không có sẵn cho không phải I / O. Rõ ràng các địa chỉ IO và địa chỉ không phải IO là bộ nhớ vật lý. Không có thứ gọi là bộ nhớ không phải là vật lý. (trừ khi bạn là người tin vào các lập luận của william lane craig, tức là một vật có thể có bộ não và trí nhớ phi vật lý!).
barlop

1
và khi bạn viết điều này "Bạn đang ghi vào các thanh ghi của giao diện I / O thông qua bus dữ liệu, sau này (khi sẵn sàng) sẽ gửi dữ liệu đến thiết bị I / O thực tế. Dưới đây là hình ảnh của một I / O ví dụ thiết bị. " Bạn không rõ liệu "đăng ký" IO có trong thiết bị hay không, tôi cho rằng nếu bạn gọi nó là đăng ký thì có vẻ như nó có trong thiết bị. Nhưng sau đó bạn viết ".. sau này (khi đã sẵn sàng) sẽ gửi dữ liệu đến thiết bị I / O thực tế" Vì vậy, không rõ bạn đang nói những vị trí bộ nhớ này ở đâu. Cho dù chúng ở trong thiết bị, hoặc bên ngoài thiết bị .. hoặc bao giờ bên ngoài thiết bị.
barlop

1
Cảnh giác: Tôi đã biên soạn những thứ đó từ những gì tôi học được trong bài giảng Vi xử lý và một số từ Wiki. Nói như vậy, ý tôi muốn nói trong bình luận đầu tiên của bạn là: "Địa chỉ IO và địa chỉ không phải IO là bộ nhớ vật lý" không rõ ràng như bạn nghĩ. Trên thực tế (theo như tôi biết, theo như tôi được dạy), bộ giải mã mã địa chỉ kích hoạt giao diện IO khi địa chỉ IO được chỉ định, nghĩa là khi bạn cung cấp địa chỉ, nó không nên nằm trong phạm vi địa chỉ vật lý, ví dụ: , $ 0000 - $ 00FF cho vật lý và $ 0100 - $ 01FF cho IO (bỏ qua số tiền, chỉ quan tâm đến ranh giới).
Varaquilex

@barlop Đối với câu hỏi thứ hai của bạn, bạn ở ngay đây, ý tôi là "Dưới đây là hình ảnh của một ví dụ về giao diện thiết bị I / O ". Tôi đã sửa lỗi này trong chỉnh sửa tôi vừa thực hiện. Tôi hy vọng rằng chỉnh sửa đã loại bỏ sự nhầm lẫn. Nếu không, hãy hỏi thêm. Tôi sẽ cố gắng trả lời tốt nhất có thể.
Varaquilex

1
@barlop Điểm của vị trí của bộ nhớ là mơ hồ trong hầu hết các bài viết và tài liệu tôi đã đi qua. Hoặc họ cho rằng bạn đã biết, hoặc họ không thực sự biết. Tôi tin rằng câu trả lời là trong những từ này từ LDD3 ch. 9: "Bộ nhớ I / O chỉ đơn giản là một vùng các vị trí giống như RAM mà thiết bị cung cấp cho bộ xử lý trên xe buýt." (in nghiêng thêm) Tức là bộ nhớ và / hoặc thanh ghi trên thiết bị. Cổng I / O và bộ nhớ I / O chỉ là 2 cách mà hệ thống cung cấp cho các vị trí đó có sẵn cho phần mềm.
orodbhen

2

Trong I / O được ánh xạ bộ nhớ (đơn giản là MMIO), các thiết bị được truy cập thông qua các hướng dẫn thực sự có nghĩa là để truy cập bộ nhớ. Mỗi thiết bị được một số địa chỉ bộ nhớ nhất định. Tuy nhiên, khi bạn cố đọc hoặc ghi vào phần này của bộ nhớ, một thiết bị nhất định (có thể là cầu bắc) chỉ gửi nó đến thiết bị liên quan thay thế. Ngay cả khi máy tính không có đủ bộ nhớ cho một địa chỉ như vậy (vì địa chỉ MMIO thường rất cao), thì nó cũng không quan trọng bằng bộ nhớ vật lý (đó là bộ nhớ bạn nhìn thấy khi nhìn vào bo mạch chủ, một địa chỉ được gọi là RAM ) thậm chí không liên quan. Nếu bạn có đủ RAM cho địa chỉ, nó sẽ được ánh xạ tới một địa chỉ không phải I / O cao hơn hoặc bị mất nghĩa là bạn không thể đọc hoặc ghi vào đó.

I / O Port-Mapped (đơn giản là PMIO) rất khác nhau. Bạn có các hướng dẫn khác nhau được sử dụng để đọc và ghi vào cổng. Có một không gian địa chỉ cổng giống như không gian địa chỉ bộ nhớ trong đó các địa chỉ là địa chỉ I / O thực sự giao tiếp với các thiết bị hoặc không hợp lệ. PMIO về cơ bản có thể được coi là một MMIO với không gian địa chỉ bộ nhớ riêng biệt chỉ dành cho I / O.


"PMIO về cơ bản có thể được coi là một MMIO với không gian địa chỉ bộ nhớ riêng biệt chỉ dành cho I / O." - Không gian địa chỉ là một khái niệm đơn giản và cơ bản như vậy, tại sao bạn giải quyết một sự tương tự sai lệch với câu trả lời hợp lý khác của bạn? Sự tương tự sai lệch đó không thay đổi sự thật: ví dụ: có thể có các không gian địa chỉ khác bên cạnh một "không gian địa chỉ bộ nhớ".
mùn cưa

1

Với các tên như 'Tín hiệu I / O' và 'ánh xạ bộ nhớ', mọi thứ trở nên phức tạp hơn nhiều so với thực tế, và do đó mang lại cho người đó ấn tượng về nó nhiều hơn và nó bao quát một chủ đề nâng cao. Xu hướng bây giờ là mọi người xem nó như một cái gì đó mới. Nhưng điều này là rất xa trường hợp. Ngay cả Babbage trong những năm 1830 đã lái máy in của mình, điều này cần tín hiệu I / O, mặc dù được thực hiện bởi một sợi trục và bánh răng. Ví dụ, trong các cỗ máy của Hero of Alexandria 2000 năm trước hoặc tại các rạp chiếu từ thời Hy Lạp, họ luôn kéo một sợi dây từ một bộ dây khác nhau để điều khiển đèn hoặc cảnh vật, mỗi sợi dây giống như một đường đầu vào và đầu ra, nó giống như đơn giản như vậy, địa chỉ là 'dòng nào', tức là thứ, bộ nhớ hoặc thiết bị chúng ta đang chọn,

Mặc dù các máy tính lớn của máy tính lớn chứa đầy các tòa nhà với tủ, đã sử dụng những thứ như 64bit ngay từ những năm 40, và do đó đã xử lý ánh xạ I / O giống hệt cách đây rất lâu rồi, e..g Konrad Zuse và máy tính có kích thước phòng của anh ta đã sử dụng nổi điểm có khoảng 20 chữ số thập phân trong những năm 1930, và phải lái những thứ như máy in của anh ấy và các chỉ số bóng đèn khác nhau và công tắc của anh ấy. Nhưng trên các bộ vi xử lý nhỏ, câu chuyện khác nhau, chúng không được hình dung cho đến những năm 60 và được xây dựng cho đến năm 1971. Tất cả các kỹ thuật này sử dụng logic 8 bit trong thập niên 80, đã được sử dụng cho các bộ vi xử lý trong 4 bit trong 70, 2 bit trong 60 và được sử dụng trong 16 bit trong 90 ' s khi mọi người bắt đầu có được một chiếc máy tính và vì thế bây giờ trước mặt họ bắt đầu thảo luận về chủ đề lập bản đồ bộ nhớ và bộ nhớ này lần đầu tiên, và nó dường như là một cái gì đó mới xuất hiện trên internet; sau đó chúng tôi có 32 bit trong các máy tính 00 và 64 bit trong 10 giây, điều này gây ra những cuộc thảo luận vô tận về bộ nhớ xuống các dòng dữ liệu. Để trả lời câu hỏi của bạn, tôi sẽ nói về những con chip mà những người có sở thích điện tử đã mua cách đây 30 - 40 năm, như tôi đã làm vào thời điểm đó, kể từ sau này, mọi thứ trở nên tiên tiến đến mức tôi không thể xây dựng với những con chip sau này, nhưng Các nguyên tắc cũng giống như bây giờ, các cổng chỉ được ẩn bên trong các chip hộp đen lớn hơn kết hợp các chân khác xử lý các hoạt động này diễn ra song song nhiều hơn (ví dụ: cho phép nhiều chốt bát phân,

Chà, tôi không biết gì về tất cả các ngôn ngữ mới hoặc hiện tại nó như thế nào trên máy tính hiện đại nhưng tôi có thể nói cho bạn biết nó đã như thế nào khi tôi sử dụng để xây dựng máy tính với chip.

Tất cả các ánh xạ I / O và ánh xạ bộ nhớ đều có nghĩa đơn giản, là nếu bạn tăng tải một ví dụ về bóng đèn cho một số lễ kỷ niệm và có dây đi đến từng cái và được gọi là bóng đèn Vị trí bộ nhớ, (tức là bóng đèn đại diện cho bộ nhớ trong RAM, hoặc bật hoặc tắt và nếu bạn chọn vị trí 0, bạn nhận được dây 0, vị trí 1, dây 1, dây 2, v.v.) nếu bạn thêm một số dây khác, ví dụ: một dây là chuông, vị trí cụ thể đó không phải là bộ nhớ là một thiết bị mà bạn xuất ra, sử dụng lệnh OUT, để làm cho nó đổ chuông. Nhưng nó được xem như là một vị trí bộ nhớ theo quan điểm của máy tính, bởi vì nó đi vào như một sợi dây cho MPU giống nhau. Nếu một dây khác được thêm vào, đó là một công tắc mà bạn hoạt động bên ngoài, thì đây là một thiết bị I / O, đó sẽ là một lệnh IN cho máy tính. Vì vậy, đây được gọi là I / O ánh xạ I / O.

Bây giờ trên máy tính, dây trên xe buýt đại diện cho dòng địa chỉ hoặc dòng dữ liệu, NHƯNG chúng ở dạng nhị phân, tức là với 2 dây bạn có thể có 00 01 10 11 tức là 4 kết hợp 2 ^ 2, vì vậy với 8 dòng 2 ^ 8 = 256 khả năng, với 20 dòng 2 ^ 20 = 1048576 với 30 dòng 2 ^ 30 = 1073741824 (1 gig) khả năng với 30 dòng. Vì vậy, đây là lý do tại sao nó được gọi là MAPPED, thay vì chỉ nói I / O và bộ nhớ, họ đang nói I / O được ánh xạ và ánh xạ bộ nhớ, bởi vì bạn đang ánh xạ các dây NHƯ MỘT COMBINATION y mã hóa chúng. Vì vậy, nếu nói rằng bạn có 2 dây, 4 kết hợp, chúng không thể được kết nối với bóng đèn, (chưa kể đến sự khuếch đại hiện tại được yêu cầu từ các điện áp nhỏ từ MPU và ngăn chặn dòng phản hồi), nhưng 2 dây có để đi qua bộ giải mã (chúng ta thường sử dụng 138 để giải mã 3 dòng thành 8 dòng, 164 để giải mã 4 dòng nhị phân thành 16 dòng. ) Một lần thông qua bộ giải mã 2 dòng này, ví dụ A0 và A1 (địa chỉ0 và địa chỉ 1 (LINES)), trở thành 4 dòng (bật hoặc tắt) cho bóng đèn cụ thể mà bạn đang lái xe (trong trường hợp trên máy tính, BỘ NHỚ), nhưng trong một số trường hợp, vị trí này thay vào đó chọn một số thiết bị đầu vào / đầu ra và nói 'sử dụng tôi' thay vào đó, như bộ nhớ, khi được định vị, dữ liệu sẽ được truyền theo cách này hay cách khác (sử dụng logic ba trạng thái thông minh để cắt điện áp trên đường mỗi lần) trên các tuyến bus dữ liệu D0..7 hoặc D0..31 hoặc bất kỳ kích thước nào dữ liệu trên máy tính (bạn có 2 bit, 4 bit, 8 bit, 16 bit, 32 bit, 64 bit, 128 bit, 256 bit, máy tính, bất cứ điều gì máy tính bạn đang xây dựng). Vì vậy, dữ liệu truyền tự nhiên vào hoặc ra từ các dòng dữ liệu vào bộ nhớ hoặc đến thiết bị I / O (NẾU nó được ánh xạ bộ nhớ), nhưng NÀY KHÔNG NÊN ĐƯỢC XÁC NHẬN với các hướng dẫn IN / OUT, IN và OUT NÀY có nghĩa là từ một số khối bộ nhớ I / O KHÁC, khối bộ nhớ I / O đặc biệt bên trong MPU được gán đặc biệt chỉ dành cho I / O, tức là (không được ánh xạ bộ nhớ), không gian I / O này bạn không nhận được trên một số bộ vi xử lý, ví dụ tôi không nghĩ rằng chúng tôi đã có nó trên một chiếc 6502, nhưng chúng tôi đã có nó trên một chiếc z80. Nhiều chip nghệ thuật hơn được sử dụng chỉ là ánh xạ bộ nhớ, ví dụ như trong các máy chơi game, v.v., các chip hợp lý hơn nhưng không thú vị (nằm trong sách) cũng dành cho không gian I / O. Bộ nhớ I / O được ánh xạ là tốc độ sáng vì nó kết hợp địa chỉ bộ nhớ (siêu nhanh cho RAM), do đó máy tính loại đồ họa chỉ sử dụng ánh xạ bộ nhớ cho I / O để lấy tốc độ. I / O được ánh xạ I / O được gán cho các cổng chậm, ví dụ rs 232 hoặc cổng song song và sử dụng các lệnh IN OUT. e. (không được ánh xạ bộ nhớ), không gian I / O này bạn không phải lúc nào cũng có trên một số bộ vi xử lý, ví dụ tôi không nghĩ rằng chúng tôi đã có nó trên một chiếc 6502, nhưng chúng tôi đã có nó trên một chiếc z80. Nhiều chip nghệ thuật hơn chỉ được sử dụng ánh xạ bộ nhớ, ví dụ như trong các máy chơi game, v.v., các chip hợp lý hơn nhưng không thú vị (nằm trong sách) cũng dành cho không gian I / O. Bộ nhớ I / O được ánh xạ là tốc độ sáng vì nó kết hợp địa chỉ bộ nhớ (siêu nhanh cho RAM), do đó máy tính loại đồ họa chỉ sử dụng ánh xạ bộ nhớ cho I / O để lấy tốc độ. I / O được ánh xạ I / O được gán cho các cổng chậm, ví dụ rs 232 hoặc cổng song song và sử dụng các lệnh IN OUT. e. (không được ánh xạ bộ nhớ), không gian I / O này bạn không phải lúc nào cũng có trên một số bộ vi xử lý, ví dụ tôi không nghĩ rằng chúng tôi đã có nó trên một chiếc 6502, nhưng chúng tôi đã có nó trên một chiếc z80. Nhiều chip nghệ thuật hơn chỉ được sử dụng ánh xạ bộ nhớ, ví dụ như trong các máy chơi game, v.v., các chip hợp lý hơn nhưng không thú vị (nằm trong sách) cũng dành cho không gian I / O. Bộ nhớ I / O được ánh xạ là tốc độ sáng vì nó kết hợp địa chỉ bộ nhớ (siêu nhanh cho RAM), do đó máy tính loại đồ họa chỉ sử dụng ánh xạ bộ nhớ cho I / O để lấy tốc độ. I / O được ánh xạ I / O được gán cho các cổng chậm, ví dụ rs 232 hoặc cổng song song và sử dụng các lệnh IN OUT. hợp lý hơn nhưng không thú vị (ở trong sách) cũng dành cho không gian I / O. Bộ nhớ I / O được ánh xạ là tốc độ sáng vì nó kết hợp địa chỉ bộ nhớ (siêu nhanh cho RAM), do đó máy tính loại đồ họa chỉ sử dụng ánh xạ bộ nhớ cho I / O để lấy tốc độ. I / O được ánh xạ I / O được gán cho các cổng chậm, ví dụ rs 232 hoặc cổng song song và sử dụng các lệnh IN OUT. hợp lý hơn nhưng không thú vị (ở trong sách) cũng dành cho không gian I / O. Bộ nhớ I / O được ánh xạ là tốc độ sáng vì nó kết hợp địa chỉ bộ nhớ (siêu nhanh cho RAM), do đó máy tính loại đồ họa chỉ sử dụng ánh xạ bộ nhớ cho I / O để lấy tốc độ. I / O được ánh xạ I / O được gán cho các cổng chậm, ví dụ rs 232 hoặc cổng song song và sử dụng các lệnh IN OUT.

Bây giờ nếu thay vì thêm hai dây, nếu bạn thực sự thay thế hai dây ban đầu đi vào bóng đèn và lấy một số bóng đèn đó và thay thế chúng bằng những thứ khác, ví dụ như chuông trên một và một công tắc khác, thì bây giờ chúng không được tham chiếu (đã chọn ) với các lệnh IN và OUT tương ứng, chúng được tham chiếu bằng cách truy cập vào vị trí bộ nhớ cụ thể chọn các dây đó (ban đầu là bóng đèn). Vì vậy, đây là bộ nhớ I / O được ánh xạ.

Bộ nhớ I / O được ánh xạ có nghĩa là bus địa chỉ thực thường đi vào bộ nhớ (RAM), cũng được kết nối với bộ giải mã KHÁC (bộ giải mã logic) và khi nó cảm nhận được sự kết hợp nhị phân cụ thể của tín hiệu địa chỉ, nó sẽ tạo ra mức cao đầu ra , (ví dụ: nếu bạn có tải và không phải cổng, và bạn đã nói, nếu điều này và không phải như vậy, bằng cách sử dụng chân A0..A20 hoặc bất kỳ kích thước nào thì bus địa chỉ của bạn), thì tín hiệu cao này TẠO một chốt, (đối với một thiết bị cụ thể, như cổng nối tiếp, cổng song song), chốt này sau đó PASSES dữ liệu trên bus dữ liệu, thông qua thiết bị I / O. Điều này là để ghi vào thiết bị I / O. Việc đọc hoạt động theo chiều ngược lại, thiết bị I / O, chuyển dữ liệu trở lại và nếu tôi nhớ chính xác, nó sẽ gửi chính xác tổ hợp mã địa chỉ tương tự lên các dòng địa chỉ.

Tôi cho rằng, nó phải hoạt động theo cách này giống như ngày hôm nay, ngoại trừ chúng sẽ chỉ là nhiều dòng dữ liệu và địa chỉ.

Bạn thực sự đang DÂY I / O đến các dòng địa chỉ. Do đó, I / O được MAPPED một cách hiệu quả vào không gian bộ nhớ, như thể nó là bộ nhớ. Nhưng một chốt khác vô hiệu hóa các chân địa chỉ truy cập ram cùng một lúc, do đó bạn không nhận được điện áp của hai nguồn địa chỉ hoặc dữ liệu trên cùng một dòng, điều này sẽ làm hỏng chip.

Với hướng dẫn IN và OUT, chúng ta đã có điều này 40 năm trước, trên chip z80. Điều này dành cho các trường hợp đặc biệt trong đó chip thực sự xử lý chính I / O theo một cách khác, tức là nó không được ánh xạ bộ nhớ. (tức là với bộ nhớ được ánh xạ, bạn chỉ cần đọc hoặc ghi vào vị trí bộ nhớ, nhưng với IN và OUT, bạn đã nói với CPU rằng đó là tín hiệu I / O chứ không phải bộ nhớ). Vì vậy, với lệnh IN / OUT, cái này có không gian địa chỉ I / O riêng (bổ sung cho bộ nhớ của ram), Ram I / O này, vì nó xuất hiện, có một bộ địa chỉ giống nhau, ngoại trừ bạn đang truy cập trực tiếp vào thiết bị thông qua bộ giải mã gắn với các địa chỉ I / O đó và bạn không truy cập vào thiết bị I / O từ các chân địa chỉ tiêu chuẩn, đây là hướng dẫn IN / OUT.

mà trong trường hợp này được truyền tốt nhất dưới dạng chuỗi mã ASCII cho các chữ cái và số. Các lệnh này hoàn toàn giống như khi bạn sử dụng các lệnh IN và OUT trong một vòng lặp trong đó số đếm là độ dài chuỗi.

Nếu bạn đang truy cập, ví dụ như loa pc, bạn sẽ truyền một phần dữ liệu tại một thời điểm bằng OUT.

Nếu bạn đang đọc từ cổng song song, bạn sẽ thực hiện IN và sử dụng mã cho địa chỉ I / O của cổng. Viết cho nó, ví dụ để điều khiển máy in cũ hoặc robot bằng tín hiệu điện tử, bạn sẽ sử dụng lệnh OUT. Cổng song song và cổng nối tiếp (RS232 cũ) là các cổng điển hình đã được sử dụng. RS232 là dữ liệu nối tiếp, chỉ có một bit được phép vào hoặc ra, vì vậy nếu bạn đang đọc từ một rs 232, bạn chỉ có 1 bit byte có liên quan, tương tự với đầu ra. Tốc độ baud là khoảng 17kHz tối đa cho một rs 232, nhưng chúng được sử dụng để điều khiển thiết bị điện tử rất nhiều, từ trước đến nay, tôi đã sử dụng để xây dựng các mạch rs 232, ví dụ như để đọc điện áp hoặc điều khiển vi điều khiển PIC. Mỗi cổng, được đặt tên, ví dụ COM1 COM2 COM3 COM4 và chúng có địa chỉ I / O. Tôi không chắc chắn ở đây, nhưng chúng tương tự như ví dụ 3F8h 378h (địa chỉ h = hex)

Tôi không chắc chắn về các cổng hiện đại nhưng nếu bạn đang ghi vào USB, đây rất có thể là bộ nhớ I / O được ánh xạ cho tốc độ cao hơn.

Cổng bàn phím PS / 2, tôi nghĩ rằng điều này sử dụng lệnh IN, để đọc dữ liệu từ bàn phím. Điều này thay thế cho RS232 cũ, nhưng tôi có một thông số kỹ thuật hơi khác.

Một ổ đĩa thường được ánh xạ bộ nhớ, có lẽ bây giờ vẫn là ổ đĩa, tức là bạn không lái ổ đĩa có hướng dẫn vào / ra, chúng sẽ quá chậm. Nhưng dù sao cổng cũng chậm nên không thành vấn đề, ví dụ máy in chậm tốc độ dữ liệu cần thiết so với tốc độ khủng khiếp, ví dụ 200 Megabyte / giây của đĩa cứng. Một loa, nó chỉ cần tần số của thời gian âm thanh khoảng 10 hoặc 20, nói rằng 20kHz sẽ đủ để phát ra tiếng chuông, do đó là I / O. Những thứ chậm sử dụng I / O, hướng dẫn IN / OUT. Do đó, USB có thể được ánh xạ bộ nhớ, bạn sẽ phải kiểm tra nó.

Một cách tốt hơn để hiểu nó là điều này. Trên các máy tính cũ vào những năm 80, đôi khi bạn muốn điều khiển một số thiết bị bạn đã chế tạo và không có thông số kỹ thuật nào cho các cổng đầu ra (vì vào thời đó, nhà sản xuất đã giấu điều này để các công ty nhất định, ví dụ như các công ty cần điều khiển và hộp mực) có thể tiến lên thị trường bởi một số thỏa thuận kinh doanh). Những gì bạn phải làm là mở máy tính và hàn dây theo nghĩa đen vào một số điểm trên bus địa chỉ, ví dụ: bạn đã hàn ba dây vào một số điểm trong mạch ở khoảng cách an toàn (để không làm hỏng chip với nhiệt), những điểm đó các điểm được nối bằng cách bố trí bảng mạch, ví dụ chân A15 A7 và A1 trên bộ vi xử lý. Và bạn cũng phải kết nối thường là một dòng MREQ (một dòng yêu cầu bộ nhớ và / hoặc dòng RD / WR để tạo tín hiệu gọn gàng hơn và thêm nó vào và không logic, nhưng nếu bạn khéo léo, bạn chỉ có thể thực hiện với các dòng địa chỉ) Và sau đó bạn đã kết nối ba dây này + tín hiệu loại Sẵn sàng bổ sung này (ví dụ: dòng MREQ RD hoặc WR để cung cấp một mức hoạt động thấp hoặc cao (sẽ cần thêm KHÔNG cổng ở đây) để nói rằng DATA đã sẵn sàng trên đường NGAY BÂY GIỜ) thông qua cổng AND 4 đầu vào, đưa ra một đầu ra cho một đèn led thông qua điện trở 200 ohm, bạn có bộ nhớ I / O được ánh xạ tốc độ cao tới đèn led , mà bạn có thể chốt qua chốt SR hoặc chốt loại D để lưu trữ nó trong bộ nhớ 1 bit bên ngoài trên một số bảng mạch. Ở đây 15 là dòng 32K, 7 là dòng 64, 1 là dòng 2 (nhị phân hoạt động theo quyền hạn của 2, vì vậy A1 là 2 ^ 1, A7 là 2 ^ 7 và A15 là 2 ^ 15), vì vậy nếu bạn vị trí địa chỉ 32768 + 64 + 2 = 32834 = F041 ở dạng hex, sử dụng LDA hoặc STA hoặc LD trên MPU cũ trong trình biên dịch, bạn sẽ xuất ra đèn led này, nó sẽ sáng lên nếu điện trở nói khoảng 100 ohms. Vì vậy, bạn đã thực hiện bộ nhớ ánh xạ I / o, đơn giản như vậy, bạn có thể thực hiện ngay hôm nay bằng cách hàn vào các dòng địa chỉ mpu của bạn như nhau. Nhưng bạn sẽ không làm điều đó ngay bây giờ do sự tinh tế của các mạch. Nhưng bạn cũng có thể tham gia các dòng dữ liệu D0..7 (ngày xưa) hoặc nói d0..31 bây giờ cho 32 bit trên PC 486 cũ. Sau đó, nếu bạn giải quyết vị trí đó trong mã máy bằng cách tải bộ tích lũy có giá trị 8 (Mov ax, 8 ngày nay) hoặc lưu giá trị của bộ tích lũy đó vào một vị trí địa chỉ (Mov F041h, bộ tích rìu, bạn sẽ NGAY LẬP TỨC Lưu ý, 8, trong ví dụ là những gì trên bus dữ liệu, trong trường hợp cụ thể này, chúng tôi không truyền dữ liệu mà chúng tôi chỉ bật thiết bị cụ thể (đèn LED bật, nếu chúng tôi đã chọn thiết bị I / O đó, ở đây, chỉ là một đèn LED), Vì vậy, trong ví dụ này, chúng ta không có vấn đề gì với số rìu MOV, hướng dẫn 8, có thể là ví dụ như ax ax, 243 và chúng ta vẫn sẽ bật đèn LED trên dòng F041h khi chúng ta thực hiện Mov F041h, như vì chúng tôi đang sử dụng cùng một địa chỉ. Bạn thấy đấy, có những dòng địa chỉ và có những dòng dữ liệu. Vì vậy, khi bạn đánh địa chỉ 3F8 trong COM1 hoặc bất kể địa chỉ đó là gì, bản đồ bộ nhớ I / O chỉ đơn giản là gửi tín hiệu ra một cổng, ví dụ ps / 2, và một cổng và kiểm tra xem bạn có 1110000100 trên các dòng không, ví dụ như 11 3 1000 là F và 0100 là 8, xem chuyển đổi nhị phân sang hex. Nếu điện áp cao xuất hiện ở những vị trí bit có 1, thì cổng, ví dụ rs 232 hoặc ps / 2, được đặt thành hoạt động, tức là nó được bật, điều này cho phép chốt, bằng tín hiệu kích hoạt chip CE hoặc chip CS chọn đơn giản. 8 hướng dẫn, có thể là ví dụ như ax ax, 243 và chúng tôi vẫn sẽ bật đèn LED trên dòng F041h khi chúng tôi thực hiện Mov F041h, vì chúng tôi đang sử dụng cùng một địa chỉ. Bạn thấy đấy, có những dòng địa chỉ và có những dòng dữ liệu. Vì vậy, khi bạn đánh địa chỉ 3F8 trong COM1 hoặc bất kể địa chỉ đó là gì, bản đồ bộ nhớ I / O chỉ đơn giản là gửi tín hiệu ra một cổng, ví dụ ps / 2, và một cổng và kiểm tra xem bạn có 1110000100 trên các dòng không, ví dụ như 11 3 1000 là F và 0100 là 8, xem chuyển đổi nhị phân sang hex. Nếu điện áp cao xuất hiện ở những vị trí bit có 1, thì cổng, ví dụ rs 232 hoặc ps / 2, được đặt thành hoạt động, tức là nó được bật, điều này cho phép chốt, bằng tín hiệu kích hoạt chip CE hoặc chip CS chọn đơn giản. 8 hướng dẫn, có thể là ví dụ như ax ax, 243 và chúng tôi vẫn sẽ bật đèn LED trên dòng F041h khi chúng tôi thực hiện Mov F041h, vì chúng tôi đang sử dụng cùng một địa chỉ. Bạn thấy đấy, có những dòng địa chỉ và có những dòng dữ liệu. Vì vậy, khi bạn đánh địa chỉ 3F8 trong COM1 hoặc bất kể địa chỉ đó là gì, bản đồ bộ nhớ I / O chỉ đơn giản là gửi tín hiệu ra một cổng, ví dụ ps / 2, và một cổng và kiểm tra xem bạn có 1110000100 trên các dòng không, ví dụ như 11 3 1000 là F và 0100 là 8, xem chuyển đổi nhị phân sang hex. Nếu điện áp cao xuất hiện ở những vị trí bit có 1, thì cổng, ví dụ rs 232 hoặc ps / 2, được đặt thành hoạt động, tức là nó được bật, điều này cho phép chốt, bằng tín hiệu kích hoạt chip CE hoặc chip CS chọn đơn giản. vì chúng tôi đang sử dụng cùng một địa chỉ. Bạn thấy đấy, có những dòng địa chỉ và có những dòng dữ liệu. Vì vậy, khi bạn đánh địa chỉ 3F8 trong COM1 hoặc bất kể địa chỉ đó là gì, bản đồ bộ nhớ I / O chỉ đơn giản là gửi tín hiệu ra một cổng, ví dụ ps / 2, và một cổng và kiểm tra xem bạn có 1110000100 trên các dòng không, ví dụ như 11 3 1000 là F và 0100 là 8, xem chuyển đổi nhị phân sang hex. Nếu điện áp cao xuất hiện ở những vị trí bit có 1, thì cổng, ví dụ rs 232 hoặc ps / 2, được đặt thành hoạt động, tức là nó được bật, điều này cho phép chốt, bằng tín hiệu kích hoạt chip CE hoặc chip CS chọn đơn giản. vì chúng tôi đang sử dụng cùng một địa chỉ. Bạn thấy đấy, có những dòng địa chỉ và có những dòng dữ liệu. Vì vậy, khi bạn đánh địa chỉ 3F8 trong COM1 hoặc bất kể địa chỉ đó là gì, bản đồ bộ nhớ I / O chỉ đơn giản là gửi tín hiệu ra một cổng, ví dụ ps / 2, và một cổng và kiểm tra xem bạn có 1110000100 trên các dòng không, ví dụ như 11 3 1000 là F và 0100 là 8, xem chuyển đổi nhị phân sang hex. Nếu điện áp cao xuất hiện ở những vị trí bit có 1, thì cổng, ví dụ rs 232 hoặc ps / 2, được đặt thành hoạt động, tức là nó được bật, điều này cho phép chốt, bằng tín hiệu kích hoạt chip CE hoặc chip CS chọn đơn giản. 11 là 3 1000 là F và 0100 là 8, xem chuyển đổi nhị phân sang hex. Nếu điện áp cao xuất hiện ở những vị trí bit có 1, thì cổng, ví dụ rs 232 hoặc ps / 2, được đặt thành hoạt động, tức là nó được bật, điều này cho phép chốt, bằng tín hiệu kích hoạt chip CE hoặc chip CS chọn đơn giản. 11 là 3 1000 là F và 0100 là 8, xem chuyển đổi nhị phân sang hex. Nếu điện áp cao xuất hiện ở những vị trí bit có 1, thì cổng, ví dụ rs 232 hoặc ps / 2, được đặt thành hoạt động, tức là nó được bật, điều này cho phép chốt, bằng tín hiệu kích hoạt chip CE hoặc chip CS chọn đơn giản.

Trên chốt, đó là chân E Enable hoặc kích hoạt đầu ra thấp hoạt động OE. Tức là với ví dụ được mô tả ở trên, chúng tôi sử dụng các địa chỉ để chọn (bằng cách giải mã) MÀ thiết bị I / O chúng tôi muốn sử dụng (ví dụ như trong đèn LED bật sáng, nếu thiết bị I / O đó được chọn. Vì vậy, đây là dòng kích hoạt THEN, một khi thiết bị I / O được chọn, dữ liệu THEN được truyền từ bus dữ liệu (D0..7 vào thời xưa, hoặc ví dụ D0..63 bây giờ cho máy tính 64 bit), qua bát phân khóa 373 giây trong cũ ngày, đây là các mạch lật loại D lưu trữ dữ liệu bên trong các flip flop. Với cạnh đồng hồ hoạt động cao, dữ liệu đi qua và được lưu trữ. Cạnh đồng hồ này sẽ xuất phát từ tín hiệu 'DATA RDY' trên tín hiệu dữ liệu , cái này có nhiều tên khác nhau, tôi không biết bây giờ tên đó là gì. Vì vậy, với 64 bit, chúng ta có 8 chốt bát phân. Và họ sử dụng các chốt hai chiều để kiểm soát dữ liệu theo cách nào hoặc trạng thái ba, để khi thiết bị I / O không được sử dụng, các dòng dữ liệu ở trạng thái trở kháng cao. Vì vậy, do đó bạn chọn thiết bị I / O có kết hợp trên các dòng địa chỉ, đây là số, ví dụ 3f8h trong OUT 3F8h, 7 và dữ liệu, ở đây trong ví dụ 7, là những gì được truyền trên các dòng dữ liệu, trong lệnh OUT dữ liệu đang truyền OUT cho chốt dữ liệu và ra thiết bị I / O. Nếu bạn đã IN, bạn sẽ thực hiện một lệnh, ví dụ IN 3f8h, 800h, (tôi mong đợi, nhưng tôi không biết cú pháp của trình biên dịch x86), ý tôi là, đối với IN, bạn đang nhập dữ liệu từ các dòng dữ liệu (sau khi đã chọn địa chỉ, ví dụ ở đây 3f7h, chọn thiết bị I / O THAT), dữ liệu này đến từ thiết bị I / O, thông qua các flip-type lật trong chốt dữ liệu (một cho mỗi bit của các đường bus dữ liệu) và được nhập vào các chân D0..7 hoặc (D0..63 trên các máy tính hiện đại) trên bộ xử lý Micro MPU ). Trong ví dụ này tôi đặt IN 3f8h, 800h, để chỉ ra rằng một khi dữ liệu đi vào thì nó được lưu vào địa chỉ 800h. Cú pháp của x86 tôi nghĩ là khác nhau, bạn phải thực hiện IN 3f8h, ah hoặc một cái gì đó tương tự, tức là vào một thanh ghi đầu tiên với dữ liệu đến, sau đó bạn sẽ MOV 800h, tức là chuyển dữ liệu vào bộ nhớ vị trí trong RAM, (Nếu bạn muốn lưu trữ nó), hoặc làm một cái gì đó khác với ah, v.v. ah là một thanh ghi ví dụ, nó có thể là bất kỳ, al, bh, bl vv bất cứ điều gì, nhưng hãy kiểm tra cú pháp, mọi hệ thống trình biên dịch đều hơi khác một chút, tôi không phải là chuyên gia về x86. Một lần nữa, tôi đang sử dụng 3f8h làm địa chỉ I / O mẫu, có hàng trăm,

Trong khi bạn truy cập vào bộ nhớ (RAM, ví dụ như ram tĩnh 64byte và RAM động trong thập niên 70, 8K SRAM và DRAM trong thập niên 80, mỗi hàng SIMMS có mỗi vài megabyte (mô-đun bộ nhớ một dòng) trong 90 và bây giờ ở dạng các mô-đun DDR chứa DIMM, các mô-đun bộ nhớ kép, tôi chưa kiểm tra nhưng mới nhất có lẽ không có nghi ngờ gì, mỗi loại có một vài gigabyte trên mỗi chip nhỏ), nếu đó không phải là địa chỉ I / O (rất Một vài địa chỉ là địa chỉ I / O, ngày nay bộ nhớ có khả năng nằm trong không gian địa chỉ hàng triệu lần so với I / O trên một máy tính hiện đại), bạn vẫn sử dụng cùng một hướng dẫn đọc dữ liệu ghi vào bộ nhớ, nhưng bạn không điều khiển một số mạch logic bên ngoài tìm kiếm các bit đó, thay vào đó các chân địa chỉ và dữ liệu đó được nối trực tiếp với các chip RAM.

Trong mã máy, địa chỉ I / O và địa chỉ bộ nhớ chỉ xuất hiện giống nhau, như thể cả hai đều truy cập bộ nhớ, nhưng những gì diễn ra về mặt vật lý thì hoàn toàn khác nhau trong mạch điện tử thực tế.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.