Trình bày về cơ chế DMA?

Thảo luận trong 'Hệ điều hành' bắt đầu bởi Trần Văn Cường, 15/5/16.

  1. Trần Văn Cường

    Trần Văn Cường I love CNTT Thành viên BQT Thành viên BQT

    Tham gia ngày:
    8/11/15
    Bài viết:
    3,693
    Đã được thích:
    43
    Điểm thành tích:
    48
    Giới tính:
    Nam
    Nghề nghiệp:
    Sinh Viên
    Nơi ở:
    Quảng Ninh thân yêu!
    Web:

    ' trinh-bay-ve-co-che-dma.png

    Direct Memory Access (DMA)

    CPU gửi yêu cầu đến module DMA (= DMA controller)
    Module DMA chuyển một khối dữ liệu giữa bộ nhớ và thiết bị I/O mà không cần CPU can thiệp.
    Khi xong một tác vụ gửi nhận thì phát khởi một ngắt quãng.
    CPU chỉ tham gia vào giai đoạn khởi đầu và kết thúc của việc truyền nhận dữ liệu
    Trong khi đang truyền nhận dữ liệu, CPU có thể thực thi công việc khác
    Thích hợp cho các thiết bị có tốc độ cao (đĩa)

    Ai thích tìm hiểu thêm thì đọc phần dưới này nhé!

    ==============================

    DMA là gì ?

    DMA là một kỹ thuật chuyển dữ liệu nhanh từ một card thiết bị tới bộ nhớ, từ bộ nhớ ra card thiết bị, hoặc trong một vài trường hợp từ một vị trí trong bộ nhớ tới một vị trí khác. Việc chuyển theo DMA rất quan trọng vì nó không yêu cầu đến sự thực thi của CPU. Chuyển theo DMA được thực hiện bằng cách lập trình một chip có tên là bộ điều khiển DMA (gọi ngắn gọn là DMAC), chip đó nằm trên bo mạch hệ thống của mọi máy PC. Việc lập trình thường được hoàn thành bởi một chương trình chạy trên máy tính của bạn (ví dụ một chương trình sao lưu đĩa cứng) hoặc bởi một thủ tục lưu trong ROM, hoặc trên một card thiết bị tiếp hợp (ví dụ trong ROM của card điều khiển đĩa mềm). Mỗi lần bộ điều khiển được khởi động và quá trình chuyển dữ liệu bắt đầu, CPU được tự do và làm việc khác trong khi DMAC tiếp tục thực hiện chuyển dữ liệu, có hai bộ vi xử lý đồng thời làm việc phục vụ bạn: một thực hiện mã (code), còn một chuyển dữ liệu.

    Việc chuyển theo DMAC quan trọng còn vì một lý do khác, nó chuyển dữ liệu trực tiếp từ nguồn dữ liệu đến nơi nhận mà không cần thông qua bất kỳ bộ phận lưu trữ trung gian nào. Quá trình đưa một byte dữ liệu từ một thiết bị tới một vị trí trong bộ nhớ thông qua CPU là một quá trình hai bước. Đầu tiên CPU đọc byte đó từ thiết bị và lưu trong một trong số các thanh ghi của nó. Tiếp theo đó nó đọc byte từ thanh ghi tới địa chỉ cần chuyển đến trong bộ nhớ. DMAC giảm quá trình trên xuống còn một bước, nó vận dụng các tín hiệu điều khiển trên đường truyền, vì thế byte đó được đọc và ghi chỉ trong một hành động.

    Một cách tốt để hiểu sự khác nhau trên là minh họa các quá trình trên như là một cuộc chơi bóng ném. CPU là người chơi ném bóng với hai người khác được gọi là A và B. Để chuyển bóng từ A tới B, CPU phải bắt quả bóng do A ném và tung nó cho B. DMA, theo một cách khác, sẽ nói A tung trực tiếp quả bóng cho B. Trong lúc ấy, CPU có thể làm các công việc khác như khởi động cầu thủ tiếp theo.

    Chuyển dữ liệu từ bộ nhớ đến bộ nhớ theo DMA hiện nay không được sử dụng nữa vì tốc độ CPU vượt trên DMAC rất nhiều, nhưng chuyển dữ liệu từ bộ nhớ đến thiết bị và từ thiết bị đến bộ nhớ là những kỳ tích đáng kể. Để đưa dữ liệu từ thiết bị vào bộ nhớ, DMAC kích hoạt đường truyền gây nên lệnh đọc từ thiết bị (một hoạt động đọc cổng I/O) và đồng thời tạo ra lệnh ghi vào bộ nhớ. Việc kích hoạt đọc từ cổng I/O sẽ làm cho thiết bị đặt một đơn vị - thông thường là một byte hoặc một Word - lên đường truyền dữ liệu của máy PC. Và vì tuyến đọc bộ nhớ được hoạt động đồng thời cho nên dữ liệu trên đường truyền được sao ngay vào bộ nhớ. Với mỗi lần ghi, DMAC dùng đường địa chỉ để chỉ định địa chỉ trong bộ nhớ nơi dữ liệu sẽ tới.

    Tương tự đối với quá trình chuyển theo DMA từ bộ nhớ đến thiết bị. Với mỗi đơn vị dữ liệu được chuyển, DMAC ra lệnh đọc đối với bộ nhớ và ghi đối với cổng I/O. Địa chỉ của bộ nhớ được đặt trên đường địa chỉ. Giống như quá trình trên, dữ liệu được chuyển trực tiếp từ nơi phát đến nơi nhận bằng cách sử dụng đường dữ liệu.

    DMAC được sử dụng trong phần lớn các máy PC là chip có ký hiệu 8237A hoặc tương đương. Các dòng máy Micro Channel và EISA đã sửa đổi kỹ thuật DMA tạo ra một chip riêng có các chức năng hơn hẳn 8237A, nhưng có rất ít chương trình điều khiển thiết bị tận dụng được những ưu điểm mở rộng đó. Dòng máy IBM-XT chỉ sử dụng một chip 8237A lập trình được cung cấp 4 kênh DMA riêng rẽ, đánh số từ 0 đến 3. Dòng máy IBM-AT (chiếm phần lớn thị trường máy PC hiện nay) sử dụng 2 chip 8237A cung cấp 8 kênh DMA độc lập đánh số từ 0 đến 7. Chỉ có 7 trong số 8 kênh DMA sử dụng được vì một kênh (kênh 4) được sử dụng để liên kết hai bộ điều khiển với nhau sao cho chúng có thể làm việc như một đơn vị thống nhất. Kênh 0 đến 3 chuyển 8 bit dữ liệu cùng một lúc và có thể lưu 64KB chỉ trong một lần hoạt động, trong khi kênh 5 đến 7 chuyển 16 bit và có thể chuyển được 128KB trong một lần hoạt động.

    Giống như bộ điều khiển ngắt, nơi nhận yêu cầu ngắt từ các thiết bị thông qua đường IRQ, một DMAC nhận yêu cầu DMA thông qua đường DMA request (DREQ). Chip 8237A cung cấp một vài phương thức và phương pháp hành động khác nhau, tuy nhiên một quá trình chuyển điển hình từ thiết bị tới bộ nhớ diễn ra như sau:

    DMAC được lập trình đầu tiên với địa chỉ của bộ nhớ sẽ ghi dữ liệu và số byte được chuyển. Khi thiết bị đã sẵn sàng bắt đầu quá trình chuyển, nó kích hoạt đường DREQ để kết nối với DMA. Sau khi được CPU cho phép điều khiển đường truyền, DMAC đưa ra địa chỉ bộ nhớ và tạo ra tín hiệu để một byte (hoặc một từ) dữ liệu được đọc từ thiết bị và ghi vào vùng được chỉ định trong bộ nhớ. Sau đó nó cập nhật địa chỉ bộ nhớ cho byte tiếp theo và lặp lại quá trình trên cho tới khi toàn bộ dữ liệu được chuyển hoàn tất. Dựa trên cách bộ điều khiển được lập trình, mỗi byte được chuyển có thể yêu cầu một tín hiệu DREQ riêng rẽ (phương thức chuyển đơn) hoặc chỉ một tín hiệu có thể khởi động tất cả quá trình truyền (phương thức chuyển khối hoặc theo yêu cầu).

    Có một thiết bị DMA có trên tất cả các máy PC là bộ điều khiển đĩa mềm. Dữ liệu trên đĩa mềm được đọc theo từng đơn vị 512 byte (1 sector) và được chuyển bằng DMA sử dụng kênh DMA số 2. Để đọc một sector dữ liệu, ngắt BIOS 13H lập trình DMA theo phương thức chuyển đơn và cung cấp một lệnh đọc cho điều khiển đĩa mềm. Khi thực hiện, điều khiển đĩa đọc byte dữ liệu từ đĩa và khởi động quá trình truyền bằng cách kích hoạt DREQ 2. Sau đó nó đọc lần lượt các byte khác theo cách như trên để chuyển byte vào địa chỉ vật lý trong bộ nhớ. Tới khi DMAC đã chuyển xong 512 byte, điều khiển đĩa tạo ra một ngắt cứng để báo cho CPU biết đã có thể sử dụng được sector đó.

    Các kênh DMA

    Khi bạn gắn một card thiết bị có sử dụng DMA trên máy PC, bạn thường được yêu cầu chọn kênh DMA. Đặt một DIP-switch hoặc định lại jumper với kênh DMA 5 sẽ thiết lập một giao tiếp vật lý giữa thiết bị và DMAC thông qua DREQ 5. Thông thường, phần mềm sử dụng thiết bị phải được cung cấp số hiệu kênh DMA ấn định để nó có thể lập trình DMAC cho việc chuyển theo DMA. Mặc dù theo lý thuyết có thể nhiều thiết bị chia sẻ một đường DREQ nếu chúng không đồng thời sử dụng, nhưng - như một luật - tốt nhất là giới hạn mỗi thiết bị sử dụng một kênh. Như vậy bạn sẽ chắc chắn không gặp xung đột DMA.

    Như đã biết, chúng ta không sử dụng được kênh DMA 2 và 4 vì chúng được dành cho điều khiển đĩa mềm và làm đường nối 2 chip DMA. Kênh 0 cũng không sử dụng được vì trên các máy PC trước đây nó được sử dụng để phục hồi bộ nhớ. Vào lúc khởi động, BIOS của máy PC nguyên thủy lập trình cho đồng hồ để cứ vài mili giây lại đưa yêu cầu đọc DMA giả - nhằm tạo ra việc đọc bộ nhớ nhưng không nhất thiết có thiết bị nhận dữ liệu đó - như vậy tránh mất thông tin trong DRAM. Tất cả các máy PC hiện nay phục hồi DRAM mà không cần sự giúp đỡ của hệ thống DMA. Tuy vậy bạn vẫn không thể sử dụng kênh DMA số 0 vì có một số máy không thiết lập kênh đó. Vậy bạn sẽ xử trí ra sao khi được yêu cầu chọn một kênh DMA? Câu trả lời là chọn các kênh DMA còn lại.

    Bảng dưới liệt kê danh sách các kênh DMA đã được phân bổ. Trên hầu hết các máy PC, kênh 1, 3, 5, 6 và 7 được để dành cho việc ghép nối với thiết bị. Dòng máy PS/2 sử dụng kênh 5 để chuyển dữ liệu cho đĩa cứng, còn dòng XT thì dùng kênh 3. Vì lý do này, khi sử dụng 2 dòng máy trên, bạn cần tránh sử dụng các kênh đó. Khi bạn còn chưa ấn định một kênh DMA cho một thiết bị nào thì bạn có thể sử dụng nó bất kỳ khi nào bạn muốn. Nhưng bạn nên theo dõi bảng phân bổ kênh DMA để không xảy ra hiện tượng hai thiết bị cùng chia sẻ một kênh DMA. Tôi viết trên quyển sổ để bàn của mình danh sách các IRQ và DMA đã được sử dụng. Khi cắm thêm một card thiết bị mới và tìm kiếm một DMA chưa sử dụng, tôi không phải tháo các card thiết bị đã cắm trong máy và xem các jumper của chúng.

    Có một vài trình tiện ích phát hiện được kênh DMA nào đã được sử dụng nhưng chúng không thực sự đáng tin cậy. Nếu bạn không có thông tin về các kênh DMA đã được phân bổ và bạn cũng không muốn lục tìm trong đống tài liệu của mình thì đã có một loạt các chương trình chẩn đoán phân tích máy thông báo cho bạn biết danh sách những kênh DMA đã sử dụng. Các chương trình trên chưa thực sự hoàn hảo nên có thể kết quả đưa ra sẽ không chính xác.

    Các vấn đề quản lý bộ nhớ

    Các trình quản lý bộ nhớ theo 86 ảo như EMM 386.EXE., QEMM-386 và 386MAX gây ra một vấn đề đặc biệt đối với DMAC. Địa chỉ bộ nhớ được lập trình vào trong DMAC phục vụ cho việc chuyển theo DMA là các địa chỉ vật lý. Nhưng các trình quản lý trên thường xuyên định lại bản đồ bộ nhớ làm cho một địa chỉ bộ nhớ có trước tương ứng với một địa chỉ bộ nhớ vật lý khác (thông thường là một nơi không dùng đến trong bộ nhớ mở rộng). Khi một chương trình truy nhập đến phần địa chỉ đã được định lại, CPU chuyển yêu cầu đó đến địa chỉ vật lý phù hợp. Tuy nhiên, nếu DMAC cố gắng truy nhập đến địa chỉ trên, việc truy nhập sẽ thất bại vì không có cách nào để DMAC biết bản đồ bộ nhớ đã được định lại.

    Điều kết luận là các chương trình làm việc theo DMA có dữ liệu nạp trong vùng bộ nhớ cao (UMB) sẽ không làm việc được nếu không chịu sự kiểm soát của các chương trình quản lý bộ nhớ. Một DMAC được lập trình đưa dữ liệu ra cổng I/O và trong chế độ 86 ảo một trình quản lý bộ nhớ có thể chặn tát cả dữ liệu được đưa ra cổng I/O. Như vậy nó có thể dự đoán được các yêu cầu DMA sắp tới và thậm chí biết được cả địa chỉ bộ nhớ tiếp theo. Nếu các địa chỉ đó đã được sửa đổi, trình quản lý bộ nhớ sẽ lập trình lại DMAC theo địa chỉ bộ nhớ vật lý phù hợp. Sau đó nó cho phép quá trình chuyển DMA thực hiện như thường lệ.

    Một tình huống tai hại tiềm tàng xảy ra khi địa chỉ bộ nhớ vật lý đã được sửa đổi gửi cho quá trình chuyển theo DMA lại nằm ngoài vùng quản lý của DMAC. Phần lớn các DMAC bị giới hạn trong 16MB bộ nhớ, một số khác không thể đánh địa chỉ lớn hơn 8MB. Khi một địa chỉ nguồn hoặc đích nằm ngoài vùng DMAC có khả năng đánh địa chỉ, trình điều khiển bộ nhớ đưa ra mẹo sau: Nó định lại quá trình chuyển DMA ra một vùng đệm của nó - một vùng nằm trong vùng có thể truy nhập bới DMA - và cho phép quá trình chuyển thực hiện. Nếu vùng đệm đủ lớn để chứa dữ liệu thì sau khi quá trình chuyển kết thúc, trình quản lý bộ nhớ chuyển dữ liệu trong vùng đêm tới địa chỉ bộ nhớ thích hợp. Sự việc trên làm giảm hiệu quả của quá trình DMA nhưng bù lại nó làm cho hệ thống vẫn có thể thực hiện được.

    Một vấn đề thực sự xảy ra khi dữ liệu của quá trình chuyển DMA lớn hơn vùng đệm. Bạn sẽ nhận được một thông báo lỗi nhắc nhở tăng kích thước vùng đệm DMA của trình quản lý bộ nhớ, tiếp theo đó là việc máy bị treo cứng. Đó là sản phẩm của trình quản lý bộ nhớ trong khi nó đang cố gắng ngăn chặn việc thất thoát dữ liệu. Theo ngầm định, EMM386.EXE sử dụng vùng đệm DMA có kích thước 32KB. Kích thước vùng đệm có thể được đặt trong khoảng từ 16KB tới 256KB bằng cách sử dụng tham số D=; kích thước ngầm định thường là phù hợp vì trong hàng loạt trường hợp nó có khả năng chứa hết được dữ liệu DMAC.

    Thậm chí một trường hợp phức tạp khác nảy sinh khi DMAC không nằm trên bo mạch hệ thống mà nằm trên thiết bị, nơi mà trình quản lý bộ nhớ không thể điều khiển quá trình DMAC đưa dữ liệu ra cổng I/O. Điều đó xảy ra với một điều khiển đĩa cứng chỉ huy được đường truyền (BMC). Bộ điều khiển đó gây ra rất nhiều điều phiền toái khi người sử dụng khởi động SmartDrive của DOS 5.0 và nạp nó lên vùng bộ nhớ cao. Giải pháp được Microsoft đưa ra năm 1990 là mẫu chi tiết kỹ thuật của các thiết bị phục vụ ảo (VDS). VDS là một tập các phục vụ cho phép trình quản lý bộ nhớ cung cấp địa chỉ bộ nhớ của hệ thống cho BMC trước khi đọc và ghi. Tất nhiên, bộ điều khiển chứa DMAC phải nhận biết được VDS, nhưng giờ đây dường như hầu hết các bộ điều khiển đều có khả năng đó. Đó là tất cả những điều phức tạp thú vị. Điều kết luận là ngày nay việc sử dụng các thiết bị DMA với các trình quản lý bộ nhớ trong mode 86 ảo thực sự an toàn.

    Đọc thêm về DMA

    Nếu bạn muốn học thêm về DMA và đặc biệt là tìm hiểu cách lập trình chip DMA, cho phép tôi giới thiệu với bạn 2 cuốn sách sau :

    Cuốn thứ nhất của Hans-Peter Messmer với nhan đề The Indispensable PC Hardware Book (1994, Addition - Wesley). Đây thực sự là một kiệt tác và vô hình chung nó đã thay thế hơn nửa tá sách hướng dẫn sử dụng phần cứng tôi thường dùng. Nó không quá đi sâu vào chi tiết khi mô tả các thành phần trong máy PC làm việc ra sao, bao gồm cả chip nằm trên bo mạch hệ thống. Và mặc dù cuốn sách được dịch từ tiếng Đức, nội dung của nó vẫn giữ được nguyên bản.

    Cuốn sách thứ hai của Frank Van Gilluwe có nhan đề The Undocumented PC (1994, Addition - Wesley). Mặc dù không bằng cuốn sách của Messmer, cuốn sách này cũng là một kho tàng các thông tin khó kiếm về máy PC.
     

    Bình Luận Bằng Facebook

    data-href="https://cnttqn.com/threads/trinh-bay-ve-co-che-dma.1838.html"
  2. RebCelt

    RebCelt Guest

    Giới tính:
    N/A
    Nghề nghiệp:
    N/A
    Nơi ở:
    N/A
    Web:
    N/A

    Discount Fluoxetine Price Shop Cialis Las Palmas Canada Prescription Online acheter viagra Cytotec Grossesse Viagra Maux De Tete Levitra Viagra Equivalent Dose
     
  3. RebCelt

    RebCelt Guest

    Giới tính:
    N/A
    Nghề nghiệp:
    N/A
    Nơi ở:
    N/A
    Web:
    N/A

    Cheap Kamagra Canada buy viagra Amoxicillin And Alchole
     
  4. RebCelt

    RebCelt Guest

    Giới tính:
    N/A
    Nghề nghiệp:
    N/A
    Nơi ở:
    N/A
    Web:
    N/A

    Cialis Dangers Mass Spectroscopy For Amoxicillin Propecia Regrow Further Hair cialis Propecia Work Long Term