2009-04-16 32 views

Trả lời

19

Bản thân Oracle có một trang đoạn mã nhỏ về cách hoạt động here.

Về cơ bản, JRE không tin tưởng JDK. Đó là bởi vì nó không có kiến ​​thức về trình biên dịch JDK nào đã tạo ra tệp lớp. Nó xử lý các tập tin lớp như thù địch cho đến khi xác minh.

Mở rộng trên đó, xác minh bytecode là một bước cần thiết để bảo vệ những gì mà Sun gọi là "trình biên dịch thù địch". Trình biên dịch Java của Sun đảm bảo mã nguồn Java không vi phạm các quy tắc an toàn, nhưng khi một ứng dụng nhập một đoạn mã, nó không thực sự là biết nếu đoạn mã tuân theo các quy tắc ngôn ngữ Java về an toàn. Nói cách khác, mã có thể không được sản xuất bởi trình biên dịch Java đáng tin cậy.

Trong trường hợp đó, hệ thống thời gian chạy Java trên máy của bạn phải giả định rằng phân đoạn đó là không hợp lệ và là đối tượng của nó để xác minh bytecode.

Máy ảo Java thậm chí không xem bytecode cho đến khi nó trải qua quá trình xác minh này. Làm điều này như bytecode được nạp cũng có lợi thế là toàn bộ rất nhiều kiểm tra thời gian chạy không cần phải được thực hiện mỗi khi mã được thực thi.Bởi vì nó đã được xác nhận là chính xác, nó có thể, một khi nó bắt đầu chạy, chạy nhanh hơn nếu không thì sẽ có thể.

Một rendition của sơ đồ liên kết dưới:

    <<<=== Unsafe/Safe ===>>> 
            \ 
+---------------+  +-------------------+ 
| Java source | +--> | Class loader | --+ 
+---------------+ | | Bytecode verifier | | 
     |   | +-------------------+ | 
     V   |   /   | 
+---------------+ |    \    V 
| Java compiler | Network  / +-------------------+ 
+---------------+ |    \ |  JVM/JIT  | 
     |   |   / +-------------------+ 
     V   |    \    | 
+---------------+ |   /   V 
| Java bytecode | --+    \ +-------------------+ 
+---------------+    / | Operating system | 
            \ +-------------------+ 
           /   | 
            \    V 
           / +-------------------+ 
            \ |  Hardware  | 
           / +-------------------+ 
            \ 
        <<<=== Unsafe/Safe ===>>> 
+2

+1 cho hoang tưởng :) – dfa

+0

Vấn đề không chỉ là trình biên dịch độc hại. Nếu ai đó thực sự cố gắng để viết một khai thác, họ có thể viết bytecode bằng tay, hoặc ít nhất là phần quan trọng. – Antimony

+0

Nhưng trình xác minh không được bật (hoặc được thi hành) cho các lớp được nạp từ CLASSPATH địa phương đúng không? –

9

Nguồn thông tin tốt nhất có lẽ là phần có liên quan trong đặc điểm kỹ thuật JVM, 4.10 Verification of class Files.

Xem các liên kết để biết chi tiết, nhưng rộng rãi:

xác minh liên kết thời gian làm tăng hiệu suất của người phiên dịch. Kiểm tra chi phí mà nếu không sẽ phải được thực hiện để xác minh các ràng buộc tại thời gian chạy cho mỗi lệnh giải nghĩa có thể được loại bỏ. Máy ảo Java có thể giả định rằng các kiểm tra này đã được thực hiện. Ví dụ: Máy ảo Java sẽ biết những điều sau:

  • Không có luồng tràn hoặc tràn dòng toán hạng.
  • Tất cả các biến và sử dụng biến cục bộ đều hợp lệ.
  • Các đối số cho tất cả các hướng dẫn của Máy ảo Java có các loại hợp lệ.

Trình xác minh cũng thực hiện xác minh có thể được thực hiện mà không cần nhìn vào mảng mã của thuộc tính Mã (§4.7.3). Séc được thực hiện bao gồm:

  • Đảm bảo rằng các lớp cuối cùng không được phân loại và phương thức cuối cùng không bị ghi đè (§5.4.5).
  • Kiểm tra xem mọi lớp học (trừ Object) có lớp cha trực tiếp hay không.
  • Đảm bảo rằng nhóm không đổi thỏa mãn các ràng buộc tĩnh được ghi lại; ví dụ, mỗi cấu trúc CONSTANT_Class_info trong hồ bơi không đổi chứa trong mục name_index mục của nó là chỉ số hồ bơi không đổi hợp lệ cho cấu trúc CONSTANT_Utf8_info.
  • Kiểm tra tất cả tham chiếu trường và tham chiếu phương thức trong nhóm không đổi có tên hợp lệ, lớp hợp lệ và mô tả kiểu hợp lệ.
+0

Có một vài trường hợp góc che khuất nơi đặc tả là mơ hồ hoặc hoàn toàn vi phạm bởi Hotspot VM. Nếu bạn chắc chắn rằng bytecode của bạn nên xác minh và không thể tìm ra lý do tại sao nó không, bạn cũng có thể hãy xem kho lưu trữ nguồn OpenJDK. – Antimony

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. - [Từ đánh giá] (/ review/low-quality-posts/10765467) –

+0

@ AndréFratelli: Và quả thực nó không phải là câu trả lời tôi muốn thêm bây giờ (lưu ý rằng nó gần 7 tuổi ...). Nó không phải là một câu hỏi tôi muốn * trả lời * ngay bây giờ, thay vì đóng nó quá rộng. Tôi đã thêm * một số * chi tiết ở đây, nhưng nếu liên kết bị phá vỡ một lần nữa (nó đã được cố định hai lần ngày hôm nay, theo những cách khác nhau) nó vẫn sẽ không được hữu ích khủng khiếp. Đồng thời, trong khi câu hỏi vẫn chưa được xóa, tôi nghĩ rằng đó là một câu trả lời hữu ích để có ... –

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