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 h oà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ộ. Văn Linh (Theo Windowsnetworking) . 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. 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. 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