Bạn đề cập đến việc làm thế nào nếu mã dành riêng cho CPU, tại sao nó cũng phải cụ thể đối với HĐH. Đây thực sự là một câu hỏi thú vị mà nhiều câu trả lời ở đây đã đưa ra.
Mô hình bảo mật CPU
Chương trình đầu tiên chạy trên hầu hết các kiến trúc CPU chạy bên trong cái được gọi là vòng trong hoặc vòng 0 . Cách một vòm CPU cụ thể thực hiện các vòng khác nhau, nhưng gần như mọi CPU hiện đại đều có ít nhất 2 chế độ hoạt động, một chế độ được đặc quyền và chạy mã 'kim loại trần' có thể thực hiện bất kỳ hoạt động hợp pháp nào mà CPU có thể thực hiện và cái còn lại là không tin cậy và chạy mã được bảo vệ chỉ có thể thực hiện một bộ khả năng an toàn được xác định. Tuy nhiên, một số CPU có độ chi tiết cao hơn rất nhiều và để sử dụng VM một cách an toàn thì cần ít nhất 1 hoặc 2 vòng bổ sung (thường được gắn nhãn số âm) tuy nhiên điều này nằm ngoài phạm vi của câu trả lời này.
Hệ điều hành đến đâu
Hệ điều hành nhiệm vụ đơn sớm
Trong DOS rất sớm và các hệ thống dựa trên nhiệm vụ đơn đầu tiên khác, tất cả mã đều được chạy trong vòng bên trong, mọi chương trình bạn từng chạy đều có toàn bộ sức mạnh trên toàn bộ máy tính và có thể làm bất cứ điều gì theo nghĩa đen nếu nó bị lỗi bao gồm xóa tất cả dữ liệu của bạn hoặc thậm chí làm hỏng phần cứng trong một vài trường hợp cực đoan như cài đặt chế độ hiển thị không hợp lệ trên màn hình hiển thị rất cũ, tệ hơn, điều này có thể được gây ra bởi mã lỗi đơn giản không có bất kỳ ác ý nào.
Mã này trên thực tế phần lớn là bất khả tri của hệ điều hành, miễn là bạn có trình tải có khả năng tải chương trình vào bộ nhớ (khá đơn giản cho các định dạng nhị phân ban đầu) và mã không dựa vào bất kỳ trình điều khiển nào, thực hiện tất cả các truy cập phần cứng mà nó nên chạy theo bất kỳ HĐH nào miễn là nó chạy trong vòng 0. Lưu ý, một HĐH rất đơn giản như thế này thường được gọi là màn hình nếu nó chỉ được sử dụng để chạy các chương trình khác và không cung cấp thêm chức năng.
Hệ điều hành đa tác vụ hiện đại
Các hệ điều hành hiện đại hơn bao gồm UNIX , các phiên bản Windows bắt đầu bằng NT và nhiều hệ điều hành tối nghĩa khác đã quyết định cải thiện tình trạng này, người dùng muốn các tính năng bổ sung như đa nhiệm để họ có thể chạy nhiều ứng dụng cùng một lúc và bảo vệ, do đó, một lỗi ( hoặc mã độc) trong một ứng dụng không còn có thể gây ra thiệt hại không giới hạn cho máy và dữ liệu.
Điều này đã được thực hiện bằng cách sử dụng các vòng được đề cập ở trên, HĐH sẽ chiếm vị trí duy nhất chạy ở vòng 0 và các ứng dụng sẽ chạy ở các vòng không tin cậy bên ngoài, chỉ có thể thực hiện một bộ hoạt động hạn chế mà HĐH cho phép.
Tuy nhiên, tiện ích và bảo vệ gia tăng này phải trả giá, các chương trình giờ phải làm việc với HĐH để thực hiện các tác vụ mà chúng không được phép tự thực hiện, ví dụ, chúng không còn có thể kiểm soát trực tiếp đĩa cứng bằng cách truy cập bộ nhớ của nó và thay đổi tùy ý thay vào đó, họ phải yêu cầu HĐH thực hiện các tác vụ này cho họ để họ có thể kiểm tra xem họ có được phép thực hiện thao tác không, không thay đổi các tệp không thuộc về họ, nó cũng sẽ kiểm tra xem thao tác đó có thực sự hợp lệ không và sẽ không để phần cứng ở trạng thái không xác định.
Mỗi hệ điều hành quyết định thực hiện các biện pháp bảo vệ khác nhau, một phần dựa trên kiến trúc mà HĐH được thiết kế và một phần dựa trên thiết kế và nguyên tắc của HĐH được đề cập, ví dụ UNIX tập trung vào các máy tốt cho nhiều người dùng và tập trung các tính năng khả dụng cho việc này trong khi các cửa sổ được thiết kế đơn giản hơn, để chạy trên phần cứng chậm hơn với một người dùng. Cách các chương trình không gian người dùng cũng nói chuyện với HĐH hoàn toàn khác trên X86, chẳng hạn như trên ARM hoặc MIPS, buộc một HĐH đa nền tảng phải đưa ra quyết định dựa trên nhu cầu làm việc trên phần cứng mà nó nhắm đến.
Các tương tác cụ thể của HĐH này thường được gọi là "các cuộc gọi hệ thống" và bao gồm cách chương trình không gian người dùng tương tác hoàn toàn với phần cứng thông qua HĐH, về cơ bản chúng khác nhau dựa trên chức năng của HĐH và do đó, một chương trình hoạt động thông qua các cuộc gọi hệ thống cần được hệ điều hành cụ thể.
Trình tải chương trình
Ngoài các cuộc gọi hệ thống, mỗi HĐH cung cấp một phương thức khác nhau để tải một chương trình từ phương tiện lưu trữ thứ cấp và vào bộ nhớ , để có thể tải được bởi một HĐH cụ thể, chương trình phải chứa một tiêu đề đặc biệt mô tả cho HĐH như thế nào tải và chạy.
Tiêu đề này đã từng đủ đơn giản để viết một trình tải cho một định dạng khác gần như không đáng kể, tuy nhiên với các định dạng hiện đại như elf hỗ trợ các tính năng nâng cao như liên kết động và khai báo yếu thì giờ đây, HĐH không thể tải nhị phân Điều này không được thiết kế cho nó, điều này có nghĩa là, ngay cả khi không có sự không tương thích của hệ thống, thì rất khó để thậm chí đặt một chương trình trong ram theo cách có thể chạy được.
Thư viện
Các chương trình hiếm khi sử dụng các cuộc gọi hệ thống trực tiếp, tuy nhiên, chúng hầu như chỉ có được chức năng của chúng mặc dù các thư viện bao gồm các cuộc gọi hệ thống ở định dạng hơi thân thiện hơn với ngôn ngữ lập trình, ví dụ, C có Thư viện chuẩn C và glibc trong Linux và tương tự win32 libs Windows NT trở lên, hầu hết các ngôn ngữ lập trình khác cũng có các thư viện tương tự bao bọc chức năng hệ thống theo cách thích hợp.
Các thư viện này ở một mức độ nào đó thậm chí có thể khắc phục các vấn đề đa nền tảng như được mô tả ở trên, có một loạt các thư viện được thiết kế xung quanh để cung cấp một nền tảng thống nhất cho các ứng dụng trong khi quản lý nội bộ các cuộc gọi đến một loạt các HĐH như SDL , điều này có nghĩa là mặc dù các chương trình không thể tương thích nhị phân, các chương trình sử dụng các thư viện này có thể có nguồn chung giữa các nền tảng, làm cho việc chuyển đổi đơn giản như biên dịch lại.
Ngoại lệ ở trên
Bất chấp tất cả những gì tôi đã nói ở đây, đã có những nỗ lực khắc phục những hạn chế của việc không thể chạy các chương trình trên nhiều hệ điều hành. Một số ví dụ điển hình là dự án Wine đã mô phỏng thành công cả trình tải chương trình win32, định dạng nhị phân và thư viện hệ thống cho phép các chương trình Windows chạy trên nhiều UNIX khác nhau. Ngoài ra còn có một lớp tương thích cho phép một số hệ điều hành BSD UNIX chạy phần mềm Linux và tất nhiên shim của chính Apple cho phép một người chạy phần mềm MacOS cũ trong MacOS X.
Tuy nhiên, các dự án này hoạt động thông qua mức độ lớn của nỗ lực phát triển thủ công. Tùy thuộc vào mức độ khác nhau của hai hệ điều hành, độ khó dao động từ mô phỏng khá nhỏ đến mô phỏng gần như hoàn chỉnh của hệ điều hành khác thường phức tạp hơn so với việc tự viết toàn bộ hệ điều hành và do đó đây là ngoại lệ và không phải là quy tắc.