Hướng dẫn python bytecode virtual machine - máy ảo mã byte python
Trước tiên, bạn sẽ cần viết một trình biên dịch Python (không phải trình thông dịch), bằng bất kỳ ngôn ngữ nào, tốt nhất là Python. Lần chạy đầu tiên của trình biên dịch sẽ cần được chạy qua trình thông dịch. Show Sau đó, bạn sẽ biên dịch trình biên dịch của mình với chính nó, dẫn đến một trình biên dịch gốc không cần trình thông dịch. Sau đó, bạn có thể sử dụng trình biên dịch để biên dịch bất kỳ Python nào cho mã gốc. Quá trình này được gọi là bootstrapping, và được nhiều người, nếu không phải là hầu hết, các trình biên dịch chính cho nhiều ngôn ngữ. Bạn có thể đọc thêm về quy trình này tại đây: http://en.wikipedia.org/wiki/bootstrapping_(compilers) Đối với việc tạo một hệ điều hành, bạn sẽ cần phải thực hiện, ở mức tối thiểu, một trình thông dịch Python, nếu bạn muốn tránh mã được biên dịch. Nếu bạn viết một trình thông dịch Python làm vi mạch, bạn có thể viết phần còn lại của hệ điều hành trong Python. (Chỉnh sửa: Tôi đã vô tình mô tả Cleese, mà Jiaaro đã đề cập :))
trừu tượngTuyên bố Động lực Tuyên bốĐộng lực Các ràng buộc tĩnh trên các hướng dẫn mã byte Động lựcCác ràng buộc tĩnh trên các hướng dẫn mã byte Các ràng buộc tĩnh trên toán hạng hướng dẫn mã byte Các ràng buộc cấu trúc giữa các hướng dẫn mã byte Có thể hình dung, mã byte không được hình thành có thể khai thác trình thông dịch và cho phép mã byte Python thực thi các hướng dẫn máy cấp C tùy ý hoặc sửa đổi các cấu trúc dữ liệu nội bộ riêng tư trong trình thông dịch. Nếu được sử dụng khéo léo, điều này có thể lật đổ bất kỳ hình thức chính sách bảo mật nào mà ứng dụng có thể muốn áp dụng cho các đối tượng của nó. Trên thực tế, một người dùng độc hại sẽ rất khó để tiêm mã byte không hợp lệ vào PVM cho mục đích khai thác, nhưng không phải là không thể. Các cuộc tấn công tràn bộ nhớ và các cuộc tấn công ghi đè bộ nhớ thường được hiểu, đặc biệt khi tải trọng khai thác được truyền không được mã hóa trên mạng hoặc khi một điểm yếu cho phép tệp hoặc bảo mật mạng được sử dụng làm chỗ đứng cho các cuộc tấn công tiếp theo. Lý tưởng nhất là không có mã byte nào được phép đọc hoặc ghi các cấu trúc dữ liệu cấp C bên dưới để lật đổ hoạt động của PVM, cho dù mã byte có được chế tạo độc hại hay không. Một bước xác minh trước khi thực hiện đơn giản có thể đảm bảo rằng ByteCode không thể vượt quá/làm nền tảng cho ngăn xếp giá trị hoặc truy cập các khu vực nhạy cảm khác của không gian chương trình PVM khi chạy. PEP này đề xuất một số bước xác nhận nên được thực hiện trên mã byte python trước khi nó được thực thi bởi PVM để nó biên dịch với các ràng buộc cấu trúc và tĩnh trên các hướng dẫn và toán hạng của chúng. Các bước này rất đơn giản và bắt được một lớp lớn mã byte không hợp lệ có thể gây ra sự cố. Cũng có một số khả năng rằng một số kiểm tra thời gian chạy có thể được loại bỏ phía trước bằng một thẻ xác minh. Tất nhiên, không có cách nào để xác minh rằng mã byte là hoàn toàn an toàn, đối với mọi định nghĩa hoàn toàn và an toàn. Ngay cả với việc xác minh mã byte, các chương trình Python có thể và rất có thể trong tương lai sẽ bị lỗi vì nhiều lý do và tiếp tục gây ra nhiều loại lỗi thời gian chạy khác nhau, gây tử vong hay không. Bước xác minh được đề xuất ở đây chỉ đơn giản là cắm một lỗ dễ dàng có thể gây ra một lớp lớn các lỗi gây tử vong và tinh tế ở cấp độ byte. Hiện tại, máy ảo Java (JVM) xác minh mã byte Java theo cách rất giống với những gì được đề xuất ở đây. Do đó, đặc điểm kỹ thuật của JVM phiên bản 2 [1], phần 4.8 và 4.9 được sử dụng làm cơ sở cho một số ràng buộc được giải thích dưới đây. Bất kỳ việc thực hiện xác minh mã Python nào ở mức tối thiểu phải thực thi các ràng buộc này, nhưng có thể không giới hạn ở chúng. Các ràng buộc tĩnh trên các hướng dẫn mã byte
Các ràng buộc tĩnh trên toán hạng hướng dẫn mã byte
Các ràng buộc cấu trúc giữa các hướng dẫn mã byte
Thực hiệnPEP này là tài liệu làm việc cho triển khai xác minh mã Python byte được viết bằng Python. Việc triển khai này không được PVM sử dụng ngầm trước khi thực hiện bất kỳ mã byte nào, nhưng sẽ được sử dụng rõ ràng bởi người dùng liên quan đến Bytecode không hợp lệ với đoạn trích sau: import verify verify.verify(object) Mô -đun Nếu mã được hình thành tốt, cuộc gọi đến Phillip Eby đã đề xuất một thuật toán mã giả cho xác minh độ sâu ngăn xếp mã byte được sử dụng bởi việc thực hiện tham chiếu. Vấn đề xác minhPEP này chỉ mô tả một số lượng nhỏ các xác minh. Mặc dù thảo luận và phân tích sẽ dẫn đến nhiều hơn nữa, nhưng rất có khả năng xác minh trong tương lai có thể cần phải được thực hiện hoặc xác minh tùy chỉnh theo dự án. Vì lý do này, có thể mong muốn thêm giao diện đăng ký xác minh vào việc thực hiện thử nghiệm để đăng ký các bộ xác minh trong tương lai. Nhu cầu về điều này là tối thiểu vì các bộ xác minh tùy chỉnh có thể phân lớp và mở rộng triển khai hiện tại cho hành vi bổ sung. Thay đổi cần thiếtArmin Rigo lưu ý rằng một số mã byte sẽ cần sửa đổi để hiệu ứng ngăn xếp của chúng được phân tích tĩnh. Đây là PEP này không đề xuất thêm bước xác minh vào trình thông dịch, mà chỉ để cung cấp triển khai Python trong thư viện tiêu chuẩn để sử dụng tùy chọn. Việc thủ tục xác minh này có được dịch thành C hay không, đi kèm với PVM hoặc được thực thi theo bất kỳ cách nào được để lại để thảo luận trong tương lai. Người giới thiệuBản quyềnTài liệu này đã được đặt trong phạm vi công cộng. |