Làm cách nào để tạo một hệ điều hành nhỏ trên một máy tính để bàn cũ? [đóng cửa]


111

Điều này có thể là vô ích, vì tôi biết việc viết một hệ điều hành phức tạp đến mức không thể chịu nổi (đặc biệt là với bản thân).

  • Tôi không mong đợi xây dựng Linux hoặc cửa sổ tiếp theo.

  • Tôi biết nó sẽ rất kinh khủng, và lỗi, và sẽ không hoạt động, nhưng điều đó ổn.

Tôi muốn tự mình viết mọi thứ bằng Assembly , C và (một số) C ++ .

Đây là một dự án trong tương lai, vì hiện tại tôi đang bận một số việc khác và không có thời gian ngay lập tức, nhưng tôi nghĩ rằng tôi sẽ hỏi nó ngay bây giờ, vì vậy có lẽ tôi có thể nhận được nhiều câu trả lời cho điều này và nó có thể xây dựng và trở thành một tài nguyên hữu ích cho kiểu tiếp cận này (mọi thứ khác tôi đã thấy liên quan đến việc xây dựng từ minix, sử dụng bộ nạp khởi động hiện có, xây dựng nó trong một chương trình khởi động ảo, v.v.).

Tôi muốn thiết lập một trong những máy tính để bàn cũ của mình với màn hình, bàn phím và chuột và bắt đầu làm việc trên ổ cứng trống .

Tôi muốn học cách viết bộ nạp khởi động của riêng mình (tôi đã tìm thấy rất nhiều tài nguyên về điều này, nhưng để hoàn thiện, vui lòng thêm một số tài nguyên tốt), trình điều khiển USB của riêng tôi (nếu cần), trình điều khiển CD (nếu cần thiết ), v.v. Mọi thứ, từ đầu lên.

  • Làm cách nào để đưa mã vào máy tính? Tốt nhất là làm điều đó với đĩa mềm? Hầu hết các máy tính có thể làm điều đó từ thẻ USB không?

  • Tôi cần những trình điều khiển nào, và bạn có thể đề xuất bất kỳ tài liệu tham khảo nào để xây dựng chúng không?

  • Sau trình tự khởi động - sau đó là gì? Làm cách nào để vào chế độ được bảo vệ, v.v.

  • Làm cách nào để quản lý bộ nhớ mà không cần sự trợ giúp của hệ điều hành? Tôi chỉ cần sử dụng bất kỳ địa chỉ nào tôi muốn? Không cần khởi tạo?

  • Tôi chắc chắn sẽ gặp phải điều gì khiến tôi bối rối?

  • Làm cách nào để biến nó thành dòng lệnh O / S và một dòng đồ họa?

  • O / S đồ họa được xây dựng trên nền tảng gì? Giống như, làm cách nào để thực hiện một số thứ như, một dòng lệnh, với một phông chữ và một hình ảnh ở trên cùng?

  • Tôi có thể đọc ở đâu về cách thiết lập môi trường đa nhiệm? (ví dụ: có hai dòng lệnh giống như đồ họa chạy song song).

  • Làm cách nào để thiết lập một loại hệ thống cửa sổ? Làm cách nào để hiển thị đồ họa trên màn hình sau khi thiết lập đa nhiệm đơn giản?

Tin tôi đi, tôi hiểu rằng đây là một dự án rất phức tạp, và có lẽ tôi sẽ không bao giờ hoàn thành nó hoặc viết bất cứ thứ gì trên đó.

Còn rất nhiều phần khác về vấn đề này mà tôi chưa đề cập, nếu bạn nghĩ ra, hãy thêm chúng vào.

Vui lòng đặt một "chủ đề" cho mỗi câu trả lời - ví dụ: trình điều khiển USB, sau đó có thể là danh sách tài nguyên, những thứ cần chú ý, v.v.

Ngoài ra, vui lòng không đề xuất xây dựng O / S khác hoặc mã có sẵn. Tôi biết mình sẽ đọc rất nhiều mã có sẵn (chẳng hạn như nhân linux, hoặc tài nguyên mẫu, trình điều khiển hiện có, v.v.) nhưng cuối cùng tôi muốn tự mình viết tất cả. Tôi biết tôi nên xây dựng một cái gì đó khác, và có rất nhiều câu hỏi khác trên SO về vấn đề đó mà tôi có thể đọc nếu tôi thay đổi ý định và đi theo con đường đó. Nhưng điều này là tất cả về làm toàn bộ mọi thứ từ đầu.

Bất kỳ đề xuất nào về cách lấy đồ họa? Các chế độ video khác nhau và cách làm việc với chúng, v.v.?


14
Đây là mục tiêu lớn nhất của tôi. Tôi muốn viết một hệ điều hành rất tệ, chỉ để giải trí và học hỏi ... Tôi đã không thể dành thời gian trong vài năm qua. Nếu bạn đang từng tìm ai đó để giúp đỡ ra ngoài hoặc chỉ nói chuyện qua điều này với bạn, bạn có thể gửi email cho tôi tại schmeling88 tại gmail.com
Max Schmeling

2
@Max và @Tom, tôi cũng gặp lỗi. Tôi thực sự lấy đà để bắt đầu thời gian xung quanh này :)
Giovanni Galbo

2
Chỉ cần không nghĩ về đồ họa bây giờ. Unix không bao giờ hỗ trợ đồ họa trực tiếp và nó không quá tệ. :-) Nhưng về cơ bản không có cách nào dễ dàng và di động để vượt qua 800x600 IIRC.
Bastien Léonard


1
Tại sao? Câu hỏi này là cổ xưa và không tạo ra bất kỳ hoạt động nào nữa. Ai quan tâm?
Carson Myers

Câu trả lời:


51

Những điều đầu tiên trước tiên. Đọc, đọc, đọc, đọc, đọc. Bạn cần phải hiểu rõ về cách hoạt động của hệ điều hành trước khi có thể hy vọng triển khai hệ điều hành của riêng mình.

Lấy một trong những cuốn sách của Andrew Tanenbaum về hệ điều hành. Đây là cái mà chúng tôi đã sử dụng trong lớp học hệ điều hành của tôi ở trường đại học:

Hệ điều hành hiện đại PDF

Hệ điều hành hiện đại trên Amazon

Mặc dù có cái bìa nực cười, nhưng đây là một cuốn sách rất hay, đặc biệt là đối với sách giáo khoa. Tanenbaum thực sự là một chuyên gia trong lĩnh vực này và những giải thích của anh ấy về cách hệ điều hành hoạt động bên dưới mui xe rất rõ ràng và dễ hiểu. Cuốn sách này chủ yếu là lý thuyết, nhưng tôi tin rằng anh ấy cũng có một cuốn sách thảo luận nhiều hơn về cách thực hiện. Tuy nhiên, tôi chưa bao giờ đọc nó, vì vậy tôi không thể bình luận về nó.

Điều đó sẽ giúp bạn hoàn thiện hơn về quản lý quy trình, quản lý bộ nhớ, hệ thống tệp và mọi thứ khác mà hạt nhân hệ điều hành của bạn cần làm để đưa nó lên trạng thái có thể khởi động. Từ thời điểm đó về cơ bản, vấn đề là viết trình điều khiển thiết bị cho phần cứng bạn cần hỗ trợ và cung cấp triển khai các chức năng thư viện C để thực hiện các cuộc gọi hạt nhân cho những thứ như mở tệp và thiết bị, đọc và ghi, chuyển thông báo giữa các quy trình, v.v. .

Đọc phần lắp ráp x86 (giả sử bạn đang thiết kế phần này cho máy x86). Điều đó sẽ trả lời rất nhiều câu hỏi của bạn liên quan đến việc di chuyển giữa các chế độ hoạt động của bộ xử lý.

Nếu bạn có bất kỳ kiến ​​thức điện tử nào, có thể dễ dàng hơn khi bắt đầu viết hệ điều hành cho một thiết bị nhúng có tài liệu phong phú, vì nó thường đơn giản hơn PC x86. Tôi cũng luôn muốn viết hệ điều hành của riêng mình, và tôi đang bắt đầu viết một hệ điều hành nhúng microkernel cho Ban phát triển này từ Digilent. Nó có thể chạy bộ xử lý MicroBlaze lõi mềm của Xilinx, có tài liệu hướng dẫn rất kỹ lưỡng. Nó cũng có một số RAM, bộ lưu trữ dữ liệu flash, đèn LED, công tắc, nút, đầu ra VGA, v.v. Rất nhiều thứ để chơi với việc viết các trình điều khiển đơn giản.

Một trong những lợi ích của thiết bị nhúng là bạn có thể tránh phải viết trình điều khiển VGA trong một thời gian dài. Trong trường hợp của tôi, bảng phát triển Digilent có một UART trên bo mạch, vì vậy tôi có thể sử dụng hiệu quả đầu ra nối tiếp làm bảng điều khiển của mình để khởi động toàn bộ và khởi động vào một dòng lệnh với ít phiền phức nhất.

Chỉ cần đảm bảo rằng bất cứ thứ gì bạn chọn để nhắm mục tiêu đều có một trình biên dịch sẵn có và được kiểm tra tốt cho nó. Bạn không muốn viết một hệ điều hành và một trình biên dịch cùng một lúc.


2
+1, nhưng tôi thích cuốn Tanenbaum Minix hơn (hướng đến việc triển khai nhiều hơn) và thực sự không cần chỉ tập trung vào lý thuyết trước tiên. Anh ấy sẽ không viết một hệ điều hành nào trong lần thử đầu tiên. Đầu tiên anh ta sẽ viết một bộ nạp khởi động, sau đó chuyển sang chế độ được bảo vệ, sau đó xử lý I / O, v.v.
Bastien Léonard

2
+1 để viết hệ điều hành cho chip nhúng. Vào cuối ngày, bạn sẽ cảm thấy mình đã tạo ra một thứ gì đó độc đáo và nó đơn giản hơn rất nhiều so với việc viết một cái cho (giả sử) x86, trong khi vẫn giữ nguyên các khái niệm cốt lõi. Nhìn vào TinyOS, ví dụ (trong khi không về mặt kỹ thuật một hệ điều hành, có những thứ như lịch trình và nhiệm vụ mô-đun cho nó ..)
Kristopher Micinski

29

http://www.osdev.org/ http://www.osdever.net/

chào mừng bạn đến với thế giới Phát triển Hệ điều hành.

Xem thêm các liên kết tài liệu x86 khác trong SO's tag wiki : Hướng dẫn sử dụng Intel và AMD, tài liệu trình biên dịch / lắp ráp và các hướng dẫn khác nhau.

Nó cũng đề xuất sử dụng BOCHS hoặc môi trường ảo khác để gỡ lỗi, vì bạn có thể thực hiện một bước bộ nạp khởi động của mình và kiểm tra các thanh ghi.


1
Và đặc biệt là wiki.osdev.org !
Matthew Iselin

Đừng quên forum.osdever.net :)
Brenden

6
Tôi biết đây là những tài nguyên hữu ích, nhưng tôi nghĩ có thể hữu ích hơn cho những người đọc trong tương lai nếu bạn cung cấp một số ngữ cảnh hơn là một tập hợp các liên kết mà không có lời giải thích.
icktoofay

@icktoofay Câu hỏi này quá rộng để có thể trả lời đúng, tôi nghĩ vậy.
user253751

15

Tôi khuyên bạn nên làm việc, ít nhất là trước tiên, trên Bochs hoặc một số máy ảo khác vì lý do là bạn có thể mang nó theo bất cứ nơi nào bạn muốn, gỡ lỗi sẽ dễ dàng hơn (bạn có thể xem trạng thái chính xác của phần cứng) và nếu bạn cần sự trợ giúp từ bên ngoài để gỡ lỗi, họ có thể sử dụng chính xác 'phần cứng' giống như bạn.

Lời khuyên hữu ích nhất mà tôi có là hãy đưa bản thân vào trạng thái mà bạn có thể chạy mã C nhanh nhất có thể - tức là khởi động, thiết lập các bảng mô tả của bạn và tự đưa mình đến điểm an toàn để chạy mã C đã biên dịch. nếu không, tất cả kernel phải ở trong C nếu bạn muốn tỉnh táo và tiếp tục làm việc với nó. Assembly, trong khi được yêu cầu ở một số nơi, thì tẻ nhạt và có xu hướng khó gỡ lỗi.


Tôi sẽ xem xét Bochs để chơi xung quanh cho bây giờ, nhưng tôi cuối cùng muốn chỉ được xây dựng trên một số PC
Carson Myers

Nếu nó hoạt động trong BOCHS, nó thường sẽ hoạt động trên PC thực, sự khác biệt về modulo trong BIOS của chúng. Hầu hết các lỗi của bạn có thể sẽ là những thứ ảnh hưởng đến BOCHS và phần cứng thực, nhưng sự khác biệt là khi mã của bạn bị mắc kẹt trong một vòng lặp vô hạn trong BOCHS, bạn có thể sử dụng trình gỡ lỗi tích hợp của BOCHS để tìm ra vị trí và một bước duy nhất để tìm ra sao / tại sao. Trên phần cứng thực, tất cả những gì bạn có thể làm là thêm bản in gỡ lỗi. Sử dụng trình gỡ lỗi sẽ tiết kiệm hàng giờ và ngày đầu.
Peter Cordes

14

Ở mức thấp nhất, điều tối thiểu mà một hệ điều hành cần có thể làm là điều khiển phần cứng của hệ thống theo một cách nào đó và bằng cách nào đó tải thực thi một số loại "mã người dùng". Nếu bạn định bắt đầu với PC thì bạn cần viết mã có thể được tải bởi nó từ một số thiết bị hay thiết bị khác. Các PC cũ hơn có BIOS trong phần sụn xác định cách phần cứng thực hiện một số quá trình khởi tạo (ít nhất là video, bàn phím và một số dạng lưu trữ hoặc bộ tải khởi động). (Cập nhật tháng 10 năm 2017: Các PC mới hơn có phần mềm EFI hoặc UEFI ... phần lớn là một sự khác biệt lớn; phục vụ cùng mục đích cho cuộc thảo luận này).

Vì vậy, hãy bắt đầu bằng cách tìm hiểu các chi tiết cấp thấp về cách sử dụng BIOS hoặc phần sụn khác, trên hệ thống đích của bạn. Đó là, học cách viết một chương trình mà BIOS có thể tải và thực thi. Điều đó cuối cùng sẽ biến thành bộ nạp khởi động của bạn. Khởi đầu nhỏ. Chỉ cần lấy một chương trình in: "Xin chào, Linus" trực tiếp từ quá trình khởi động phần sụn (trên đĩa mềm hoặc ổ USB, sẽ là một khởi đầu tốt ... hoặc trên ổ cứng nếu bạn muốn).

Từ đó, tôi khuyên bạn nên viết một trình điều khiển nối tiếp rất đơn giản ... cập nhật trình tải khởi động của bạn để khởi tạo một số cổng nối tiếp và bắt đầu tải xuống từ đó. Sau đó, nó có thể thực thi mã mà nó kéo qua. Từ đó viết một chút bootstrap có thể ghi vào một tập hợp khối khác (chúng tôi chưa triển khai hệ thống tệp ... thậm chí chưa phân tích cú pháp bảng phân vùng; vì vậy ban đầu chúng tôi chỉ xử lý các phạm vi khối thô trên đĩa ).

Tại thời điểm đó, bộ tải khởi động của bạn sẽ có thể kéo mã mới qua dòng nối tiếp, kết xuất nó vào một phân vùng (vâng, thực hiện xử lý bảng phân vùng của một số loại ... liệu nó có tuân theo các quy ước PC tiêu chuẩn hay không là tùy thuộc vào bạn tại thời điểm này ), và thực thi nó.

Từ đó, bạn sẽ có thể làm việc trên các tính năng phức tạp hơn nhiều. Từ cơ sở này, bạn có thể viết và biên dịch một "nhân" mới ... khởi động lại testbed của bạn và triển khai nhân mới cho nó.

(Bộ nạp khởi động của bạn sẽ nhận một số tín hiệu, chẳng hạn như BREAK trên các dòng bắt tay nối tiếp làm lệnh bỏ qua tải xuống và chỉ khởi động hình ảnh hiện có; và nó cũng sẽ xử lý một số thời gian chờ theo cách này).

Từ đó viết một lớp thiết bị đầu cuối và lớp lệnh rất đơn giản? Một hệ thống tập tin? Thực hiện các lệnh để tải xuống nội dung thực thi mới ngoài hạt nhân (tệp hoặc đối tượng thuộc một số loại). Và như thế.

Đương nhiên, bạn có thể đã bắt đầu với trình điều khiển bảng điều khiển bằng bàn phím PC và video (tương ứng là các công cụ BIOS INT 0x16h và INT 0x10H, nếu tôi nhớ chính xác). Tuy nhiên, tôi khuyên bạn nên bắt đầu với trình điều khiển nối tiếp vì sau đó bạn có thể tự động hóa chu trình xây dựng / triển khai / thử nghiệm của mình từ bất kỳ hệ thống (chức năng) hiện có nào khác. Vì hệ điều hành mới của bạn sẽ bắt đầu như một dự án được biên dịch chéo nên điều cần thiết là bạn phải có một cách hợp lý để xử lý vấn đề đó.

Tôi không biết bạn muốn thực hiện dự án của mình bao xa. Một mục tiêu ấn tượng hợp lý sẽ là đạt được "tự lưu trữ". Nếu bạn có thể tạo một trình hợp dịch / trình biên dịch đơn giản có thể cho phép bạn sử dụng hệ điều hành mới của mình để (lại) xây dựng, liên kết và khởi động vào phiên bản làm việc của hệ điều hành mới ... thì bạn đã đạt được mục tiêu đó. (Lưu ý rằng đó không phải là một yêu cầu. Nhiều hệ thống nhúng sẽ không bao giờ tự lưu trữ và không có gì sai với điều đó).


Trên phần cứng hiện đại, có thể khó làm cho trình điều khiển nối tiếp hoạt động hơn là viết trình điều khiển bàn điều khiển (video / bàn phím). Trong vài năm kể từ khi tôi viết bài này, các đầu nối nối tiếp cũ kỹ đã trở nên thực tế không tồn tại trên máy tính để bàn và máy tính xách tay hiện đại. Một số phần cứng nhúng và "sở thích" vẫn có giao diện RS-232C kiểu cũ mà không cần thông qua mô phỏng USB. Đối với Examle : mpl.ch/t2600.html dường như có nó.
Jim Dennis

12

Nếu bạn không ngại sử dụng ảo hóa phần cứng, có một khóa học (sách + bài giảng + phần mềm) sẽ đưa bạn 'Từ Nand đến Tetris'. Bạn hoàn toàn tự tạo một hệ thống máy tính đầy đủ từ cổng NAND điện tử (cho những mục đích này và cho sẵn), cho đến xây dựng hệ điều hành, ngôn ngữ và cuối cùng là viết mã một trò chơi đơn giản trên máy cá nhân của bạn.

Tôi nghĩ đó là một ý tưởng tuyệt vời và là điều mà tôi hoàn toàn có ý định sẽ sớm mắc kẹt. Cuốn sách có giá rẻ bất ngờ và tôi tin rằng khóa học được giảng dạy tại MIT. Tôi không thể tưởng tượng được cảm giác nào tuyệt vời hơn việc có được kiến ​​thức đầy đủ, hoàn chỉnh về toàn bộ hệ thống mà bạn đã tự xây dựng từ đầu.

Liên kết: http://www1.idc.ac.il/tecs/


Tôi nghĩ liên kết này đã chết. Có ai biết bất kỳ cách nào khác để truy cập này?
Koray Tugay

1
@KorayTugay nand2tetris.org
dùng253751

10

Tôi sẽ bắt đầu với quy mô nhỏ và mua một bộ công cụ phát triển nhúng 8086 và phát triển một hệ điều hành đa nhiệm trên đó. Khi bạn đã có kernel và đã quen với việc làm việc ở cấp độ phần cứng, bạn sẽ sẵn sàng làm điều gì đó khó khăn hơn.

Xây dựng ngay cả một bản sao DOS màn hình VGA là một điều khá khó khăn. Các chi tiết là rất lớn. :-)

chủ đề cụ thể.

Làm cách nào để đưa mã vào máy tính? Tốt nhất là làm điều đó với đĩa mềm? Hầu hết các máy tính có thể làm điều đó từ thẻ USB không?

BIOS sẽ thực hiện khởi động cơ bản.


Tôi cần những trình điều khiển nào, và bạn có thể đề xuất bất kỳ tài liệu tham khảo nào để xây dựng chúng không?

bất kỳ thứ gì không phải là hoạt động trực tiếp của cpu / bộ nhớ. Bất kỳ thứ gì không có trong tài liệu tham khảo CPU.


Sau trình tự khởi động - sau đó là gì? Làm cách nào để vào chế độ được bảo vệ, v.v.

Chế độ được bảo vệ sẽ là một phần của trình tự khởi động.

sau đó bạn bắt đầu đa nhiệm và tìm cách bắt đầu các quy trình.


Làm cách nào để quản lý bộ nhớ mà không cần sự trợ giúp của hệ điều hành? Tôi chỉ cần sử dụng bất kỳ địa chỉ nào tôi muốn? Không cần khởi tạo?

Chính xác. Bạn có thể sẽ muốn sắp xếp một hệ thống bộ nhớ ảo cuối cùng.


Tôi chắc chắn sẽ gặp phải điều gì khiến tôi bối rối?

không có công cụ gỡ lỗi, không có IO


Làm cách nào để biến nó thành dòng lệnh O / S và một dòng đồ họa?

Với sự đau buồn. Tra cứu Windows 3.1 và Linux, đặc biệt là các cửa sổ X.


O / S đồ họa được xây dựng trên nền tảng gì? Giống như, làm cách nào để thực hiện một số thứ như, một dòng lệnh, với một phông chữ và một hình ảnh ở trên cùng?

Tra cứu cửa sổ X.


lời khuyên cuối cùng: hãy học Linux / x windows. Nó không hoàn hảo, nhưng nó cung cấp sự hiểu biết về một cách tiếp cận. Đồng thời nghiên cứu hệ thống nhúng.


câu trả lời tuyệt vời, tôi đã có sẵn hạt nhân linux và chắc chắn tôi sẽ xem xét windows 3.1.
Carson Myers

8

Tôi thấy nhiều tài liệu tham khảo tốt về các trang web phát triển hệ điều hành, vì vậy tôi sẽ mô tả một cách tiếp cận khác:

Nếu bạn muốn có trải nghiệm triển khai hệ điều hành từ kim loại thô, có nhiều cách lựa chọn phần cứng tốt hơn PC cũ. Với kiến ​​trúc PC, bạn sẽ dành rất nhiều thời gian để viết mã xung quanh các hiện vật không thú vị trong lịch sử thiết kế 30 năm của nó. Ví dụ, chỉ một phần bộ nạp khởi động của dự án đã có thể khiến nhiều lập trình viên dũng cảm bị tiêu diệt.

Ví dụ: bạn sẽ cần một bộ trình điều khiển để đọc hạt nhân của bạn khỏi đĩa và / hoặc mạng. Sau đó, bạn sẽ cần mã để vào chế độ được bảo vệ. Tại thời điểm đó, bạn cần một bộ trình điều khiển khác! Rất ít công việc bạn làm để đưa chip vào chế độ được bảo vệ sẽ có thể chuyển nhượng sau thời điểm đó. Bạn muốn chạy nó trên một PC khác - 4 năm và bạn sẽ cần một bộ trình điều khiển khác.

Xem xét khởi động ARM hoặc chip "nhúng" 32-bit khác. Có sẵn bảng phát triển không tốn kém, hoặc bạn có thể hàn của riêng bạn! Một số có ethernet và usb tích hợp sẵn. Tôi nghĩ bạn sẽ thấy vui hơn khi làm việc trên một kiến ​​trúc lành mạnh, không thô ráp và có lẽ kết thúc với một số kỹ năng có thể sử dụng lại.


không chính xác những gì tôi yêu cầu, nhưng 1 đã gửi cho tôi trên một tang của đọc
Carson Myers

Marsh đang cho bạn lời khuyên tốt. Các chi tiết cấp thấp của kiến ​​trúc x86 / BIOS rất phức tạp. Bạn có thể sẽ bị sa lầy vào những chi tiết này, khiến bạn không thể tập trung vào các vấn đề lớn hơn như quản lý bộ nhớ và lập lịch quy trình. Tìm kiếm một kiến ​​trúc "sạch hơn" với một cổng nối tiếp. Bạn sẽ hạnh phúc hơn về lâu dài.
Barry Brown

8

Hơn bất cứ điều gì khác, nếu bạn muốn điều này chạy trên phần cứng thực, bạn hoàn toàn cần một bản sao hướng dẫn sử dụng bộ xử lý của mình. Các hướng dẫn sử dụng của Intel ( http://www.intel.com/products/processor/manuals/ ) là vô giá. Họ xem xét mọi thứ từ chuyển đổi chế độ (thực / được bảo vệ) đến quản lý bộ nhớ ảo (nếu bạn chọn đi xa như vậy) để tạo cuộc gọi tổng hợp (nếu bạn đã từng thực hiện chế độ người dùng). Quan trọng nhất là họ giải thích rất chi tiết một số thứ phải được thiết lập để mọi thứ hoạt động, như TSS và thanh ghi phân đoạn, mà hầu hết các văn bản hệ điều hành không thảo luận bởi vì họ quan tâm đến các khái niệm cấp cao hơn bộ xử lý- Các chi tiết cụ thể.


Và bạn có thể nhận các bản sao giấy miễn phí thông qua Intel.
Matthew Iselin


8

Cố gắng đọc mã của một hệ điều hành nguồn mở nhỏ, cơ bản, chẳng hạn như MikeOS.

Ngoài ra, tôi đề xuất các bước sau (sẽ rất thú vị!):

  1. Viết một máy ảo. Xác định tất cả các hướng dẫn bộ xử lý của bạn để bạn biết hệ thống của mình từ trong ra ngoài. Giao diện nó với SDL để truy cập bàn phím, chuột, màn hình, âm thanh. Hãy đơn giản hóa mọi thứ trong đầu bạn cùng một lúc. Nó không cần phải là một máy ảo hiện đại, chỉ cần một máy có thể mô phỏng chức năng của một máy tính 'thực'.
  2. Viết trình hợp ngữ cho bộ xử lý máy ảo của bạn. Hãy nhớ rằng trình hợp dịch này không cần phải là một chương trình được viết bằng ngôn ngữ của máy ảo, mà là bất kỳ thứ gì có thể chuyển đổi ngôn ngữ hợp ngữ của bạn thành mã máy.
  3. Xác định một định dạng thực thi và viết một trình liên kết đơn giản.
  4. Bây giờ bạn đã có tất cả các phần để viết hệ điều hành của mình! Viết nó bằng ngôn ngữ hợp ngữ, lắp ráp nó ... vv .. bạn không cần quá trình tải khởi động phức tạp như vậy, chỉ cần đưa máy tính của bạn chạy hệ điều hành của bạn trước.

Các bước trên có vẻ hơi ngu ngốc khi viết một hệ điều hành đơn giản, nhưng này, thật là vui.


6

kiểm tra MikeOS . Một hệ điều hành khá đơn giản được viết ra có thể đọc được (như trong nhận xét). Mặc dù khá đơn giản nhưng nó có GUI và hỗ trợ một số mạng và đa phương tiện.

chỉnh sửa : MenuetOS là đồ họa. Nó cũng được viết là thẳng asm, nhưng nó phức tạp hơn MikeOS


6

Bạn có một mục tiêu đầy tham vọng. Nhưng thực thi là chìa khóa.

Hầu hết các phương pháp tiếp cận có cấu trúc (sách giáo khoa hoặc lớp đại học) sẽ hướng dẫn bạn qua quá trình này, nhưng chúng cung cấp rất nhiều mã nitty-gritty phủ bóng lên các chi tiết phức tạp của nền tảng bạn đã chọn và cho phép bạn tập trung vào các ý tưởng toàn cảnh: lập lịch quy trình, quản lý bộ nhớ, ngăn chặn bế tắc, I / O, v.v.

Lời khuyên của tôi là: hãy giảm bớt kỳ vọng của bạn và bắt đầu với một câu hỏi cơ bản.

Hệ thống vận hành là gì?

Một nhà khoa học máy tính (hy vọng) sẽ không bao giờ nói rằng hệ điều hành là một giao diện người dùng đồ họa, hoặc một trình duyệt web, hoặc một cách để kết nối thiết bị USB hoặc bất cứ thứ gì mà người dùng thực sự có thể nhìn thấy hoặc chạm vào. Thay vào đó, một hệ điều hành ở cấp độ cơ bản nhất của nó là những thứ tôi đã đề cập ở trên. Tất cả đều nằm dưới một cái ô lớn: quản lý tài nguyên.

Hệ điều hành chỉ là một chương trình quản lý các tài nguyên phần cứng của máy tính: bộ nhớ, CPU và các thiết bị ngoại vi.

Đây là một hệ điều hành đơn giản: một chương trình cho phép người dùng nhập chương trình (ở hệ thập lục phân hoặc nhị phân) bằng cách sử dụng kết nối nối tiếp. Khi chương trình đã được nhập vào, chương trình sẽ chạy. Khi chương trình kết thúc, quyền điều khiển được trả lại cho người dùng, nơi họ có thể chạy lại chương trình hoặc nhập một chương trình mới.

Thực hiện việc này trên kiến ​​trúc "sạch" chẳng hạn như bộ xử lý ARM nhúng với bộ nhớ 64K hoặc lâu hơn. Bạn có thể viết mã này trong lắp ráp sau một vài ngày tìm hiểu các kiến ​​thức sâu sắc về ARM. Và thì đấy! , bạn đã có cho mình một hệ điều hành.

Nó thực hiện mọi thứ mà một hệ điều hành phải làm:

  • Nó quản lý bộ nhớ bằng cách không để người dùng ghi đè lên hệ điều hành.
  • Nó lên lịch cho một quá trình duy nhất để chạy.
  • Nó xử lý I / O đến thiết bị ngoại vi nối tiếp duy nhất.

Điều này cung cấp cho bạn một khối xây dựng để bắt đầu. Bạn có nhiều sự lựa chọn bây giờ. Có lẽ một trong số chúng là cho phép tải hai chương trình vào bộ nhớ và để người dùng quyết định chương trình nào sẽ chạy tiếp theo.

Hoặc bạn có thể cho phép người dùng tạm ngừng thực thi một chương trình, chuyển sang chương trình kia, tạm ngừng và chuyển trở lại. Đây là thao tác đa nhiệm thô sơ, mặc dù nó hoàn toàn thủ công.

Lựa chọn của bạn là không giới hạn nhưng mỗi lựa chọn là một bước tiến nhỏ so với những gì bạn đã có trước đây.

Thật vui nếu bạn không đặt tầm nhìn của mình quá cao!



4

Nhiều trường có các lớp hệ điều hành làm được nhiều việc như bạn mô tả. Trường học của tôi (CMU) dạy OS bằng C, và chúng tôi đã viết hạt nhân, hệ thống tệp và trình bao, đồng thời được cung cấp mã cho bộ tải khởi động.

Thật không may, tôi không thể tìm thấy bất kỳ tài nguyên chính xác nào cho khóa học này (15-412) trên web và nó đã phát triển theo thời gian. Nhưng có lẽ mọi người có thể đăng các liên kết đến các nguồn và bài tập cho các trường có nguồn tốt trên web.


3

Bạn có thể thích hướng dẫn này có tên "Lăn hệ điều hành UNIX-clone đồ chơi của riêng bạn", nó rất sâu sắc và sẽ giúp bạn trên con đường của mình.

Chúc may mắn.


1
Mặc dù thật tuyệt vời khi có một hướng dẫn chuyên sâu như vậy nhưng có rất nhiều lỗi mà người mới bắt đầu liên tục gặp phải. Hướng dẫn này rất tuyệt nếu và chỉ khi bạn sẵn sàng mở những thứ như Hướng dẫn sử dụng Intel và suy nghĩ về những gì bạn đang làm (tức là không sao chép và dán!).
Matthew Iselin

3

Nghiên cứu Hệ thống A2 (trước đây được gọi là hệ thống Oberon ) để biết những ý tưởng bạn có thể ăn cắp. Nó là một hệ điều hành đồ họa được xây dựng bởi chỉ hai người, mặc dù phải thừa nhận một người là Niklaus Wirth. Được phát hành lần đầu tiên vào khoảng năm 1990 và tốc độ tốt đáng kinh ngạc. Có một cuốn sách của Gutknecht.


3

Về lập trình đồ họa cấp thấp, điều này sẽ cung cấp cho bạn rất nhiều thông tin: http://www.osdever.net/FreeVGA/home.htm . (Nó cũng rất thú vị cho chế độ văn bản.)

Tôi chắc chắn sẽ gặp phải điều gì khiến tôi bối rối?

Bạn sẽ nhận ra rằng trên PC có rất nhiều thứ không rõ ràng: bản thân tập lệnh x86 rất phức tạp và khi bạn truy cập trực tiếp vào phần cứng, có thể mất khá nhiều thời gian trước khi bạn hiểu cách viết một ký tự trên màn hình .

Đừng lo lắng về đĩa mềm và những thứ như vậy, hầu hết thời gian bạn sẽ sử dụng trình giả lập như Bochs hoặc QEmu.


3

Bạn có thể muốn xem xét các Khái niệm Hệ điều hành, bởi Abraham Silberschatz - Hiểu các khái niệm Lập trình Hệ thống là một yêu cầu cơ bản, hãy xem xét bên trong nhân F / OSS của OSes linux * BSD và GNU / Linux , đặc biệt là các phiên bản trước đó, có lẽ được tài liệu nhiều hơn một chút.văn bản thay thế văn bản thay thế


1
Silbershatz thực sự là khá tốt, nhưng rất cao cấp.
Paul Nathan

Đã đồng ý; Tuy nhiên, tôi muốn nói rằng nó về cơ bản là rất cần thiết. Tài liệu phải lên đó với hệ điều hành hiện đại bởi Tanenbaum (đề cập trước đó)
Amaterasu

2

Hãy nhìn vào Minix . Nghiên cứu mã nguồn cùng với " Thiết kế và Triển khai Hệ điều hành ". Cân nhắc đóng góp cho dự án. Tôi nghĩ rằng Minix là một hệ điều hành thực sự tốt và đầy hứa hẹn. Nó cũng là dự án được tài trợ tốt. Điều đó có nghĩa là bạn thậm chí có thể được trả tiền cho những đóng góp của mình!


1

Điều đó rất dễ dàng nhờ thực tế là BIOS đã có nhiều chức năng đầu vào / đầu ra được tích hợp sẵn để thay đổi chế độ màn hình, thay đổi màu pixel, ghi văn bản lên màn hình và nhiều thứ khác. Tuy nhiên, nó không bao gồm hỗ trợ cho hệ thống tệp, đó là một trong số rất ít thứ bạn phải kết hợp trong hệ điều hành của mình.

BIOS tải khu vực đầu tiên trên ổ cứng và bắt đầu thực thi mã từ đó, vì vậy hệ điều hành của bạn phải được đặt bằng lệnh đầu tiên trong khu vực đầu tiên trên ổ cứng.

Bài viết Wikipedia này sẽ giúp bạn bắt đầu với các ngắt trong BIOS để ghi văn bản lên màn hình, nhận các phím từ bàn phím và các thứ khác. https://en.wikipedia.org/wiki/BIOS_interrupt_call

Ngay cả khi bạn định sử dụng c ++, tôi thực sự khuyên bạn nên đọc về lập trình hợp ngữ, vì điều quan trọng là phải hiểu cách phần cứng hoạt động.

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.