2011-08-28 24 views
6

Tôi muốn biết cách bộ nhớ có thể được bảo vệ mà không cần hỗ trợ MMU. Tôi đã cố gắng để google nó, nhưng đã không nhìn thấy bất kỳ giấy tờ có giá trị hoặc nghiên cứu về nó. Và những người đối phó với nó chỉ giải quyết nó cho các lỗi, chẳng hạn như các con trỏ chưa được khởi tạo và không phải lỗi bộ nhớ do lỗi mềm, nghĩa là, do lỗi phần cứng tạm thời làm hỏng một lệnh ghi vào vị trí bộ nhớ.Bảo vệ bộ nhớ không có MMU

Lý do tôi muốn biết điều này là do tôi đang làm việc trên nền tảng nhiều lõi độc quyền mà không có bất kỳ Bảo vệ bộ nhớ nào. Bây giờ câu hỏi của tôi là, phần mềm có thể được sử dụng để bảo vệ bộ nhớ, đặc biệt là để viết tự nhiên do erros mềm (như trái ngược với những sai lầm của một lập trình viên). Bất kỳ trợ giúp về điều này sẽ được thực sự đánh giá cao.

+0

Vết thương không thực hiện những gì bạn cần? –

+0

Tôi không cần nó để gỡ lỗi, nhưng tránh ghi tự nhiên vào bộ nhớ bị hỏng khi chạy. Về cơ bản tôi muốn có một hệ thống an toàn và đáng tin cậy. – MetallicPriest

Trả lời

5

Nếu bạn đang tìm kiếm Bảo vệ bộ nhớ thời gian, tùy chọn duy nhất sane là hỗ trợ phần cứng. Phần cứng là cách duy nhất để can thiệp vào một truy cập bộ nhớ xấu trước khi nó có thể gây ra thiệt hại. Bất kỳ giải pháp phần mềm nào cũng sẽ dễ bị tổn thương bởi các lỗi bộ nhớ mà nó đang cố gắng bảo vệ.

Với phần mềm, bạn có thể triển khai chương trình xác minh/phát hiện. Bạn có thể định kỳ kiểm tra các phần của bộ nhớ mà chương trình hiện đang chạy không nên có quyền truy cập và xem chúng có thay đổi hay không (có thể bằng cách CRCing các khu vực này). Nhưng tất nhiên nếu chương trình giả mạo gây thiệt hại cho khu vực nơi tổng kiểm tra được tổ chức, hoặc nơi mã của chương trình kiểm tra được tổ chức, thì tất cả mọi phiên cược đều bị tắt.

Ngay cả giải pháp kiểm tra phần mềm này sẽ là tiện ích gỡ lỗi nhiều hơn bảo vệ thời gian chạy vĩnh viễn. Có khả năng một thiết bị không có MMU là một thiết bị nhúng nhỏ mà sẽ không có chu trình dự phòng để liên tục kiểm tra bộ nhớ của thiết bị.

Thông thường các thiết bị không có MMU được thiết kế để chạy một chương trình không có hạt nhân hoặc bất kỳ thứ gì khác và do đó không có gì để bảo vệ. Nếu bạn cần chạy nhiều chương trình và cảm thấy bạn cần bảo vệ, bạn có thể cần một phần cứng nâng cao hơn hỗ trợ loại tính năng bạn đang tìm kiếm.

+1

Nếu bảo vệ bộ nhớ có thể được thực hiện trong phần cứng, nó có lẽ có thể được thực hiện trong phần mềm. –

+1

@David: Chắc chắn, bằng cách mô phỏng phần cứng. Tại thời điểm đó nó sẽ chỉ là một máy ảo. Sau đó, tốc độ của phần cứng thực tế đến để chơi. Có lẽ anh chàng này không quan tâm đến việc triển khai máy ảo của riêng mình, bởi vì điều đó thật điên rồ. – SoapBox

+1

Tôi đồng ý với tất cả điều đó. Tôi chỉ lấy vấn đề với bạn nói rằng phần cứng là cách duy nhất. Có lẽ bạn có thể nói phần cứng là cách duy nhất thực tế hoặc lành mạnh. Đó là tất cả! –

2

Nếu bạn muốn phần mềm thực hiện bảo vệ bộ nhớ, thì bạn sẽ cần hỗ trợ từ trình biên dịch của bạn và các thư viện liên quan. Tôi hy vọng rằng chỉ có một trình biên dịch trên nền tảng này và vì vậy bạn nên liên hệ với nhà cung cấp. Tôi sẽ không giữ nhiều hy vọng cho một phản ứng tích cực. Ngay cả khi họ có các công cụ như vậy, tôi sẽ mong đợi hiệu suất của bảo vệ bộ nhớ phần mềm là không thể chấp nhận được.

+0

Loại hỗ trợ nào. Ý tôi là, cơ chế sẽ là gì? – MetallicPriest

+3

Trình biên dịch thường viết một lệnh đọc hoặc viết đơn giản mỗi khi bộ nhớ được truy cập. Nhưng bạn sẽ cần mọi lệnh như vậy để được thay thế bằng một cuộc gọi đến một hàm thư viện đã thực hiện bảo vệ thời gian chạy mà bạn đang tìm kiếm. –

+0

... và nếu bạn đang đi đến mức độ cực đoan đó, bạn cũng có thể chỉ chuyển chương trình của mình sang ví dụ: Python hoặc Lua và được thực hiện với nó. Bạn sẽ nhận được hiệu suất tốt hơn và có khả năng ổn định tương tự. –

0

Phụ thuộc vào nền tảng ứng dụng nào sẽ chạy. Có công nghệ được gọi là Loại-Safe Language (ATS, ví dụ) có thể bảo vệ khỏi lỗi phần mềm. Và các ngôn ngữ như vậy có thể có hiệu suất tốt (ví dụ như ATS).

1

Các hệ thống ít MMU có mặt trong một số giải pháp được nhúng.

Bộ nhớ được quản lý bằng mã hạt nhân. Toàn bộ bộ nhớ (heap) được chia thành nhiều danh sách các kích cỡ khác nhau (danh sách đống có thể có kích thước 4 byte, 8 byte, 16 byte ..... tối đa 1024 byte) và có một tiêu đề được gắn với mỗi khối heap cho biết khối heap đặc biệt được lấy hay không. Vì vậy, khi bạn cần gán một khối heap mới, bạn có thể duyệt qua các danh sách đống và xem khối heap nào là miễn phí và có thể gán chúng cho ứng dụng yêu cầu. Và cũng giống như trường hợp khi bạn giải phóng một khối heap có kích thước cụ thể, các tiêu đề của khối đó được cập nhật để phản ánh rằng nó đã được giải phóng.

Bây giờ, việc triển khai này phải xử lý kịch bản khi ứng dụng yêu cầu kích thước khối heap cụ thể và kích thước của danh sách đống đầy. Trong trường hợp đó, bạn chia nhỏ khối từ kích thước tiếp theo của danh sách heap hoặc kết hợp các khối heap có kích thước nhỏ hơn và thêm vào danh sách heap có kích thước được yêu cầu.

Triển khai thực hiện đơn giản hơn nhiều so với dường như.

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