2010-01-13 11 views
12

Một vấn đề thực thi như exe không hoạt động trên Linux (không có rượu). Khi biên dịch trình biên dịch mã nguồn tạo ra mã đối tượng mà cụ thể cho một kiến ​​trúc cpu cụ thể. Nhưng cùng một ứng dụng không làm việc với trên một hệ điều hành khác với cùng một CPU. Tôi biết mã có thể bao gồm các hướng dẫn cụ thể cho hệ điều hành sẽ ngăn chặn chạy thực thi. Nhưng những gì về một chương trình đơn giản 2 + 2? Phần khó hiểu là những gì mã máy địa ngục ngăn cản làm việc. Mã máy cụ thể cho CPU phải không? Nếu chúng ta tách định dạng tệp thực thi, chúng ta có thể thấy cùng một mã máy (như 2 + 2) cho cả hai hệ điều hành không?Tại sao một chương trình thực thi cho một CPU cụ thể không hoạt động trên Linux và Windows?

Một câu hỏi nữa: Còn ngôn ngữ lắp ráp thì sao? DO cửa sổ và Linux sử dụng ngôn ngữ lắp ráp khác nhau cho cùng một CPU ?.

+1

Bạn có thể kiểm tra câu trả lời mà mọi người đã cung cấp cho bạn bằng cách biên dịch một số mã đơn giản (ví dụ 'int main (int argc, char ** argv) {int a = 2; a + = 2; return 0;}') trên cả hai hệ điều hành, chạy 'objdump -dS' trên hai tệp' .o' và so sánh đầu ra asm - bạn sẽ thấy sự khác biệt trong đầu ra trình biên dịch. – laura

+0

@ laura - đúng, nhưng sự khác biệt về trình biên dịch sẽ có khả năng áp đảo sự khác biệt nền tảng thực tế ở cấp đó. – codekaizen

Trả lời

15

Có nhiều điểm khác biệt. Trong đó:

  1. thực thi Format: Mỗi hệ điều hành đòi hỏi những chương trình để phù hợp với một định dạng nhị phân cụ thể. Đối với Windows, đây là định dạng Portable Executable (PE). Đối với Linux, hầu hết thời gian là ELF (nó cũng hỗ trợ các loại khác).

  2. Giao diện nhị phân ứng dụng: Mỗi hệ điều hành xác định tập hợp các chức năng hệ thống chính và cách chương trình gọi chúng. Điều này về cơ bản là khác nhau giữa Linux và Windows. Trong khi các hướng dẫn tính toán 2 + 2 giống hệt nhau trên Linux và Windows trong kiến ​​trúc x86, cách ứng dụng bắt đầu, cách nó in ra đầu ra và cách nó thoát ra khác nhau giữa các hệ điều hành.

Có, cả hai chương trình Linux và Windows trên kiến ​​trúc x86 đều sử dụng bộ lệnh mà CPU hỗ trợ do Intel xác định.

12

Đó là do sự khác biệt về cách chương trình được tải vào bộ nhớ và cung cấp tài nguyên để chạy. Ngay cả các chương trình đơn giản nhất cũng cần có không gian mã, không gian dữ liệu và khả năng thu được bộ nhớ thời gian chạy và làm I/O. Cơ sở hạ tầng để thực hiện các tác vụ cấp thấp này hoàn toàn khác nhau giữa các nền tảng, trừ khi bạn có một số loại lớp thích ứng, như WINE hoặc Cygwin. Tuy nhiên, giả sử bạn chỉ có thể tiêm các lệnh CPU được lắp ráp tùy ý vào đoạn mã của một tiến trình đang chạy và nhận mã đó để thực thi, thì, có, cùng mã sẽ chạy trên một trong hai nền tảng. Tuy nhiên, nó sẽ khá hạn chế, và làm những việc phức tạp như thậm chí nhảy vào các mô-đun bên ngoài sẽ thất bại, do cách những thứ này được thực hiện khác nhau trên các nền tảng khác nhau.

+0

Tôi cho rằng bạn không cần phải quan tâm đến cách hệ điều hành phân bổ bộ nhớ, dung lượng đĩa, vv trên bất kỳ nền tảng nào để nó thực sự không trở thành một vấn đề. Vấn đề chính là gọi hệ thống và gói nó theo cách mà hệ điều hành biết phải làm gì với nó, đó là những gì rượu vang chủ yếu làm (mà không thể nói chuyện với hệ điều hành bạn không thể thực sự làm bất cứ điều gì, đặc biệt là I/O hoặc cấp phát bộ nhớ bổ sung). Cygwin chủ yếu là một mô phỏng của không gian người dùng Unix thay vì sau đó một bản dịch cấp thấp - các chương trình vẫn cần phải được biên dịch lại để làm việc trong Cygwin. – Matt

+1

@envalid - Lý tưởng nhất, những thứ đó sẽ được trừu tượng hóa. Tuy nhiên, ở cấp độ người dùng đang nói về, khi bạn yêu cầu bộ nhớ (trong vòng 3, không gian người dùng), bạn phải hỏi hệ điều hành. Tương tự cho I/O. Làm thế nào để hỏi là khác nhau giữa các nền tảng, và đó là quan điểm của tôi. – codekaizen

2

Có, nhưng, mã luôn gọi ra các chức năng của thư viện để thực hiện bất cứ thứ gì - như in "4" đến thiết bị đầu cuối. Và các thư viện này là nền tảng cụ thể và khác nhau giữa Linux và Windows. Đây là lý do tại sao nó không phải di động - không, thực sự, một vấn đề cấp giảng dạy.

3

Vấn đề 1 là định dạng hình ảnh. Khi một ứng dụng được đưa vào thực thi, Os phải tải hình ảnh applicaiton, tìm ra điểm vào của nó và khởi chạy nó từ đó. Điều đó có nghĩa là hệ điều hành phải hiểu định dạng hình ảnh và có các định dạng khác nhau giữa các hệ điều hành khác nhau.

Sự cố 2 là quyền truy cập vào thiết bị. Sau khi khởi chạy một ứng dụng có thể đọc và ghi các đăng ký trong CPU và đó là về nó. Để làm bất cứ điều gì thú vị, như để hiển thị một nhân vật trên một giao diện điều khiển, nó cần truy cập vào các thiết bị và điều đó có nghĩa là nó phải yêu cầu truy cập như vậy từ hệ điều hành. Mỗi Os có một API khác nhau được cung cấp để truy cập các thiết bị đó.

Vấn đề 3 là hướng dẫn riêng. Quá trình mới được đưa ra có lẽ sẽ cần một vị trí bộ nhớ để lưu trữ một cái gì đó, không thể hoàn thành tất cả mọi thứ với regiestries. Điều này có nghĩa là nó cần phân bổ RAM và thiết lập bản dịch từ VA thành địa chỉ vật lý. Đây là những hoạt động riêng tư mà chỉ có hệ điều hành mới có thể thực hiện và một lần nữa, API để truy cập các dịch vụ này khác nhau giữa các hệ điều hành.

Điểm mấu chốt là các ứng dụng không được viết cho CPU, nhưng đối với một tập hợp các dịch vụ nguyên thủy của ưu đãi hệ điều hành. cách khác là viết các ứng dụng dựa vào một tập hợp các dịch vụ nguyên thủy mà một máy ảo cung cấp, và điều này dẫn đến các ứng dụng ít nhiều di động, như các ứng dụng Java.

1

Đối với câu hỏi thứ hai: Windows chỉ chạy trên x86, x64 và IA64 (không chắc chắn về các phiên bản di động). Đối với Linux, xem here.

+1

Trên thực tế, trong suốt lịch sử Windows đã hỗ trợ khá nhiều kiến ​​trúc bộ vi xử lý, trong số đó có Alpha AXP, PowerPC, MIPS/CISC/RISC nhưng hỗ trợ đã bị loại bỏ trong Windows 2000. –

2

Dưới đây là một số trong những lý do tôi có thể nghĩ ra khỏi đỉnh đầu của tôi:

  1. định dạng chứa khác nhau (mà cho đến nay dường như là khác biệt hàng đầu trong câu trả lời này - tuy nhiên nó không phải là duy nhất lý do).
  2. different dynamic linker semantics.
  3. khác nhau ABI.
  4. các cơ chế xử lý ngoại lệ khác nhau - windows has SEH -- upon which C++ exception handling is built
  5. ngữ nghĩa gọi hệ thống khác nhau và các cuộc gọi hệ thống khác nhau - do đó các thư viện cấp thấp khác nhau.