Hệ điều hành có tiêm mã máy riêng khi bạn mở chương trình không?


32

Tôi đang nghiên cứu CPU và tôi biết cách nó đọc một chương trình từ bộ nhớ và thực hiện các hướng dẫn của nó. Tôi cũng hiểu rằng một hệ điều hành phân tách các chương trình trong các quy trình và sau đó luân phiên giữa mỗi chương trình nhanh đến mức bạn nghĩ rằng chúng đang chạy cùng một lúc, nhưng thực tế mỗi chương trình chỉ chạy một mình trong CPU. Nhưng, nếu HĐH cũng là một loạt mã chạy trong CPU, làm thế nào nó có thể quản lý các tiến trình?

Tôi đã suy nghĩ và lời giải thích duy nhất tôi có thể nghĩ là: khi HĐH tải một chương trình từ bộ nhớ ngoài vào RAM, nó sẽ thêm các hướng dẫn riêng vào giữa các hướng dẫn chương trình gốc, do đó chương trình được thực thi, chương trình được thực thi có thể gọi HĐH và làm một số việc. Tôi tin rằng có một hướng dẫn mà HĐH sẽ thêm vào chương trình, điều đó sẽ cho phép CPU trở lại mã OS một thời gian. Ngoài ra, tôi tin rằng khi HĐH tải một chương trình, nó sẽ kiểm tra xem có một số hướng dẫn bị cấm (sẽ chuyển sang các địa chỉ bị cấm trong bộ nhớ) và sau đó loại bỏ.

Tôi có suy nghĩ cứng nhắc không? Tôi không phải là sinh viên CS, nhưng thực tế, là một sinh viên toán. Nếu có thể, tôi sẽ muốn có một cuốn sách hay về điều này, vì tôi không tìm thấy ai giải thích cách HĐH có thể quản lý một quy trình nếu HĐH cũng là một loạt mã chạy trong CPU và nó không thể chạy cùng một thời gian của chương trình. Các cuốn sách chỉ nói rằng hệ điều hành có thể quản lý mọi thứ, nhưng bây giờ làm thế nào.


7
Xem: Chuyển đổi ngữ cảnh Hệ điều hành thực hiện chuyển đổi ngữ cảnh sang ứng dụng. Sau đó, ứng dụng có thể yêu cầu các dịch vụ HĐH thực hiện bối cảnh trở lại HĐH. Khi ứng dụng kết thúc, bối cảnh sẽ chuyển về HĐH.
Guy Coder

4
Xem thêm "tòa nhà cao tầng".
Raphael


1
Nếu các bình luận và câu trả lời không trả lời câu hỏi của bạn theo sự hiểu biết hoặc sự hài lòng của bạn, thì vui lòng hỏi thêm thông tin dưới dạng nhận xét và giải thích những gì bạn đang nghĩ hoặc nơi bạn bị mất hoặc cụ thể bạn cần chi tiết hơn về điều gì.
Guy Coder

2
Tôi nghĩ rằng ngắt , hooking (của một ngắt), phần cứng hẹn giờ (với lịch móc -Xử lý) và phân trang (Câu trả lời một phần nhận xét của bạn vào bộ nhớ cấm) là những từ khóa chính mà bạn cần. HĐH cần hợp tác với bộ xử lý thực sự chặt chẽ để chỉ chạy mã của nó khi cần. Do đó, hầu hết sức mạnh của CPU có thể được sử dụng trên tính toán thực tế, không phải quản lý của nó.
Palec

Câu trả lời:


35

Không. Hệ điều hành không gây rối với mã của chương trình tiêm mã mới vào đó. Điều đó sẽ có một số nhược điểm.

  1. Nó sẽ tốn thời gian, vì HĐH sẽ phải quét qua toàn bộ thực thi để thực hiện các thay đổi của nó. Thông thường, một phần của tệp thực thi chỉ được tải khi cần thiết. Ngoài ra, việc chèn rất tốn kém khi bạn phải di chuyển một đống thứ ra khỏi đường đi.

  2. Do tính không ổn định của sự cố tạm dừng, không thể biết hướng dẫn "Chuyển trở lại hệ điều hành" ở đâu. Ví dụ: nếu mã bao gồm một cái gì đó như while (true) {i++;}, bạn chắc chắn cần phải chèn một cái móc bên trong vòng lặp đó, nhưng điều kiện trên vòng lặp ( true, ở đây) có thể phức tạp tùy ý để bạn không thể quyết định vòng lặp đó kéo dài bao lâu. Mặt khác, sẽ rất kém hiệu quả khi chèn các hook vào mọi vòng lặp: ví dụ, nhảy trở lại HĐH trong khi for (i=0; i<3; i++) {j=j+i;}đó sẽ làm chậm quá trình rất nhiều. Và, với cùng một lý do, bạn không thể phát hiện các vòng lặp ngắn để chúng ở một mình.

  3. Do tính không ổn định của vấn đề tạm dừng, không thể biết liệu việc tiêm mã có làm thay đổi ý nghĩa của chương trình hay không. Ví dụ: giả sử bạn sử dụng các con trỏ hàm trong chương trình C của mình. Việc tiêm mã mới sẽ di chuyển vị trí của các hàm vì vậy, khi bạn gọi một mã qua con trỏ, bạn sẽ nhảy đến sai vị trí. Nếu lập trình viên bị bệnh đủ để sử dụng các bước nhảy được tính toán, thì những điều đó cũng sẽ thất bại.

  4. Nó sẽ chơi địa ngục vui vẻ với bất kỳ hệ thống chống vi-rút nào, vì nó cũng sẽ thay đổi mã vi-rút và làm hỏng tất cả các tổng kiểm tra của bạn.

Bạn có thể giải quyết vấn đề tạm dừng bằng cách mô phỏng mã và chèn các móc trong bất kỳ vòng lặp nào thực thi nhiều hơn một số lần cố định nhất định. Tuy nhiên, điều đó sẽ đòi hỏi mô phỏng cực kỳ tốn kém của toàn bộ chương trình trước khi nó được phép thực thi.

Trên thực tế, nếu bạn muốn tiêm mã, trình biên dịch sẽ là nơi tự nhiên để làm điều đó. Theo cách đó, bạn chỉ phải thực hiện một lần nhưng nó vẫn không hoạt động vì lý do thứ hai và thứ ba được đưa ra ở trên. (Và ai đó có thể viết một trình biên dịch không chơi cùng.)

Có ba cách chính mà HĐH lấy lại quyền kiểm soát từ các quy trình.

  1. Trong các hệ thống hợp tác (hoặc không phòng ngừa), có một yieldchức năng mà một quy trình có thể gọi để cung cấp quyền kiểm soát cho HĐH. Tất nhiên, nếu đó là cơ chế duy nhất của bạn, thì bạn phụ thuộc vào các quy trình hoạt động độc đáo và một quy trình không mang lại hiệu quả sẽ làm hỏng CPU cho đến khi nó kết thúc.

  2. Để tránh vấn đề đó, một ngắt hẹn giờ được sử dụng. CPU cho phép HĐH đăng ký các cuộc gọi lại cho tất cả các loại ngắt khác nhau mà CPU thực hiện. HĐH sử dụng cơ chế này để đăng ký gọi lại cho ngắt hẹn giờ được kích hoạt định kỳ, cho phép nó thực thi mã của chính nó.

  3. Mỗi khi một quá trình cố gắng đọc từ một tệp hoặc tương tác với phần cứng theo bất kỳ cách nào khác, đó là yêu cầu HĐH thực hiện công việc cho nó. Khi HĐH được yêu cầu làm một cái gì đó theo một quy trình, nó có thể quyết định tạm dừng quá trình đó và bắt đầu chạy một quy trình khác. Điều này nghe có vẻ hơi Machiavellian nhưng đó là điều đúng đắn: I / O của đĩa chậm nên bạn cũng có thể để quá trình B chạy trong khi tiến trình A đang chờ các khối kim loại quay tròn di chuyển đến đúng vị trí. Mạng I / O thậm chí còn chậm hơn. Bàn phím I / O là băng hà vì con người không phải là sinh vật gigahertz.


5
Bạn có thể phát triển nhiều hơn về bạn điểm 2. cuối? Tôi tò mò về câu hỏi này, và tôi cảm thấy lời giải thích bị bỏ qua ở đây. Đối với tôi có vẻ như câu hỏi là "cách hệ điều hành lấy lại CPU từ quá trình" và câu trả lời của bạn cho biết "Hệ điều hành xử lý nó". nhưng bằng cách nào? Lấy vòng lặp vô hạn trong ví dụ đầu tiên của bạn: làm thế nào để nó không đóng băng máy tính?
BiAiB

3
Một số HĐH làm, hầu hết các HĐH ít nhất phải loay hoay với mã để thực hiện "liên kết", vì vậy chương trình có thể được tải tại bất kỳ địa chỉ nào
Ian Ringrose

1
@BiAiB Từ khóa ở đây là "ngắt". CPU không chỉ là thứ xử lý một luồng hướng dẫn nhất định, nó cũng có thể bị gián đoạn không đồng bộ từ một nguồn riêng biệt - quan trọng nhất đối với chúng tôi, I / O và ngắt đồng hồ. Vì chỉ có mã không gian kernel có thể xử lý các ngắt, Windows có thể chắc chắn có thể "đánh cắp" công việc khỏi mọi quy trình đang chạy bất cứ lúc nào nó muốn. Các trình xử lý ngắt có thể thực thi bất kỳ mã nào họ muốn, bao gồm "lưu trữ các thanh ghi của CPU ở đâu đó và khôi phục chúng từ đây (một luồng khác)". Vô cùng đơn giản, nhưng đó là chuyển đổi bối cảnh.
Luaan

1
Thêm vào câu trả lời này; phong cách đa nhiệm được đề cập ở điểm 2 và 3 được gọi là "đa nhiệm được ưu tiên", cái tên này đề cập đến khả năng của HĐH trong việc ưu tiên một quy trình đang chạy. Đa nhiệm hợp tác được sử dụng thường xuyên trên các hệ điều hành cũ; trên Windows ít nhất là đa nhiệm được ưu tiên chưa được giới thiệu cho đến Windows 95. Tôi đã đọc ít nhất một hệ thống điều khiển công nghiệp đang sử dụng hiện nay vẫn chỉ sử dụng Windows 3.1 cho hành vi đa nhiệm hợp tác thời gian thực của nó.
Jason C

3
@BiAiB Thật ra, bạn đã sai. CPU máy tính để bàn không chạy mã tuần tự và đồng bộ kể từ khoảng i486. Tuy nhiên, ngay cả các CPU cũ hơn vẫn có đầu vào không đồng bộ - ngắt. Hãy tưởng tượng một yêu cầu ngắt phần cứng (IRQ) giống như một cái ghim trên chính CPU - khi nhận được 1, CPU sẽ dừng mọi hoạt động và bắt đầu xử lý ngắt (về cơ bản có nghĩa là "giữ trạng thái và chuyển đến một địa chỉ trong bộ nhớ"). Bản thân việc xử lý ngắt không phải là x86bất kỳ mã nào, nó thực sự khó khăn. Sau khi nhảy, nó lại thực thi mã (bất kỳ) x86. Chủ đề là một cách trừu tượng cao hơn.
Luaan

12

Mặc dù câu trả lời của David Richerby là một câu hỏi hay, nhưng nó thực sự sáng tỏ về cách các hệ điều hành hiện đại tạm dừng các chương trình hiện có. Câu trả lời của tôi phải chính xác cho kiến ​​trúc x86 hoặc x86_64, đây là kiến ​​trúc duy nhất thường được sử dụng cho máy tính để bàn và máy tính xách tay. Các kiến ​​trúc khác nên có phương pháp tương tự để đạt được điều này.

Khi hệ điều hành khởi động, nó sẽ thiết lập một bảng ngắt. Mỗi mục của bảng trỏ đến một chút mã bên trong hệ điều hành. Khi ngắt xảy ra, được điều khiển bởi CPU, nó nhìn vào bảng này và gọi mã. Có nhiều ngắt khác nhau, chẳng hạn như chia cho 0, mã không hợp lệ và một số mã được xác định bởi hệ điều hành.

Đây là cách quá trình người dùng nói chuyện với kernel, chẳng hạn như nếu nó muốn đọc / ghi vào đĩa hoặc thứ gì khác mà kernel hệ điều hành kiểm soát. Một hệ điều hành cũng sẽ thiết lập bộ đếm thời gian gọi ngắt khi kết thúc, do đó mã đang chạy bị thay đổi từ chương trình người dùng sang nhân hệ điều hành và hạt nhân có thể thực hiện những việc khác như xếp hàng các chương trình khác để chạy.

Từ bộ nhớ, khi điều này xảy ra, nhân hệ điều hành phải lưu mã ở đâu và khi nhân đã hoàn thành việc cần làm, nó sẽ khôi phục trạng thái trước đó của chương trình. Do đó, chương trình thậm chí không biết rằng nó đã bị gián đoạn.

Quá trình không thể thay đổi bảng ngắt vì hai lý do, thứ nhất là nó đang chạy trong một môi trường được bảo vệ, vì vậy nếu nó cố gắng gọi một số mã lắp ráp được bảo vệ nhất định thì cpu sẽ kích hoạt một ngắt khác. Lý do thứ hai là bộ nhớ ảo. Vị trí của bảng ngắt là 0x0 đến 0x3FF trong bộ nhớ thực, nhưng với các quy trình người dùng, vị trí đó thường không được ánh xạ và cố gắng đọc bộ nhớ chưa được ánh xạ sẽ kích hoạt một ngắt khác, do đó không có chức năng được bảo vệ và khả năng ghi vào RAM thực , quá trình người dùng không thể thay đổi nó.


4
Các ngắt không được xác định bởi hệ điều hành, chúng được cung cấp bởi phần cứng. Và hầu hết các kiến ​​trúc hiện tại có hướng dẫn đặc biệt để gọi hệ điều hành. i386 đã sử dụng một ngắt (phần mềm được tạo) cho việc này, nhưng nó không còn được thực hiện theo cách đó nữa trên những người kế nhiệm của nó.
vonbrand

2
Tôi biết rằng các ngắt được xác định bởi cpu, nhưng kernel thiết lập các con trỏ. Tôi có thể giải thích nó một cách tồi tệ. Tôi cũng nghĩ rằng linux đã sử dụng int 9 để nói chuyện với kernel, nhưng có lẽ có nhiều cách tốt hơn bây giờ.
Chương trình

Đây là một câu trả lời khá sai lệch mặc dù quan niệm rằng các bộ lập lịch ưu tiên được điều khiển bởi các ngắt hẹn giờ là chính xác. Đầu tiên, đáng chú ý là bộ đếm thời gian nằm trong phần cứng. Ngoài ra để làm rõ rằng quá trình "lưu ... khôi phục" được gọi là chuyển đổi ngữ cảnh và chủ yếu liên quan đến việc lưu tất cả các thanh ghi CPU (bao gồm con trỏ lệnh), trong số những thứ khác. Ngoài ra, các quy trình có thể thay đổi hiệu quả các bảng ngắt, đây được gọi là "chế độ được bảo vệ", cũng xác định bộ nhớ ảo và đã xuất hiện từ năm 286 - một con trỏ tới bảng ngắt được lưu trữ trong một thanh ghi có thể ghi.
Jason C

(Ngoài ra, ngay cả bảng ngắt chế độ thực cũng có thể di chuyển được - không bị khóa vào trang đầu tiên của bộ nhớ - kể từ năm 8086.)
Jason C

1
Câu trả lời này bỏ lỡ một chi tiết quan trọng. Khi ngắt xảy ra, CPU không chuyển trực tiếp sang kernel. Thay vào đó, đầu tiên nó lưu các thanh ghi hiện có, sau đó chuyển sang ngăn xếp khác và chỉ sau đó là kernel được gọi. Gọi kernel với ngăn xếp ngẫu nhiên từ một chương trình ngẫu nhiên sẽ là một ý tưởng khá tồi. Ngoài ra, phần cuối cùng là sai lệch. Bạn sẽ không bị gián đoạn "cố gắng" đọc bộ nhớ chưa được xử lý; nó đơn giản là không thể Bạn đọc từ các địa chỉ ảo và bộ nhớ chưa được ánh xạ đơn giản là không có địa chỉ ảo.
MSalters

5

Nhân hệ điều hành được kiểm soát trở lại từ quá trình đang chạy do trình xử lý ngắt đồng hồ CPU, chứ không phải bằng cách đưa mã vào quy trình.

Bạn nên đọc về các ngắt để hiểu rõ hơn về cách chúng hoạt động và cách các nhân hệ điều hành xử lý chúng và thực hiện các tính năng khác nhau.


Không chỉ ngắt đồng hồ: bất kỳ ngắt. Và cũng hướng dẫn thay đổi chế độ.
Gilles 'SO- ngừng trở nên xấu xa'

3

một phương pháp tương tự như những gì bạn mô tả: đa nhiệm hợp tác xã . HĐH không chèn hướng dẫn, nhưng mỗi chương trình phải được viết để gọi các chức năng của HĐH có thể chọn chạy một quy trình hợp tác khác. Điều này có những nhược điểm mà bạn mô tả: một chương trình bị sập sẽ phá hủy toàn bộ hệ thống. Windows lên đến và bao gồm 3.0 hoạt động như thế này; 3.0 trong "chế độ được bảo vệ" trở lên thì không.

Đa nhiệm ưu tiên (loại bình thường ngày nay) phụ thuộc vào nguồn gián đoạn bên ngoài. Ngắt ghi đè luồng điều khiển thông thường và thường lưu các thanh ghi ra ở đâu đó, do đó CPU có thể làm một cái gì đó khác và sau đó tiếp tục chương trình một cách trong suốt. Tất nhiên, hệ điều hành có thể thay đổi đăng ký "khi bạn để lại tiếp tục ngắt ở đây", vì vậy nó sẽ tiếp tục trong một quy trình khác.

(Một số hệ thống thực hiện viết lại các hướng dẫn theo cách giới hạn về tải chương trình, được gọi là "thunking" và bộ xử lý Transmeta tự động biên dịch lại thành tập lệnh của chính nó)


AFAICR 3.1 cũng hợp tác. Win95 là nơi đa nhiệm được ưu tiên xuất hiện. Chế độ được bảo vệ chủ yếu mang lại sự cô lập không gian địa chỉ (giúp cải thiện sự ổn định, nhưng vì nhiều lý do không liên quan).
cHao

Thunking không viết lại hoặc tiêm mã vào ứng dụng. Trình tải được sửa đổi dựa trên hệ điều hành và không phải là sản phẩm của ứng dụng. Các ngôn ngữ diễn giải được biên dịch như sử dụng trình biên dịch JIT không sửa đổi mã, cũng không tiêm bất cứ thứ gì vào mã. Họ dịch mã nguồn thành một tệp thực thi. Một lần nữa, điều này không giống như việc tiêm mã vào một ứng dụng.
Dave Gordon

Transmeta lấy mã thực thi x86 làm nguồn, không phải là ngôn ngữ diễn giải. Và tôi đã nghĩ đến một trường hợp trong đó mã được tiêm: chạy theo trình gỡ lỗi. Các hệ thống X86 thường ghi đè lên lệnh tại điểm dừng với "INT 03", bẫy vào trình gỡ lỗi. Khi tiếp tục, opcode gốc được phục hồi.
pjc50

Gỡ lỗi hầu như không ai chạy ứng dụng; ngoài đó là nhà phát triển của ứng dụng. Vì vậy, tôi không nghĩ rằng điều đó thực sự giúp OP.
Dave Gordon

3

Đa tác vụ không yêu cầu bất cứ điều gì như tiêm mã. Trong một hệ điều hành như Windows, có một thành phần của mã hệ điều hành được gọi là bộ lập lịch dựa trên ngắt phần cứng được kích hoạt bởi bộ đếm thời gian phần cứng. Điều này được sử dụng bởi hệ điều hành để chuyển đổi giữa các chương trình khác nhau và chính nó, làm cho tất cả dường như nhận thức của con người chúng ta xảy ra đồng thời.

Về cơ bản, hệ điều hành lập trình tắt bộ đếm thời gian phần cứng thường xuyên ... có thể 100 lần một giây. Khi bộ hẹn giờ tắt, nó sẽ tạo ra một ngắt phần cứng - tín hiệu báo cho CPU dừng việc đang làm, lưu trạng thái của nó trên ngăn xếp, thay đổi chế độ của nó thành một thứ gì đó đặc quyền hơn và thực thi mã mà nó sẽ tìm thấy trong một chỉ định đặc biệt nơi trong ký ức. Mã đó là một phần của bộ lập lịch, quyết định những gì nên được thực hiện tiếp theo. Nó có thể là để tiếp tục một số quy trình khác, trong trường hợp đó, nó sẽ phải thực hiện cái được gọi là "chuyển đổi ngữ cảnh" - thay thế toàn bộ trạng thái hiện tại của nó (bao gồm các bảng bộ nhớ ảo) bằng quy trình khác. Khi trở lại một quy trình, nó phải khôi phục tất cả bối cảnh của quy trình đó,

Vị trí "được chỉ định đặc biệt" trong bộ nhớ không phải được biết bởi bất kỳ thứ gì ngoài hệ điều hành. Việc triển khai khác nhau, nhưng ý chính của nó là CPU sẽ đáp ứng các ngắt khác nhau bằng cách thực hiện tra cứu bảng; vị trí của bảng nằm ở một vị trí cụ thể trong bộ nhớ (được xác định bởi thiết kế phần cứng của CPU), nội dung của bảng được đặt bởi hệ điều hành (thường là vào thời gian khởi động) và "loại" ngắt sẽ xác định mục nào trong bảng sẽ được sử dụng như "thói quen phục vụ ngắt".

Không có gì trong số này liên quan đến "tiêm mã" ... nó dựa trên mã có trong hệ điều hành để hợp tác với các tính năng phần cứng của CPU và mạch hỗ trợ của nó.


2

Tôi nghĩ rằng ví dụ thực tế gần nhất với những gì bạn mô tả là một trong những kỹ thuật được sử dụng bởi VMware , Ảo hóa toàn bộ bằng cách sử dụng dịch nhị phân .

VMware hoạt động như một lớp bên dưới một hoặc nhiều hệ điều hành đồng thời trên cùng một phần cứng.

Hầu hết các hướng dẫn đang được thực thi (ví dụ như trong các ứng dụng thông thường) có thể được ảo hóa bằng phần cứng, nhưng chính nhân hệ điều hành sử dụng các hướng dẫn không thể được ảo hóa, bởi vì nếu mã máy của HĐH đoán được thực thi không được sửa đổi, nó sẽ "bị hỏng "Kiểm soát máy chủ VMware. Ví dụ, một hệ điều hành khách sẽ cần chạy trong vòng bảo vệ đặc quyền nhất và thiết lập bảng ngắt. Nếu được phép làm điều đó, VMware sẽ mất quyền kiểm soát phần cứng.

VMware viết lại các hướng dẫn đó trong mã hệ điều hành trước khi thực hiện nó, thay thế chúng bằng cách nhảy vào mã VMware mô phỏng hiệu ứng mong muốn.

Vì vậy, kỹ thuật này là hơi giống với những gì bạn mô tả.


2

Có nhiều trường hợp trong đó một hệ điều hành có thể "tiêm mã" vào một chương trình. Các phiên bản dựa trên 68000 của hệ thống Apple Macintosh xây dựng một bảng gồm tất cả các điểm nhập phân khúc (nằm ngay trước các biến toàn cục tĩnh, IIRC). Khi một chương trình bắt đầu, mỗi mục trong bảng bao gồm một lệnh bẫy theo sau là số phân đoạn và bù vào phân đoạn. Nếu bẫy được thực thi, hệ thống sẽ xem xét các từ sau lệnh bẫy để xem phân đoạn và phần bù nào được yêu cầu, tải đoạn đó (nếu chưa có), thêm địa chỉ bắt đầu của đoạn vào phần bù và sau đó thay thế bẫy bằng một bước nhảy đến địa chỉ mới được tính toán đó.

Trên phần mềm PC cũ hơn, mặc dù điều này không được "HĐH" thực hiện về mặt kỹ thuật, nhưng thông thường mã được xây dựng bằng các hướng dẫn bẫy thay vì hướng dẫn toán học của bộ đồng xử lý. Nếu không có bộ đồng xử lý toán học nào được cài đặt, trình xử lý bẫy sẽ mô phỏng nó. Nếu một bộ đồng xử lý đã được cài đặt, lần đầu tiên sử dụng bẫy, trình xử lý sẽ thay thế lệnh bẫy bằng một lệnh đồng xử lý; thực thi trong tương lai của cùng một mã sẽ sử dụng hướng dẫn bộ đồng xử lý trực tiếp.


Phương pháp FP vẫn được sử dụng trên các bộ xử lý ARM, không giống như CPU ​​x86 vẫn có các biến thể không có FP. Nhưng nó hiếm khi sử dụng ARM trong các thiết bị chuyên dụng. Trong những môi trường đó, người ta thường biết liệu CPU sẽ có khả năng FP hay không.
MSalters

Trong cả hai trường hợp này, HĐH không tiêm mã vào ứng dụng. Để HĐH tiêm mã, nó sẽ cần giấy phép của nhà cung cấp phần mềm để "sửa đổi" ứng dụng mà nó không nhận được. Hệ điều hành KHÔNG tiêm mã.
Dave Gordon

@DaveGordon Các hướng dẫn bị bẫy có thể được gọi một cách hợp lý là mã tiêm hệ điều hành vào ứng dụng.
Gilles 'SO- ngừng trở nên xấu xa'

@MSalters Hướng dẫn bị bẫy thường xảy ra trong các máy ảo.
Gilles 'SO- ngừng trở nên xấu xa'
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.