Truy cập bộ nhớ trực tiếp Trong bài này chúng tôi sẽ giới thiệu cho các bạn một số kiến trúc điển hình được sử dụng để thực thi truy cập bộ nhớ trực tiếp. Truy cập bộ nhớ trực tiếp (Direct Memory Access hay được viết tắt là DMA) là một thành phần quan trọng trong bất cứ kiến trúc máy tính hiện đại nào. DMA cho phép CPU chia tải (offload) các ngăn xếp bộ nhớ ngày càng chật trội sang các thành ph ần khác. Cách thức này giúp giải phóng CPU khỏi các công việc lặt vặt và cung cấp nhiều chu trình (cycle) hơn để giải quyết các nhiệm vụ phức tạp hơn. Cho ví dụ, có lẽ trong số các bạn sẽ có người thích lưu bài viết này vào ổ cứng để có thể đọc tham khảo sau này. Khi chọn thực hiện công việc này, bạn sẽ cần phải chọn một địa điểm (location) nào đó để lưu trữ bài viết. Lúc này dữ liệu được thu về bởi card mạng và sau đó được định tuyến đến địa điểm mong muốn trên ổ cứng của bạn. Một nhiệm vụ rất đơn giản và khả năng của CPU thừa cho các kiểu hoạt động như vậy. Mặc dù ý tưởng chính của kỹ thuật truy cập bộ nhớ trực tiếp khá đơn giản nhưng các ho ạt động truy cập bộ nhớ một cách trực tiếp lại rất phức tạp. Bạn có thể hình dung, khi có nhi ều thiết bị (hoặc ngoại vi) đều muốn truy cập đến các vị trí của bộ nhớ thì vấn đề sẽ xảy ra. Đây là lý do hoặc yêu cầu cần có một DMA controller. DMA controller thực chất là một thiết bị giúp điều khiển tất cả các hoạt động DMA. Đ ể điều khiển các hoạt động DMA, DMA controller cần phải có các thông tin liên quan với hoạt động sắp tới. Các thông tin này gồm có những thứ giống như các địa chỉ nguồn và đích, chế độ, kích thước dữ liệu được truyền tải. DMA controller cũng cần đư ợc trang bị kiến thức về những gì nó sẽ truyền tải, nơi truyền tải đến và cách truyền tải như thế nào, bao lâu để thực hiện công việc đó. Với kiến thức này, DMA controller có thể yêu cầu sự điều khiển bus nhớ từ CPU. Khi CPU sẵn sàng nhường sự điều khiển của bus nhớ, nó sẽ gửi đi một tín hiệu phúc đáp ACK để đáp trả lại tín hiệu yêu c ầu của DMA controller. Hình 1: Sự tương tác Direct Memory Access Burst hay Single-cycle Điều gì sẽ xảy ra sau khi DMA controller tăng điều khiển của bus nhớ hoàn toàn phụ thuộc vào chế độ DMA controller đã đư ợc chỉ thị từ trước. Có hai chế độ hoạt động nói chung của DMA controller. Đầu tiên là burst. Khi DMA controller ho ạt động trong chế độ burst, nó sẽ duy trì sự điều khiển của bus nhớ trong khoảng thời gian truyền tải bộ nhớ. Nhược điểm trong chế độ burst là CPU không thể truy cập vào bus nhớ cho tới khi DMA controller hoàn tất việc truyền tải bộ nhớ. Lúc này CPU vẫn có thể truy cập v ào cache L1 và L2 của nó nhưng không thể truy cập vào bộ nhớ khác; điều này đã hạn chế CPU trong việc thực hiện nhiệm vụ và có thể khiến nó phải đợi cho tới khi DMA controller hoàn tất việc truyền tải bộ nhớ sau đó trả sự điều khiển bus nhớ về lại cho mình. Để tránh tình huống CPU buộc phải đợi cho việc truyên tải bộ nhớ hoàn tất, DMA controller có thể hoạt động trong chế độ khác mang tên single-cycle. Cách thức hoạt động trong chế độ single-cycle như sau, DMA controller sẽ trả sự điều khiển bus nhớ sau khi truyền tải xong mỗi block nhớ. Kích thước của mỗi block nhớ này thường rơi vào cỡ 256 hoặc 512 byte. Điều này cho phép CPU có nhiều cơ hội sử dụng bus nhớ hơn cho các mục đích riêng mà không c ần phải đợi một số lượng thời gian khá lớn hoàn thành việc truyền tải bộ nhớ như ở chế độ burst. Tuy nhiên vẫn có một nhược điểm đối với hoạt động của DMA trong chế độ single-cycle này. Khi DMA controller trả quyền điều khiển bus nhớ nó phải gửi một yêu cầu đến CPU để tăng quyền điều khiển bus, sau đó phải đợi tính hiệu phúc đáp ACK từ CPU trước khi có thể tăng điều khiển lại bus nhằm thực hiện truyền tải các block nhớ khác. Như vậy việc lặp đi lặp lại nhiều lần chuỗi yêu cầu/ phúc đáp sẽ làm tiêu tốn thời gian hoàn thành quá trình truyền tải của bộ nhớ. Chế độ hoạt động single-cycle thường được sử dụng nhất mặc dù hầu hết các DMA controller đều có thể đáp ứng cho cả hai chế độ. Chiều dài tối ưu của mỗi khối mà DMA sẽ truyền tải trước khi trả lại sự điều khiển cho bus và yêu cầu lại quyền điều khiển là m ột vấn đề khá phức tạp. Một hệ số chính trong việc xác định kích thước tối ưu của block là tốc độ lỗi quan sát được. Khi có tốc độ lỗi cao thì chiều dài của khối càng nhỏ sẽ càng tốt. Tuy nhiên cũng cần biết rằng, khi có ít lỗi do giảm chiều dài block thì chúng ta sẽ chịu tổn thất ở chỗ tăng các quá trình yêu cầu/ phúc đáp giữa DMA controller và CPU. Quyết định thực thi như thế nào là phụ thuộc v ào mỗi nhà sản xuất DMA controller (đặc biệt là các kỹ sư thiết kế ra nó!). Nếu muốn biến cách xác định này như thế nào cho một DMA controller cụ thể, bạn có thể tìm kiếm nó ở đâu đó trong tài liệu, bằng không có thể yêu cầu từ công ty. Khi DMA controller đã hoàn tất quá trình truyền tải một block và trả lại sự điều khiển của bus nhớ cho CPU, CPU lúc này sẽ có thể truy cập cập vào bus để thực hiện các mục đích riêng. Trong ví dụ chúng tôi sử dụng ở trên và trong nhiều ví dụ khác đã cung cấp cho CPU một cơ hội cập nhật các chỉ thị tiến trình và c ập nhật các thông tin mới có liên quan với hoạt động DMA đang được thực hiện cho hệ thống file. Cache Coherency Một vấn đề khác phát sinh trong quá trình hoạt động DMA đó là cache coherency. Khi CPU truy cập một vị trí nhớ, giá trị của vị trí đó sẽ được lưu trong cache nhớ của CPU. Nếu hoạt động DMA có liên quan đến vị trí nhớ này thì giá trị trong cache nhớ của CPU có thể không tương khớp với giá trị tại vị trí nhớ thực. Để khắc phục vấn đề này, có hai giải pháp được đưa ra. Các hệ thống cố kết cache toàn bộ cần phải thi hành một giải pháp phần cứng mà ở đó DMA controller sẽ gửi đi một tín hiệu đến cache controller khi nó mong muốn truy cập vào vị trí nhớ. Nếu DMA muốn ghi vào vị trí đó, cache controller sẽ làm mất hiệu lực giá trị cache nhớ của CPU. Nếu DMA muốn đọc vị trí nhớ thì cache controller sẽ xóa cache của CPU để bảo đảm rằng vị trí nhớ gồm có giá trị mới nhất (giá trị trong cache của CPU). Phương pháp hoạt động này yêu cầu thêm một số overhead nhưng b ảo đảm sự chặt chẽ cho cache của CPU. Trong các hệ thống cố kết cache không toàn bộ, công việc duy trì s ự chặt chẽ của cache nhớ được để lại cho hệ điều hành. Hệ điều hành sẽ nhận được yêu cầu để quyết định xem cache sẽ được xóa trước cho hoạt động DMA hay làm mất hiệu lực sau đó. Phương pháp nào tốt hơn? Chúng tôi không giám chắc có một câu trả lời chính xác nào vì cả hai phương pháp đều thỏa đáng. Tuy nhiên cách chúng tôi chọn cũng như khuyên bạn là thực thi phần cứng trong các hệ thống cố kết cache toàn bộ. . Truy cập bộ nhớ trực tiếp Trong bài này chúng tôi sẽ giới thiệu cho các bạn một số kiến trúc điển hình được sử dụng để thực thi truy cập bộ nhớ trực tiếp. Truy cập bộ nhớ trực tiếp. thuật truy cập bộ nhớ trực tiếp khá đơn giản nhưng các ho ạt động truy cập bộ nhớ một cách trực tiếp lại rất phức tạp. Bạn có thể hình dung, khi có nhi ều thiết bị (hoặc ngoại vi) đều muốn truy. khiển của bus nhớ trong khoảng thời gian truy n tải bộ nhớ. Nhược điểm trong chế độ burst là CPU không thể truy cập vào bus nhớ cho tới khi DMA controller hoàn tất việc truy n tải bộ nhớ. Lúc này