Điều gì ngăn một chương trình lắp ráp làm hỏng hệ điều hành? [đóng cửa]


17

Trước hết, tôi là người mới bắt đầu, vì vậy nếu câu hỏi này nghe có vẻ ngớ ngẩn, xin vui lòng chỉ ra các giả định không chính xác.

Theo những gì tôi hiểu, công việc của một hệ điều hành là quản lý phần cứng và phần mềm chạy trên HĐH. Ngoài ra, từ những gì tôi hiểu, các chương trình lắp ráp cho phép một người kiểm soát phần cứng gần như trực tiếp. Trong một chương trình lắp ráp, người ta có thể đọc và ghi dữ liệu vào các thanh ghi, đọc và ghi dữ liệu vào RAM.

Với sự tự do này để gây rối với các thanh ghi và RAM, các chương trình lắp ráp có thể ảnh hưởng đến hệ điều hành không? Giả sử một HĐH đang sử dụng thanh ghi A để lưu trữ thông tin quan trọng và giả sử tôi chạy một chương trình được lắp ráp trên HĐH đó. Nếu chương trình ghi thành công rác vào đăng ký A, hệ điều hành chắc chắn sẽ bị ảnh hưởng.

Câu hỏi:

  1. Có thể gây rối với đăng ký A theo cách được mô tả ở trên?

  2. Nếu không, điều gì ngăn các chương trình lắp ráp sửa đổi các thanh ghi được sử dụng bởi HĐH?


13
lập trình viên thông minh ...
Tony Stewart Sunnyskyguy EE75

Có rất nhiều kiến ​​trúc máy tính bây giờ và trong quá khứ, cũng như nhiều hệ thống hoạt động đã được phát triển. Kiến trúc / HĐH nào bạn đang đề cập chính xác? Trên một số kiến ​​trúc (cũ) không có khả năng dừng chương trình khỏi những gì nó đang làm sau khi bắt đầu, điều đó là chính xác. Nhưng phần cứng / HĐH hiện đại đã tích hợp sẵn các công cụ phần cứng chỉ cung cấp một phần bộ nhớ cho chương trình ở chế độ "bình thường" (không phải siêu người dùng) và nó không thể truy cập bộ nhớ ngoài giới hạn này. Các thanh ghi được sử dụng miễn phí, vì HĐH không lưu trữ bất kỳ thông tin hữu ích nào trong các thanh ghi, chỉ trong bộ nhớ / trên đĩa.
lốc xoáy125

2
Trong bộ vi xử lý, chương trình của bạn chạy ở "chế độ người dùng", các hệ điều hành chạy ở "chế độ hệ thống". Ví dụ, nếu một chương trình chế độ người dùng thực hiện một lệnh dừng, máy sẽ không dừng lại. Tạm dừng sẽ bị mắc kẹt và hệ điều hành được gọi. Về RAM, HĐH sẽ thiết lập môi trường cho chương trình chế độ người dùng để thông qua phần cứng quản lý bộ nhớ, chương trình người dùng thấy địa chỉ RAM X sẽ không thực sự là địa chỉ RAM X.
George White

1
@flux Mình đã cập nhật bình luận của mình. Câu trả lời sẽ là: không có câu trả lời "chung chung" cho câu hỏi của bạn, vì có / là các kiến ​​trúc máy tính / HĐH khác nhau. Nó có thể theo những cách khác nhau.
lốc xoáy125

2
... Từ lâu tôi đã từng viết mã máy thô. Ye ha !!! :-)
Russell McMahon

Câu trả lời:


32

Cuối cùng, tất cả các chương trình là mã máy, bất kể ngôn ngữ nguồn là trình biên dịch hay ngôn ngữ cấp cao.

Điều quan trọng là có các cơ chế phần cứng giới hạn những gì một quy trình nhất định có thể làm, bao gồm các thanh ghi "gây rối" có thể ảnh hưởng đến các chương trình khác hoặc chính hệ điều hành.

Điều này bắt đầu bằng một sự phân biệt đơn giản giữa chế độ hoạt động của "người dùng" và "người giám sát", và từ đó đã phát triển thành một kiến ​​trúc bảo mật với nhiều "vòng" đặc quyền.


Đây là một ví dụ rất chung chung để làm cho nó cụ thể hơn một chút:

  • Trong "chế độ người dùng", một quy trình không thể truy cập bộ nhớ chưa được gán cho ID tiến trình của nó. Bộ nhớ được gán cho các tiến trình khác và chính hệ điều hành bị chặn. Điều này bao gồm các giá trị của các thanh ghi được sử dụng bởi các quá trình khác. Điều này được thi hành bởi phần cứng MMU.

  • Do đó, trong "chế độ người dùng", một quy trình không thể truy cập vào các thanh ghi điều khiển MMU.

  • Và rõ ràng, trong "chế độ người dùng", một quy trình không thể thay đổi chế độ thành "chế độ giám sát" ngoại trừ thông qua một cơ chế được xác định rõ ràng liên quan đến việc gọi một chức năng của hệ điều hành.

Hệ điều hành được kiểm soát nếu quá trình cố gắng phá vỡ bất kỳ quy tắc nào trong số này. Khi điều đó xảy ra, HĐH có thể đơn giản dừng quá trình vi phạm, không bao giờ thực hiện thêm bất kỳ hướng dẫn nào.


2
Nếu tôi hiểu chính xác, điều bạn đang nói là: Một số bộ xử lý có "chế độ người dùng" và "chế độ giám sát". HĐH chạy trong "chế độ giám sát" và đặt bộ xử lý vào "chế độ người dùng" để chạy chương trình lắp ráp giả tưởng của tôi. Trong "chế độ người dùng", có các thanh ghi và địa chỉ RAM mà chương trình lắp ráp không thể truy cập do thiết kế phần cứng có chủ ý.
Flux

3
Về cơ bản, câu trả lời này mô tả các kiến ​​trúc "giống như i386" hiện đại với chế độ MMU và Protected. Nhưng sự thật là có rất nhiều kiến ​​trúc cũ (i8080, MOS 6502, v.v.) cũng như các kiến ​​trúc đơn giản hiện đại (AVR, ARM Cortex-M, v.v.) không có các tính năng này và nếu một loại hệ điều hành nào đó được sử dụng (ví dụ: cũ CP / M, FreeRTOS hiện đại, ChibiOS, v.v.) không gì có thể ngăn chương trình khỏi những gì nó đang làm.
lốc xoáy125

2
@Flux Các kiến ​​trúc i386 (và ở trên) cung cấp chi tiết để tìm hiểu. Kiến trúc x86 không chỉ có các địa chỉ bộ nhớ có thể được bảo vệ mà cả các địa chỉ I / O cũng vậy. (Có các hướng dẫn khác nhau được sử dụng để truy cập bộ nhớ so với truy cập I / O.) Có ba địa chỉ bộ nhớ trong i386 +. Địa chỉ dựa trên phân đoạn / bộ chọn sử dụng một thanh ghi chọn tham chiếu mục nhập bảng (GDT hoặc LDT) để ánh xạ cặp vào một địa chỉ tuyến tính 32 bit duy nhất. Các bảng phân trang sau đó dịch địa chỉ tuyến tính 32 bit thành địa chỉ vật lý 36 bit (P-II.) Bảo vệ tồn tại ở cả hai bước dịch.
jonk

4
@flux tóm tắt của bạn là chính xác. Một chương trình trong hệ thống bộ nhớ được bảo vệ với hệ điều hành đa nhiệm phù hợp sẽ không thể làm sập hệ thống với bất kỳ luồng hướng dẫn nào. Ngay cả những người không hợp lệ - những người kết thúc tại một xử lý đặc biệt.
pjc50

Mặc dù có nhiều vòng (ít nhất là x86), nhưng rất hiếm khi có nhiều hơn hai vòng thực sự được sử dụng.
rừng

10

Nhiều hệ điều hành đa nhiệm sử dụng cấu trúc dữ liệu được gọi là Khối điều khiển quy trình (PCB) để xử lý vấn đề ghi đè đăng ký. Khi bạn chạy mã của mình, HĐH sẽ tạo ra một quy trình mới để theo dõi mã đó. PCB chứa thông tin về quy trình và không gian của bạn được phân bổ để chứa nội dung đăng ký. Giả sử quy trình A hiện đang chạy trên bộ xử lý và mã của bạn đang trong quá trình B. Điều gì xảy ra khi bạn chạy mã của mình xảy ra sự cố này:

  1. Dữ liệu trạng thái của quy trình A (nội dung đăng ký, bộ đếm chương trình, v.v.) được sao chép vào PCB của nó.

  2. Dữ liệu trạng thái của tiến trình B được sao chép từ PCB của nó vào các thanh ghi CPU

  3. Quá trình B chạy trên bộ xử lý cho đến khi nó kết thúc hoặc được ưu tiên

  4. Dữ liệu trạng thái của quy trình B được sao chép lại vào PCB của nó

  5. Dữ liệu trạng thái của Quá trình A được sao chép lại vào CPU và nó tiếp tục chạy

Nếu hệ điều hành đang chạy như tiến trình A, thì bạn có thể thấy cách lưu các thanh ghi của nó trước khi chương trình của bạn chạy sau đó sao chép chúng trở lại vào CPU khi chương trình của bạn kết thúc sẽ ngăn chương trình người dùng làm rối tung những gì đang diễn ra trong các quy trình khác.

Để tránh quá trình người dùng ghi dữ liệu hệ điều hành vào bộ nhớ, hầu hết các nền tảng đều sử dụng phân đoạn bộ nhớ. Về cơ bản, sử dụng bộ nhớ ảo, không gian địa chỉ mà quá trình nhìn thấy có thể được ánh xạ tới bất kỳ phạm vi địa chỉ vật lý tùy ý nào. Miễn là không gian bộ nhớ vật lý của các quy trình không trùng nhau, một quy trình không thể ghi đè lên dữ liệu của người khác.

Tất nhiên, các hệ điều hành khác nhau làm những việc khác nhau, vì vậy điều này sẽ không áp dụng trong mọi trường hợp. Ngoài ra, trên hầu hết các nền tảng, các quy trình HĐH chạy ở chế độ khác với quy trình của người dùng và có một số điều phức tạp ở đó.


4

Phụ thuộc vào nền tảng mà bạn đang nói về.

  • Trên một bộ xử lý cơ bản hơn, bộ xử lý chỉ thực hiện bất kỳ hướng dẫn nào mà chương trình yêu cầu nó thực thi.

  • Trên một bộ xử lý tinh vi hơn, có (ít nhất) hai chế độ. Trong một chế độ, bộ xử lý làm bất cứ điều gì chương trình yêu cầu nó làm. Ở chế độ khác, bộ xử lý tự từ chối thực hiện một số lệnh nhất định.

Điều gì ngăn chặn một chương trình sụp đổ toàn bộ hệ thống? Với loại bộ xử lý đầu tiên, câu trả lời là "không có gì". Với một bộ xử lý cơ bản, một chương trình giả mạo duy nhất thực sự có thể đánh sập toàn bộ hệ thống. Tất cả các máy tính gia đình 8 bit đầu tiên, và nhiều máy tính 16 bit, đều thuộc loại này.

Trên PC hiện đại, bộ xử lý có phần cứng "bảo vệ". Về cơ bản, HĐH chạy ở chế độ đặc biệt cho phép nó làm bất cứ điều gì, trong khi các chương trình bình thường chạy ở chế độ mà bộ xử lý sẽ chỉ cho phép một số hành động nhất định (dựa trên cài đặt nào mà HĐH đã cấu hình trên bộ xử lý). Những thứ như chỉ truy cập vào các thanh ghi nhất định hoặc chỉ truy cập vào phạm vi bộ nhớ cụ thể.

Rõ ràng, cho phép một chương trình giả mạo duy nhất làm sập toàn bộ hệ thống là điều tồi tệ. (Ngoài ra còn có ý nghĩa bảo mật nghiêm trọng trong việc cho phép một chương trình giả mạo truy cập bất kỳ dữ liệu nào nó muốn.) Để tránh điều này, bạn cần hai điều:

  1. Một bộ xử lý thực sự có phần cứng bảo vệ (nghĩa là, nó có thể được cấu hình để từ chối thực hiện các hướng dẫn nhất định).

  2. Một hệ điều hành thực sự sử dụng các cơ sở này để bảo vệ chính nó. (Thật không tốt khi có một con chip có mạch bảo vệ nếu HĐH không bao giờ sử dụng nó!)

Chỉ cần về bất kỳ HĐH máy tính để bàn hiện đại nào bạn có thể đặt tên (Windows, Linux, Mac OS, BSD ...) đó là HĐH chế độ được bảo vệ chạy trên bộ xử lý có phần cứng bảo vệ. Nếu bạn đang thực hiện phát triển nhúng trên một số vi điều khiển 8 bit, điều đó có thể không có bất kỳ phần cứng bảo vệ nào. (Hoặc bất kỳ HĐH nào, cho vấn đề đó ...)


1

Q. Điều gì ngăn một chương trình lắp ráp làm hỏng hệ điều hành?

A. Không có gì.

Tuy nhiên, rất nhiều lập trình viên rất thông minh đã cố gắng rất nhiều trong những năm qua để làm cho nó ngày càng khó khăn hơn. Thật không may, đối với mỗi lập trình viên thông minh, có rất nhiều, rất nhiều người khác giữa họ sáng tạo hơn, tham vọng hơn, và đôi khi chỉ là may mắn hơn những người thông minh. Mỗi khi một lập trình viên thông minh nói rằng không ai nên, sẽ hoặc có thể làm điều gì đó, một ai đó ngoài kia sẽ tìm ra cách để làm điều đó. Microsoft Windows (là một ví dụ) đã tồn tại gần 35 năm và chúng tôi vẫn có BSoD (Màn hình xanh chết chóc), đây chỉ là những hướng dẫn làm sập hệ điều hành.

Hãy bắt đầu với một thuật ngữ nhỏ. Tất cả mọi thứ chạy trên máy tính đều làm như vậy trong mã máy. Bit đọc tổ hợp phím hoặc chuyển động của con trỏ chuột, bit thay đổi màu của pixel trên màn hình hoặc đọc một byte từ tệp và bit tính toán xem viên đạn của bạn đánh kẻ xấu hay bit quyết định nếu ứng dụng thẻ tín dụng của bạn sẽ được chấp nhận, tất cả sẽ được thực hiện dưới dạng một chuỗi các hướng dẫn mã máy. Một số công việc rất phổ biến và được thực hiện thường xuyên đến mức có ý nghĩa để lắp ráp các hướng dẫn cần thiết để thực hiện chúng và để mọi người sử dụng lắp ráp đó. Một loạt các công việc cho phép hoặc giúp người khác sử dụng máy tính có xu hướng được gọi là hệ điều hành nhưng không có gì khác biệt giữa chúng và bất kỳ chương trình nào khác. Tất cả chúng chỉ là chuỗi các hướng dẫn mã máy.

Điều khiến các hệ điều hành trở nên phức tạp hơn (và do đó dễ bị sập) là chúng phải tính đến những thứ mà bạn thường không phải suy nghĩ. Lấy đơn giản nhất của công việc làm ví dụ. Tôi muốn viết một tin nhắn đến cuối tập tin. Trong một ngôn ngữ cấp cao, bạn sẽ viết một cái gì đó như:

  with open("myFile.txt", "w+") as f:
      # do some really clever things
      f.write("Goodbye cruel world!")

Hãy bỏ qua tất cả các chi tiết về cách các trạng thái vật lý được truy cập và thay đổi hoặc cách chúng được hiểu là bit và byte hoặc cách các byte đó được chuyển đến và từ bộ nhớ và CPU, và tin tưởng rằng tất cả những gì được xử lý bởi các chương trình mà HĐH cung cấp đằng sau hậu trường. Hãy chỉ nghĩ về cách bạn nối vào cuối tập tin. 1) Tìm ra nơi kết thúc của tập tin, 2) viết một cái gì đó ở vị trí đó. Cái gì có thể đi sai? Thật ra, khá nhiều. Hãy suy nghĩ về những gì khác đang xảy ra trên máy tính trong khi bạn đang làm những thứ thông minh. Nếu bất cứ điều gì khác được thực hiện bởi bất kỳ ai khác (bao gồm cả chính hệ điều hành) thay đổi tệp bạn đang làm theo bất kỳ cách nào, thì công việc thực sự đơn giản này đột nhiên trở nên phức tạp hơn rất nhiều. Tập tin dài hơn, tập tin ngắn hơn. Các tập tin không còn ở đó nữa. Đĩa đầy,

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.