2014-09-12 16 views
5

Tôi đang viết một hệ điều hành nguyên khối (Đó là một trò đùa để gọi nó là một hệ điều hành nhưng nó có rất ít, các nhà chức năng cấp trường). Khi tôi nói nguyên khối, ý tôi là, nó được biên dịch như một đốm màu nhị phân đơn và không hỗ trợ cho hệ thống tệp. Hiện tại tôi chỉ có một không gian người dùng đơn giản thô sơ, không có gì ngoài vòng lặp vô hạn.Thoát khỏi ứng dụng trong hệ điều hành mà không có sự phân tách bộ nhớ

Tôi đang lên kế hoạch làm cho hệ điều hành của mình hữu ích hơn và muốn có thể viết các ứng dụng của người dùng có thể chấm dứt giống như các ứng dụng thông thường trên hệ điều hành toàn diện.

Tôi không có glibc hoặc tương đương. Thư viện hiện tại của tôi trong không gian người dùng là mã mà tôi đã viết. Bây giờ vấn đề của tôi là làm thế nào để thêm một khuôn khổ cho các ứng dụng không gian người dùng, mà sẽ cho phép họ chấm dứt trong một điểm sửa chữa.

Tôi biết cách chương trình được biên dịch trên hệ thống thông thường và điều gì sẽ xảy ra khi chương trình chấm dứt. Tuy nhiên, trong trường hợp của tôi, tôi không có sang trọng để biên dịch các chương trình chống lại các thư viện và nếu một chương trình chấm dứt thì con trỏ chỉ của tôi chỉ đi trên một đường vòng hoang dã.

Hiện tại tôi đang làm cho tất cả các ứng dụng thực hiện "cuộc gọi trở lại" và tôi đang điền sẵn ngăn ứng dụng với địa chỉ sửa (trong khi khởi chạy). Có cách nào tốt hơn để xử lý sự cố không?

Cùng với câu trả lời, tôi sẽ rất vui khi nhận được sự rõ ràng về một số khái niệm hệ điều hành.

Tôi đang làm việc trên nền tảng giả lập x86 và biên dịch nhị phân tĩnh của mình. (Tôi có hỗ trợ bộ nhớ ảo)

+3

Tôi chắc chắn phiên bản đầu tiên của Linux cũng là một trò đùa. Đừng quá nhanh lòng tự ti :-) – paxdiablo

+0

Bạn đang hỏi về một vấn đề cụ thể với chồng ứng dụng hay bạn đang hỏi về điều gì đó khác? – jxh

+0

Tôi đang hỏi về các giải pháp chấm dứt ứng dụng trong một địa chỉ cố định. Hiện tại tôi đã thực hiện một tuyến đường mà mọi ứng dụng đều có địa chỉ trả về cố định mà tôi điền vào ngăn xếp. Bây giờ, tôi đang tìm kiếm một giải pháp tốt hơn. –

Trả lời

3

Tạo thủ công khung ngăn xếp đầu tiên có trả về bất kỳ mã dọn dẹp quy trình nào bạn cần chạy có vẻ như là một phương pháp hoàn toàn hợp lý. Nếu hệ điều hành của bạn có "syscalls" thì mã dọn dẹp quy trình sử dụng không gian người dùng (có thể được gọi là exit()) có thể kết thúc bằng một cuộc gọi đến syscall _exit(). Bạn vẫn cần xử lý trường hợp chương trình cố gắng thực thi mã trong '' la-la land '' bởi vì điều đó vẫn có thể xảy ra (tuy nhiên làm điều đó trước khi bạn có một hệ thống bảo vệ trang có thể là một vấn đề khó).

+0

Vâng, giải pháp hiện tại của tôi chính xác như những gì bạn đã đề cập. Mỗi ứng dụng của tôi không quay trở lại một địa chỉ cố định và nó được cập nhật trong một thường trình tương đương với lối ra. Sau đó, tôi đi và làm một syscall và làm không gian người dùng cần thiết và dọn dẹp không gian hạt nhân cho ứng dụng đó. Tuy nhiên, tôi không thể có một ứng dụng mà không làm một trở lại. ("Ret gọi" trong đất x86). Tôi đang cố gắng đạt được điều đó với một số tin tặc. –

+0

Bạn có thể có các ứng dụng không trả lại khá nhiều trong mọi hệ điều hành: 'int main (void) {do {} trong khi (1); } ' –

+0

Ồ có thể là từ ngữ của tôi không đúng. Tôi không thể có một ứng dụng như thế này void chính (void) {int j = 2;}. Khi lối ra của ứng dụng này đi vào La La Land. Tuy nhiên int main (void) {int j = 2; return;} không gây ra bất kỳ vấn đề nào vì nó có một câu lệnh return sẽ đưa tôi đến một thói quen dọn dẹp. –

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