Title Image

Blog Logo

🌱 MPU - Memory Protection Unit (1)

🌱 MPU - Memory Protection Unit (1)

    Đối với các hệ thống lớn, ngoài Memory Leak thì việc phân vùng quản lý các bộ nhớ cũng rất quan trọng. Đôi khi chúng ta đang sử dụng vùng nhớ này, người khác cũng nhảy vào vùng nhớ đó, hoặc người dùng truy cập vào một số vùng nhớ quan trọng, cần được bảo vệ mà không hề biết gì, gây ra những vấn đề nghiêm trọng trong hệ thống. 

    ➤ Vì vậy, nhà sản xuất Vi điều khiển luôn cung cấp những cơ chế, những ngoại vi để phân vùng và quản lý các vùng nhớ. Một trong những cơ chế cơ bản và phổ biến nhất đó là MPU - Memory Protection Unit. 

    👉 MPU là gì?

    MPU - Memory Protection Unit là một ngoại vi có thể lập trình được (Thường là ngoại vi Core, giống như System Tick hay NVIC), sử dụng để phân vùng và xác định quyền truy cập bộ nhớ. 

    ⇨ Hầu hết các dòng STM32 nói riêng và Vi điều khiển 32 bit nói chung đều hỗ trợ MPU 😊

    MPU có thể giám sát các công việc như tìm nạp lệnh, truy cập dự liệu từ processor, và nó thể trigger một Fault Exception khi mà có một truy cập nào đó không hợp lệ - chẳng hạn như chúng ta setup bảo vệ không cho đọc ghi vùng nhớ Flash, nếu người dùng cố tình đọc/ghi vào thì sẽ dẫn đến một fault (chẳng hạn HardFault).

    Tuỳ thuộc vào bộ xử lý, các MPU trên ARM có thể hỗ trợ lên đến 16 vùng nhớ (gọi là các Regions). Mỗi Region sẽ có các thuộc tính riêng (attribute) mà người dùng có thể cài đặt (Cho phép đọc/ghi hay không, có cache hay không có cache, buffering, ...). 

    👉 Cách bắt lỗi của MPU

    Kiến trúc ARM sử dụng Memory Memagement Fault (Chính là MemManage Exception), mỗi khi trigger các lỗi khi có một truy cập không hợp lệ vào một vùng nhớ được bảo vệ. Ngoài ra, nhiều dòng chip còn cho phép sử dụng cả HardFault để thông báo lỗi truy cập.

    Khi có lỗi truy cập xảy ra, các lỗi cụ thể sẽ được thông báo trong thanh ghi trạng thái lỗi (MMFSR - MemManage Fault Status Register), và địa chỉ gây ra lỗi sẽ được báo trong thanh ghi địa chỉ lỗi (MMFAR - MemManage Fault Status Register). 

    Với việc có thể triển khai lại các hàm Exception Handler và đọc các thanh ghi lỗi này, chúng ta hoàn toàn có thể nắm được lỗi khi có một truy cập trái phép vào vùng nhớ được bảo vệ. Điều này có thể có nhiều lợi ích, chẳng hạn như triển khai một RTOS với các vùng nhớ độc lập trên mỗi thread, hoặc các ứng dụng Multicore có share vùng nhớ.

    👉 Một số đặc điểm cơ bản của MPU

    MPU cung cấp tối đa 8/16 Region tùy dòng, có thể cấu hình được, tùy vào người dùng muốn bao nhiêu Region, với các đặc điểm:

  • Kích thước nhỏ nhất có thể lập trình mỗi Region là 32 Bytes.
  • Kích thước tối đa của mỗi Region là 4GB, và phải là bộ số của 32 Bytes.
  • Tất cả các Region phải bắt đầu với địa là aligned 32 bytes
  • Các Region độc lập với nhau về quyền đọc/ghi cho cả chế độ Privileged và Un-Priviledge.
  • Thuộc tính XN - eXecure Never cho phép phân tách vùng code và vùng data.
  • Các Region có thể Overlap và các địa chỉ trong vùng Overlap sẽ có thuộc tính của Region có mức ưu tiên cao hơn (Region Number càng lớn thì mức ưu tiên càng lớn - Ví dụ Region 4 có mức ưu tiên cao hơn Region 0).
MPU

    Đối với ngoại vi MPU của Core, sẽ có một bộ thanh ghi để cấu hình cho việc phân vùng, và các thuộc tính của mỗi vùng. Chi tiết về các thuộc tính cũng như những thanh ghi cấu hình sẽ được giới thiệu ở bài viết sau!

>>>= Follow ngay =<<<

Để nhận được những bài học miễn phí mới nhất nhé 😊

Chúc các bạn học tập tốt 😊

Đăng nhận xét

0 Nhận xét