Câu chuyện về lỗi Hubris: Ai đã giết chết bộ chuyển mạch mạng?
-
Hubris là gì?
- Hubris là một hệ điều hành dành cho các hệ thống nhúng sâu, được thiết kế cho những máy tính không được nhận diện là máy tính, như bên trong bàn phím.
- Nó được phát triển để xử lý mọi công việc cần thiết nhằm khởi động các bộ xử lý lớn trong Oxide Rack.
- Hubris khá độc đáo, và những phần liên quan đến câu chuyện sẽ được giải thích bên dưới.
-
Hiện trường vụ án
- Arjen Roodselaar, đồng nghiệp phụ trách firmware bộ chuyển mạch mạng của Oxide, đang thử nghiệm các thay đổi về trình tự cấp nguồn và cấu hình xung nhịp.
- Sau một thay đổi nhỏ, đột nhiên bộ chuyển mạch không còn khởi động được nữa.
- Một phần firmware vẫn phản hồi, nhưng phần quan trọng chịu trách nhiệm về trình tự cấp nguồn thì đã dừng lại.
-
Khai thác nhiều hơn từ lượng RAM hạn chế
- Các vi điều khiển giá rẻ dùng Hubris có RAM và flash rất hạn chế.
- Hubris được cấu thành từ nhiều chương trình được biên dịch riêng biệt gọi là task, nên có yêu cầu tài nguyên hơi cao hơn một chút so với các hệ điều hành khác.
- Đồng nghiệp Matt Keeter gần đây đã làm cho hệ thống thông minh hơn để cố gắng đóng gói các task nhiều nhất có thể bằng cách sử dụng nhiều vùng lũy thừa của 2.
-
Khẩu súng còn bốc khói
- Arjen đã dùng Humility, trình gỡ lỗi của Hubris, để điều tra bộ chuyển mạch mạng bị lỗi.
- Anh dùng lệnh
humility tasksđể in ra danh sách các task đang chạy trên bộ xử lý cùng thông tin trạng thái. - Anh phát hiện task phụ trách trình tự cấp nguồn đã khởi động lại 115 lần do lỗi bộ nhớ.
-
Mở rộng cơ chế mượn của Rust qua các task trong IPC của Hubris
- Các task trong Hubris có thể gửi thông điệp cho nhau thông qua IPC.
- Các thông điệp này trông và hoạt động rất giống lời gọi hàm.
- Khi một task cho task khác mượn bộ nhớ, nó không được phép cố cho mượn vùng nhớ mà trên thực tế nó không sở hữu.
-
Khi các tính năng quay sang tấn công
- Hai tính năng có thể kết hợp lại và trở thành một lỗi.
- Việc đóng gói task hoạt động theo kiểu cơ hội trong hệ thống build.
- Nếu kích thước của task A thay đổi một chút, vị trí ranh giới vùng MPU của task B không liên quan cũng có thể bị dịch chuyển.
-
Cuộc gọi từ bên trong!
- Thuật toán bảo vệ bộ nhớ cần phải được thay đổi.
- Cần cho phép vùng nhớ được cho mượn vượt qua ranh giới vùng MPU.
-
Thất bại cùng Hubris
- Có nhiều điều đã không xảy ra khi hệ thống gặp sự cố.
- Bộ chuyển mạch mạng bị hỏng đã có thể được sửa chỉ trong 3 giờ.
- Khả năng cô lập lỗi, thất bại theo hướng an toàn, bộ nhớ chia sẻ an toàn, đồng thiết kế kernel-trình gỡ lỗi, sự đơn giản trong thiết kế và triển khai, cùng sự gắn kết chặt chẽ và phi phân cấp của cả nhóm đều đã giúp ích.
Ý kiến của GN⁺
- Bài viết này cho thấy tầm quan trọng của thiết kế phần mềm vững chắc ngay cả trong các hệ thống phức tạp, thông qua quá trình tìm ra và khắc phục một lỗi phát sinh trong hệ điều hành Hubris.
- Quá trình phát hiện và sửa lỗi nhấn mạnh tầm quan trọng của làm việc nhóm và các công cụ gỡ lỗi hiệu quả trong việc giải quyết những vấn đề phức tạp của kỹ thuật phần mềm.
- Bài viết cho thấy các tính năng cô lập hệ thống và quản lý sự cố quan trọng như thế nào khi sử dụng một hệ thống như Hubris. Điều này có thể cải thiện đáng kể độ ổn định và khả năng bảo trì của hệ thống.
- Bài viết cũng cho thấy cách sử dụng Rust, một ngôn ngữ lập trình an toàn, để đảm bảo an toàn bộ nhớ và giảm thiểu lỗi. Trong các hệ thống dùng Rust, những loại lỗi như vậy hiếm khi xảy ra, và điều đó chứng minh các đảm bảo an toàn bộ nhớ của Rust thực sự hiệu quả đến mức nào.
- Những dự án hoặc sản phẩm khác có tính năng tương tự gồm seL4, FreeRTOS, Zephyr; đây đều là các hệ điều hành cho hệ thống nhúng với mục đích và đặc tính khác nhau.
- Khi áp dụng một hệ thống như Hubris, cần cân nhắc các yếu tố như giới hạn bộ nhớ, quản lý task và thiết kế cơ chế IPC. Lợi ích của việc chọn những hệ thống như vậy nằm ở thiết kế hệ thống vững chắc và quản lý bộ nhớ an toàn, còn nhược điểm có thể là độ phức tạp của hệ thống và đường cong học tập.
1 bình luận
Ý kiến trên Hacker News
Đánh giá mã kernel Hubris
Lời khen cho tin tuyển dụng
Rà soát mã và đề xuất
TaskDesc::regions.Đánh giá về quá trình gỡ lỗi
Quan tâm đến văn hóa của đội ngũ Oxide
Liên kết thông tin liên quan
Đồng cảm với vấn đề phát sinh khi gỡ lỗi
Đề xuất về cách xử lý phần cứng
Lời khen cho công việc của Oxide
Phản ứng với tên hệ điều hành