Phát triển hệ điều hành trong câu hỏi C ++


9

Là một dự án của Master, tôi đang thiết kế một hệ điều hành đơn giản. Nó đang được thiết kế để chạy ở Chế độ thực 16 bit trên kiến ​​trúc x86. Lý tưởng nhất, tôi muốn phát triển HĐH này trong C ++ và chỉ sử dụng lắp ráp khi cần thiết. Cho đến nay, tôi có một bộ tải khởi động được viết bằng cách lắp ráp, tải một kernel là sự pha trộn giữa C ++ và asm. Câu hỏi của tôi liên quan đến việc sử dụng C ++. Đến bây giờ, nó đã được biên dịch và có thể chạy, nhưng tôi chưa sử dụng bất kỳ phân bổ bộ nhớ động nào.

Nếu tôi đang sử dụng C, sẽ rất hợp lý khi viết các hàm malloc sẽ xử lý cấp phát bộ nhớ, nhưng trong C ++, từ khóa mới được sử dụng. Vì thế...

Làm thế nào 'cái mới' hoạt động đằng sau hậu trường để phân bổ bộ nhớ, và tôi sẽ xử lý vấn đề này như thế nào?

Và như một hệ quả tất yếu ...

Liệu có ý nghĩa gì khi cố gắng sử dụng C ++ để tận dụng lợi thế của mức độ cao hơn? Hoặc sẽ đau đầu hơn khi sử dụng nó và tôi có nên gắn bó với C không?

Vui lòng cung cấp lý do nếu bạn tin rằng C ++ sẽ không phải là một lựa chọn tốt.

Câu trả lời:


9

Các newtay từ khóa tắt việc phân bổ thực tế để operator new, mà cư xử khá tương tự như malloc: nó được nhớ từ đâu đó. Trình biên dịch sau đó sẽ làm tất cả các phép thuật xây dựng. Do đó, trình biên dịch C ++ sẽ mong đợi lib thời gian chạy C ++ (hoặc mã của bạn) sẽ cung cấp một triển khai operator new.

Nó chắc chắn có ý nghĩa để sử dụng C ++ cho một số trừu tượng nhất định. Không có lý do tại sao một hệ điều hành nên tự lăn std::list<>. Ngoại lệ là rắc rối hơn nhiều. Ở giữa có một độ dốc từ hữu ích đến những thứ vô dụng. std::complex? Nó hoạt động hoàn hảo, nhưng tại sao bạn cần nó?


5

Nhiều ưu điểm của C ++ so với C không liên quan gì đến hỗ trợ thời gian chạy và trong những trường hợp đó thực sự không có sự khác biệt giữa mã được viết bằng C và mã được viết bằng C ++. Mẫu, ví dụ, không làm bất cứ điều gì trong thời gian chạy. Họ không làm gì bạn không thể làm với rất nhiều gõ thêm. C ++ là một ngôn ngữ rất hợp lý để viết các hệ điều hành, vì nó cung cấp quyền truy cập ở mức độ thấp khi bạn cần, kết hợp với các khái niệm trừu tượng ở cấp độ cao hơn C khi bạn không cần phải tập trung vào việc xoay vòng bit.

newthực hiện hai điều: nó lấy bộ nhớ từ một nơi nào đó và nó chạy bất kỳ hàm tạo cần thiết nào. Trong việc có được bộ nhớ, nó không khác malloc.


3

Có lẽ sẽ hợp lý khi đưa ra một ý tưởng sơ bộ về mã thường được tạo cho một newbiểu thức. Nó được tạo bởi trình biên dịch, nhưng nếu bạn đang thực hiện nó như là một hàm, nó sẽ trông giống như thế này:

template <class T>
T *new_object() { 
    void *raw_data = ::operator new(sizeof(T));
    return new(raw_data) T;
}

Nếu bạn quan tâm đến cách thức newhoạt động, việc theo dõi (gần như) không thể tránh khỏi là cách deletehoạt động:

template <class T>
void delete_object(T const *object) { 
    object->~T();
    ::operator delete(object);
}

Như những người khác đã chỉ ra, ::operator new::operator deletelà các cấp phát bộ nhớ khá cơ bản. Ví dụ, trên một hệ thống giống như Unix, họ có thể gọi một cái gì đó giống như brkhoặc sbrkphân bổ các khối bộ nhớ lớn, và sau đó phân phát các khối nhỏ hơn từ các khối lớn đó. Trong hệ điều hành của riêng bạn, bạn vẫn có thể muốn một số loại tương tự sbrkvà tương tự - thứ gì đó bắt đầu với tất cả bộ nhớ là "miễn phí" và phân bổ các phần bộ nhớ khi cần. Cho rằng bạn đang làm việc ở chế độ thực, điều đó có thể sẽ khá đơn giản - với số lượng bộ nhớ nhỏ có sẵn, một thiết kế thực tế gần như cần nhấn mạnh kích thước nhỏ so với các thuật toán phức tạp.


-4

Hầu hết các hệ điều hành được viết bằng CI nghĩ. Mặt khác, đó là một dự án của bậc thầy, vì vậy hãy làm điều gì đó khác biệt và thú vị.


1
Hầu hết các hệ điều hành lớn ban đầu được viết trước khi C ++ có sẵn. Điều đó hạn chế sự lựa chọn. :-)
Bo Persson

1
đôi khi tôi nghĩ downvote là truyền nhiễm.
Kevin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.