2012-12-30 36 views
9

Sự khác nhau giữa hai chương trình trống main {} khi được biên dịch bằng trình biên dịch c/C++ cho mục tiêu với OS (nói linux) và không có OS (nói cho mục tiêu DSP được nhúng) là gì? Tôi đặc biệt quan tâm để biết những gì trình biên dịch làm khác nhau khi có một hệ điều hành và nếu không. Làm thế nào là trình biên dịch/ngôn ngữ thời gian chạy khác nhau trong hai trường hợp?Sự khác nhau giữa hai chương trình {} trống chính có và không có hệ điều hành là gì?

+4

vì khi nào DSP không có hệ điều hành? – user1824407

+0

tệp khi bạn có một hệ điều hành nên có một số loại explnaition về nó - loại tệp nào và tiền nạp. – elyashiv

+1

Câu trả lời liên quan: http://stackoverflow.com/a/4519407/17034 –

Trả lời

12

Nó thực sự là liên kết thực hiện một công việc khác khi đóng gói chương trình chạy trên hệ điều hành so với xây dựng chương trình chạy trên phần cứng trống. Trình biên dịch chỉ tạo các tệp đối tượng bao gồm các hướng dẫn được nhắm mục tiêu cho kiến ​​trúc máy chủ, và các khối này sau đó được kết hợp và đóng gói bởi trình liên kết.

Một chương trình có nghĩa là chạy trên hệ điều hành phải có cấu trúc nhị phân nhất định - đây là nơi các định dạng có thể thực thi được phát. Một định dạng như vậy có thể ra lệnh rằng chương trình nên có một vài phần tiêu đề ngay từ đầu và sau đó mã phải tuân theo, ví dụ. Đây là công việc của trình tải hệ điều hành để giải thích cấu trúc này và sau đó cấp nguồn cho CPU với luồng hướng dẫn mà phần mã chứa.

Ngược lại, một chương trình có nghĩa là chạy trên phần cứng trần thường không có cấu trúc đặc biệt và có thể được cấp trực tiếp cho CPU.

+1

Câu hỏi cơ bản tuyệt vời. Câu trả lời này đã chuyển tiêu điểm thảo luận (IMO chính xác) ra khỏi trình biên dịch. Tài liệu tham khảo tuyệt vời để biết thêm thông tin 1) Bài viết của Balau về Bare Metal (http: //balau82.wordpress.com/2010/02/14/đơn giản-trần-kim loại-chương trình-cho-cánh tay /). 2) "định dạng thực thi" xem Teensy ELF thực thi cho Linux (http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html) –

6

Nó thực sự là mối liên kết mà làm một công việc khác nhau khi đóng gói một chương trình để chạy trên một hệ điều hành so với việc xây dựng một chương trình mà chạy trên phần cứng trọc một mình. Trình biên dịch chỉ tạo ra các đối tượng tệp bao gồm các hướng dẫn được nhắm mục tiêu cho kiến ​​trúc máy chủ, và các khối này sau đó được kết hợp và đóng gói bởi trình liên kết.

Một chương trình có nghĩa là chạy trên hệ điều hành phải có cấu trúc nhị phân nhất định là - đây là nơi các định dạng có thể thực thi được đưa vào hoạt động . Định dạng như vậy có thể ra lệnh rằng chương trình phải có một số phần tiêu đề trong phần đầu và sau đó mã phải tuân theo, ví dụ . Đây là công việc của trình tải hệ điều hành để giải thích cấu trúc này và sau đó cấp nguồn cho CPU với luồng hướng dẫn mã có chứa mã .

Ngược lại, một chương trình có nghĩa là chạy trên phần cứng trần thường không có cấu trúc đặc biệt và có thể được cấp trực tiếp cho CPU.

Tôi muốn xây dựng trên câu trả lời rất tốt bằng văn bản này của Blagovest. Quả thực như ông cho thấy có một sự khác biệt của các định dạng container thực thi và giao diện nhị phân và không có gì. Tuy nhiên, có thể sự khác biệt lớn nhất là điểm nhập chính thực tế để thực thi mã ứng dụng cũng như sự hiện diện của mã khởi động cùng với thư viện thời gian chạy; mặc dù, nếu bạn biết những gì bạn đang làm, bạn có thể tránh liên kết chống lại sau này trên một hệ điều hành chính thức là tốt.

Thông thường với sự hiện diện của các thường trình khởi động, thư viện thời gian chạy, chẳng hạn như crt0, điểm vào thực tế của ứng dụng của bạn không phải là main nhưng một số thứ khác (thường là _start). Trước khi điểm vào thực tế này điều khiển xuống số main của bạn, nó có thể thực hiện một loạt các tác vụ rất cụ thể, thường liên quan đến việc khởi tạo.

Luôn có Wikipedia cho more information on crt0.

Tuy nhiên, trên nền tảng kim loại trần có thể không có các thủ tục như vậy đi kèm với trình biên dịch của bạn. Do đó, điều khiển có thể được chuyển thẳng đến số main của bạn và mã đầu tiên để thực thi trên nền tảng sẽ là của bạn.

Có bạn, đây là sự khác biệt cơ bản nhất giữa hai loại main s. Tuy nhiên, tôi phải nói rằng câu hỏi của bạn hơi mơ hồ khi bạn có thể thực hiện mà không có tập lệnh khởi động nếu bạn tự khởi tạo ngăn xếp vv và bạn cũng có thể thực hiện với thư viện thời gian chạy trên tất cả (tối đa?) nền tảng. Trong thực tế, tất cả điều này phụ thuộc vào bộ biên dịch của bạn, nền tảng bạn đang nhắm mục tiêu, v.v.

3

Tôi bị cám dỗ để nói rằng không có sự khác biệt. Trình biên dịch (hoặc hệ thống dịch thuật) nào thực hiện phần lớn là phụ thuộc ; một hệ thống dịch thuật có khả năng làm những việc khác nhau cho Windows so với Linux, mặc dù cả hai đều đủ điều kiện làm hệ điều hành.

Sự khác biệt chính là liệu triển khai có được lưu trữ hay không không. Nếu nó không được lưu trữ, có thể thậm chí không hỗ trợ main hoặc nếu có, nó có thể không hỗ trợ main với các đối số . Việc triển khai không được lưu trữ thực hiện hoặc yêu cầu để khởi động là triển khai được xác định. Trong khi đó cũng là một rất nhiều của "thực hiện định nghĩa" liên quan đến khởi động trong một môi trường tổ chức, thực hiện được cần thiết để hỗ trợ main, trở int và với ít nhất hai chữ ký, và ứng dụng được yêu cầu để cung cấp một chức năng như vậy.

Lưu ý rằng cả trong quá khứ và hiện tại, nhiều triển khai mà bạn sẽ nghĩ là được lưu trữ thực sự không phải vì nhiều lý do khác nhau. Trong quá khứ, ví dụ, g ++ được ghi lại là không được lưu trữ (ít nhất là gcc đã làm) vì chúng không kiểm soát được và không thể đảm bảo các bộ phận thư viện của việc triển khai. Và thậm chí ngày nay, C++ của Microsoft chỉ có thể được xem xét lưu trữ khi ứng dụng tạo ra giao diện điều khiển ; Ứng dụng Windows không có main.

0

@BlagovestBuyukliev đã cung cấp câu trả lời rõ ràng.

Tôi muốn mở rộng nó một chút - Không có hệ điều hành nào thực sự có nghĩa là không có hệ điều hành do phần mềm triển khai. Mảnh HW có khả năng thực thi mã nhị phân cũng có giao thức xử lý việc tải chương trình và nạp nó vào CPU và tất cả các chi tiết còn lại ở mức thấp. Trong trường hợp này, "hệ điều hành" thực sự hiện diện như một HW thực hiện một. Từ điểm này về sự khác biệt giữa nó và hệ điều hành tiêu chuẩn không phải là chính nhưng kỹ thuật, như xa như việc thực thi mã nhị phân xem xét.

Các vấn đề liên quan