Giới thiệu về hệ thống tracing của Linux kernel.

Chủ đề này khá mới lạ với đa số mọi người nhưng nó lại có nhiều ứng dụng trong thực tế. Vì vậy mình muốn được chia sẻ một số hiểu biết của mình về nó.

1. Hệ thống tracing của Linux kernel là gì?

Nó là tính năng cho phép chèn break point lúc kernel đang chạy. (Cái này không cần build kernel với option debug). Từ các break point chúng ta có thể giám sát bất cứ đoạn code nào của kernel.

2. Hệ thống tracing hoạt động thế nào?

Hệ thống tracing của kernel bao gồm các Probe point (break point). Trong đó các probe point có thể hiểu giống như các điểm break point khi chúng ta sử dụng gdb. Điểm khác biệt lớn nhất với break point của dgb đó là probe point chỉ có thể chèn vào câu lệnh đầu tiên hoặc cuối cùng của hàm, probe point có thể chèn vào bất cứ chức năng nào, và nó được chèn khi kernel đang chạy. Probe point có thể chèn vào bất cứ kernel nào mà không cần option build kernel nào đặc biệt. Thông thường, nếu lập trình viên muốn giám sát 1 probe point thì họ sẽ đăng ký 1 call back function vào probe point đó. Mỗi khi kernel thực thi qua probe point sẽ dừng luồng xử lý hiện tại và gọi ra call back của họ. Nhờ vậy mà người lập trình có thể dùng nó để giám sát các tham số của mã nguồn (source code) mà họ mong muốn, ví dụ như giá trị của các biến.

3. Các ứng dụng của hệ thống tracing:

  • Debugging
    Thông thường khi phát hành sản phẩm, chúng ta sẽ tắt lựa chọn CONFIG_DEBUG_KERNEL để tăng tốc độ của hệ thống. Do vậy khi cần debug, chúng ta có thể viết 1 kernel module, chèn probe point vào các hàm mà chúng ta cần, thông qua call back function chúng ta có thể xem được giá trị của các biến mà chúng ta cần. Cách debug như này không hiệu quả như dùng kdb nhưng lại có thể dùng cho tất cả các bản kernel mà không cần option build nào đặc biệt.
  • Runtime patching
    Ngoài khả năng xem giá trị các biến thì hệ thống probe point còn có thể sửa được giá trị của các thanh ghi của CPU tại thời điểm đó. Lấy ví dụ trong probe point của hàm A, nếu chúng ta sửa giá trị của thanh ghi IP (Instruction pointer) của CPU để trỏ sang địa chỉ của hàm B thì sau khi thực thi xong call back trong probe point, CPU sẽ không chạy tiếp hàm A mà sẽ chạy hàm B. Việc này cũng giống như chúng ta đã thay thế code của hàm A thành hàm B. Runtime patching được ứng dụng trong việc cập nhật các bản vá lỗi cho kernel mà không cần khởi động lại hệ thống hoặc sửa lỗi cho driver mà không cần unload kernel module.
  • Antivius và security
    Việc chèn probe point và monitor các biến tại bất cứ điểm nào trong kernel cho phép chúng ta viết các kernel module có thể monitor tất cả hoạt động của hệ điều hành. Thông qua việc giám sát chúng ta có thể phát hiện ra sự hoạt động của các antivirus cũng như các phần mềm độc hại.
  • Performance test
    Việc chèn probe point vào đầu và cuối các hàm cho phép chúng ta biết được thời gian thực thi đoạn code đó cũng như số lần thực thi. Nhờ đó có thể thực hiện các bài kiểm tra đo lường về hiệu suất.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top