uk. đúng đó. ai chỉ tôi với
Các hệ điều hành được viết như thế nào và viết bằng ngôn ngữ gì?
Cái này thì mình nghĩ chắc bạn phải tìm hiểu lịch sử thôi Search Google những từ khóa liên quan như: Lịch sử ra đời máy tính …
Google với từ khóa History of programming languages
Đọc chơi cho biết : http://www.wikihow.com/Make-a-Computer-Operating-System
Hệ điều hành thực ra cũng chỉ là một cái App to nhất, chuyên để cấp phát bộ nhớ, quản lý các App (Process). Thế nên, trước khi có OS ra đời thì programer lập trình bằng các bìa đục lỗ -> các App nhỏ -> các OS nhỏ. Trên các OS nhỏ này -> viết nên các OS # như MS DOS -> trên MS DOS lại viết Windows OS (kiểu kiểu vậy thôi, nó cũng giống như các game 4 nút ý, các App game lúc đầu họ viết sơ khai bằng các ngôn ngữ của máy tính -> ngôn ngữ bậc thấp (assembler) -> ngôn ngữ bậc cao)
chắc ý của bạn hỏi là: khi chưa có hệ điều hành thì lập trình viên làm thế nào để viết lên một hệ điều hành, lấy cái gì để compiler ra.
Thời kỳ đầu thì chắc phải viết kiểu thô sơ nhất (giống kiểu đục lỗ trên bìa ý) 0101010000111 (mã opcode). Cái này thì máy hiểu luôn, không cần compile gì cả.
Dần dần những đoạn opcode này nhiều lên -> thành lib -> viết các compiler đơn giản (ngôn ngữ bậc thấp) -> viết ngôn ngữ bậc thấp rồi dùng compiler này để biên dịch ra opcode -> dần dần có nhu cầu viết phần mềm theo ngôn ngữ tự nhiên, xuất hiện các compiler và ngôn ngữ bậc cao.
Một số ngôn ngữ bậc cao, không compiler trực tiếp ra opcode mà compile ra mã trung gian, sau đó có một cái Runtime Compiler (JIT compiler) mới compile ra opcode. Cách tiếp cận này giúp cho các compiler đời sau có thể compile ra các mã opcode ngắn hơn, phù hợp với các command của CPU hơn (vì CPU cũng ngày càng trang bị thêm nhiều lệnh nữa) -> chạy nhanh hơn. Chính vì thế, compiler cũng tiến lên cùng với phần cứng.
Câu hỏi rất hay,
Các hệ điều hành được viết như thế nào. Câu hỏi này mình cũng đã từng hỏi và cũng đã từng thử sức viết một mini kernel.
Trước tiên nói xa xôi hệ điều hành có lẽ chúng ta nên hiểu một chút về cách thức hoạt động của máy tính nói gọn nhẹ hơn là một CPU hoạt đông như thế nào.
Tất cả những phần mềm này nọ dù có cao xa, to tác đến cỡ nào đi nữa thì nó cũng tìm đến CPU mà thực thi mà thôi.
Bây giờ một CPU hoạt động ra sao thì có lẽ mình không trả lời hết ở đây được. Nó lên quan đến Cấu Trúc Máy Tính.
Nhưng về cơ bản thì CPU cần lệnh để thực hiện những lệnh này được lưu ở đâu đấy trong bộ nhớ None_Voilate . (Flash, EEPRom,vv)
CPU được thiết kế để hiểu những dòng lệnh xác định sẵn, quy định riêng cho CPU đó.
Và các biểu diễn những dòng lệnh cơ bản ở mức thấp này người ta gọi là Assembly. (Người ta đặt tên gọi cho một lệnh có cấu trúc nào đó vd mã 0101010100110 tương ứng lệnh ADD,…vv)
Lệnh đó là gì là một tập hợp các bit 0 và 1 có độ dài và cấu trúc nhất định quy định cho CPU. Có nhiều các cấu trúc và tổ chức tập lệnh khác nhau . 2 cái thuật ngữ hay gặp nhất là CISC và RISC đấy.
Cụ thể CPU cứ đọc tuần tự các lệnh trong bộ nhớ chương trình ra và hoạt động.
Các lệnh lưu trong bộ nhớ chương trình sẽ có dạng như thế này
010101010010101110 -> Lenh 1 Vd :
------------------------------- Lenh 2
Vấn đề tiếp theo là làm sao để tạo ra những lệnh này. Ban đầu không còn cách nào khác các lập trình viên phải viết ở mức mã thấp này và ký hiệu lại bằng giả lệnh
ADD, MOVE, JUMP…v.
Tiếp theo nữa như điều tất yếu công việc viết code ở mức này khá vất vả cho lập trình viên. Họ bắt đầu tìm cách viết ra những phần mềm có thể hiểu được một ngôn ngữ mới mà họ vừa tạo ra ( sau này gọi là compiler). Tiếp theo là sự ra đời của các ngôn ngữ khác nhau với những compiler khác nhau.
Công việc cuối cùng cũng chỉ để làm ra chuỗi 00 11 kia cho đỡ vất vả … và hiệu quả nhất.
Quay trở lại câu hỏi , thế còn hệ điều hành? Thì câu trả lời là hệ điều hành cũng chỉ là một phần mềm. Chỉ có điều sứ mệnh của phần mềm này khác so với phần còn lại.
Công việc lập trình cứ tiếp tục tiếp diễn và dù cho chúng ta có sang tao ra nhiều ngôn ngữ đi chăng nữa, nhiều cách đơn giản để tạo ra đống mã 0 và 1 kia nữa…
Thì một điều sẽ đến và ắt đến song song với sự phát triển của CPU và phần cứng là “ Sử dụng tài nguyên không hiệu quả”.
Chúng ta không thể cứ lập trình xong rồi lại nạp vào cho CPU chạy mà không có một cách nào để quản lý nó và sử dụng hiệu quả nhất tài nguyên của CPU và các ngoại vi. Đơn giản giả sử bạn nạp một chương trình cho CPU chạy… bằng một đống 0 00 111 kia… Sau đó làm sao để bạn biết chương trình đó đang thực hiện ra sao
… nó chiếm bao nhiêu bộ nhớ, liệu nó có bị đơ hay không… Chưa kể đến cách quản lý tác vụ các Task, MultiTask, Làm sao để chay một lúc nhiều “Task”…vv
Đó là lúc người ta đã làm ra một chương trình chạy ôm trọn lấy tất cả những chức năng CPU có thể làm. Cung câp một môi trường làm việc cho các ứng dụng khác…
Khai thác tát cả những điểm mạnh mà phần cứng đang có… vvv. Đó là bài toán của hiệu suất và quản lý…
Đến đây thì việc hệ điều hành viết bằng gì chắc không còn quan trọng lắm nữa… Vì trải qua cả một quá trình dài chúng ta đã có đủ công cụ và ngôn ngữ để viết một “Phần mềm lớn” còn nó bằng gì “ LÀ tùy bạn .
Câu trả lời của Xuân Tâm thật tuyệt.
Rất hay và đầy đủ… dể hiểu.
Cảm ơn rất nhiều
Mình trả lời hơi muộn ^^!
Giống như chiếc máy tính đầu tiên được ra đời (chưa có hệ điều hành) người ta lập trình nó = mã nhị phân.
Những chiếc máy tính đời tiếp theo (thời Bill Gates) cũng không có hệ điều hành, người ta lập trình nó = ngôn ngữ BASIC (cái này lên wikipedia tra). Máy tính thời đó sẽ có 1 cái code editor như kiểu cmd của ms đó bạn, đen sì, sẽ viết code vào đó và compile ngay trên đó lun. Người ta gọi đó là Console Application đó bạn.
Nếu chưa hiểu hỏi mình nhé (PS: mình cx ko rõ cái máy tính thời bill gates có phải đời sau hay đời đầu, nhưng mình khá chắc nó dùng code editor (gần giống cmd) để lập trình nhé)
Đầu tiên phải nói rằng hệ điều hành chính là thành quả của việc tự động hóa quá trình điều hành tác vụ. Nhiệm vụ chình của HĐH là giữ nhịp và quản lí tài nguyên hệ thống, và cung cấp các giao diện cho userspace.
Nói cách khác chính nó cũng là chương trình thôi
Vấn đề này thuộc phạm trù quả trứng và con gà: Không có compiler thì lấy gì để compile HĐH, không có HĐH thì lấy gì để compile chạy .
Để giải quyết đc cái catch-22 này thì chỉ cần nhớ 2 thứ:
- Nhiệm vụ của compiler là để trans từ 1 ngôn ngữ sang ngôn ngữ khác (cụ thể trong trường hợp này là mã máy) => chưa có compiler thì dùng assembler, chưa có assembler thì dùng đục lỗ.
- Compiler hay asm hay bất cứ chương trình gì đều có thể chạy mà không cần hệ điều hành. Nếu bạn chịu nghiên cứu quá trình từ lúc bấm nút power tới lúc nó hiện lên windows thì rất nhiều thắc mắc của bạn sẽ đc giải đáp
Bắt đầu từ đây nhé:
https://en.wikipedia.org/wiki/BIOS#Operation
https://softwareengineering.stackexchange.com/questions/171127/how-do-operating-systems-run-without-having-an-os-to-run-in
Nhưng nhìn chung để hiểu hết về mấy thứ này thì chắc phải đọc không ít sách.
C hay C++ đều có bộ Compiler là self compiler, nghĩa là viết bộ compiler bằng C++ để biên dịch mã C++. Bản đầu tiên chỉ viết vài tính năng cơ bản (bản đầu tiên dựa trên compiler khác viết trên assembly), sau đó cải tiến dần dần (biên dịch trên compiler version trước). Bây giờ C++ mới có nhiều tính năng.
Do đó việc compiler C hay C++ viết bằng ngôn ngữ máy hay assembly cũng không hoàn toàn chính xác.
Như vậy câu hỏi trở thành “chương trình đầu tiên (của máy đó) viết bằng gì”. Phân tích 1 lệnh x64 thì có 3 phần: operator, operand và prefix. Tất cả đều được viết bằng byte (không phải text), chỉ có mnemonic là tên đặt cho chúng. Từ level này (vì còn microcode nữa) thì có thể viết được assembler, sau đó dịch C ra assembly bằng trình biên dịch viết bằng assembler, và cuối cùng là mỡ nó rán nó.
6 posts were split to a new topic: Máy tính hiện nay có thể sử dụng được khi không có hệ điều hành không?
Tớ có quyển dạy Viết OS 30 ngày (tiếng Nhật) này. Vừa đọc vừa làm theo là ra cái hệ điều hành hoàn chỉnh vừa dễ hiểu luôn =))) Cách đơn giản nhất để hiểu nó là tạo ra nó
@xuantambk bạn cho mình hỏi, bạn đã viết thành công mini kernel chưa. Bạn có thể mô tả tổng quan mình cần tìm hiểu gì để làm được demo như vậy.
Nếu có thể, bạn cho mình xin source code.
Mình cảm ơn nhiều!
Anh e nào có hứng thì đọc qua, tiện thể học luôn Rust cũng đc vì m thấy nó khá hay
https://os.phil-opp.com/
Mình không còn giữ source code hoặc ở đâu đấy trong Labtop cũ của mình.
Nhưng để đơn giản bạn nên bắt đầu với tìm hiểu về RTOS trước.
Mình lấy ví dụ
main(){
while (1){
do_something();
}
Đã là 1 Mini Kernel rồi bạn. Nếu bạn nạp đoạn chương trình này vào 1 con MCU nào đó.
Bây giờ tiếp theo hãy đọc thêm về Task, Interrupt , Xem xem MCU đó hỗ trợ timer ,system Tick, Task Control Block , như thế nào.
Mục đích là làm cho trong đoạn while(1) kia làm được nhiều việc hơn ngoài do_something.
Đó là cái mini kernel ngày xưa của mình.
Dành cho một số bạn bảo “C# chỉ chạy được trên Windows”