2013-08-11 102 views
6

Trình lên lịch của os nhỏ của tôi được viết trong assembly và tôi tự hỏi tại sao. Tôi phát hiện ra rằng các hướng dẫn eret không thể được tạo ra bởi trình biên dịch C, là somthing này có thể được generalized cho các nền tảng khác hơn Nios và cũng x86 và/hoặc MIPS architechture? Vì tôi tin rằng một phần của os luôn luôn được viết trong hội đồng và tôi đang tìm kiếm lý do tại sao một lập trình viên hệ thống phải biết lắp ráp để viết một hệ điều hành. Có phải là trường hợp có những hạn chế nội trang của trình biên dịch C không thể tạo ra một số hướng dẫn lắp ráp như eret trả về chương trình cho những gì đang làm sau khi ngắt?Tại sao một số phần của hệ điều hành phải được viết trong assembly?

+1

Điều đó không * thực sự * đúng. Các tùy chọn tồn tại để thực hiện nó hoàn toàn trong C, nhưng nó có thể khó xử. Ngay cả khi mô-đun lắp ráp nội tuyến không hỗ trợ một lệnh, nó thường có thể sử dụng một chuỗi thực thi. –

Trả lời

3

Câu trả lời chung chung là dành cho một trong ba lý do:

  1. Bởi vì loại đặc biệt của mã không thể được viết bằng C. Tôi nghĩ eret là một "trở về từ ngoại lệ" hướng dẫn, do đó, không có C tương đương với điều này (vì các ngoại lệ phần cứng như lỗi trang, chia cho số không hoặc tương tự không phải là ngoại lệ kiểu C/C++). Một ví dụ khác có thể lưu sổ đăng ký vào ngăn xếp khi chuyển đổi nhiệm vụ và lưu con trỏ ngăn xếp vào khối điều khiển tác vụ. Mã C không thể làm điều đó, bởi vì không có quyền truy cập trực tiếp vào con trỏ ngăn xếp.

  2. Bởi vì trình biên dịch sẽ không tạo mã tốt như một trình soạn thảo văn bản thông minh. Một số hoạt động chuyên biệt có thể khó viết trong C - trình biên dịch có thể không tạo ra mã rất tốt, hoặc mã được rất phức tạp để đạt được một cái gì đó đơn giản trong assembly.

  3. Việc khởi động mã C cần phải được viết trong trình biên dịch, vì chương trình C cần một số thứ nhất định được thiết lập trước khi bạn có thể chạy mã C thực tế. Ví dụ cấu hình stack-pointer, và một số thanh ghi khác.

3

Vâng, đúng vậy. Có các hướng dẫn mà bạn không thể tạo bằng ngôn ngữ C. Và thường có một hoặc một số hướng dẫn cần thiết cho một hệ điều hành vì vậy một số lắp ráp là bắt buộc. Điều này đúng với bất kỳ tập lệnh nào, x86, arm, mips, v.v. Trình biên dịch C cho phép bạn thực hiện việc lắp ráp nội tuyến cho các hướng dẫn gây nhiễu nhưng ngôn ngữ chính nó không thể xử lý các sắc thái của từng bộ lệnh và cố gắng giải thích chúng. Một số trình biên dịch sẽ thêm những thứ trình biên dịch cụ thể để ví dụ trả về hàm bằng cách sử dụng một hàm trả về ngắt. Nó là dễ dàng hơn nhiều để chỉ cần viết lắp ráp khi cần thiết hơn để tùy chỉnh ngôn ngữ hoặc trình biên dịch để có thực sự không có nhu cầu đó.

3

Ngôn ngữ C thể hiện những điều được chỉ định để thể hiện: các phép toán số học cơ bản, gán giá trị cho biến và các nhánh và hàm gọi. Các đối tượng có thể được phân bổ sử dụng static, thời gian lưu trữ tự động (cục bộ) hoặc động (malloc). Nếu bạn muốn một cái gì đó ngoài phạm vi khái niệm này, bạn cần một cái gì đó khác ngoài tinh khiết C.

Ngôn ngữ C có thể được mở rộng tùy ý và nhiều nền tảng xác định cú pháp cho những thứ như xác định hàm hoặc biến tại một địa chỉ cụ thể.

Nhưng phần cứng của CPU quan tâm đến rất nhiều chi tiết, chẳng hạn như giá trị của thanh ghi cờ. Một phần của bộ lập lịch mà chuyển đổi các chủ đề cần để có thể lưu tất cả các thanh ghi vào bộ nhớ trước khi làm bất cứ điều gì, bởi vì ghi đè lên bất kỳ đăng ký sẽ mất dữ liệu cần thiết trong thread bị gián đoạn.

Cách duy nhất để có thể viết một điều như vậy trong C, sẽ là cho trình biên dịch cung cấp một hàm C tạo ra cụm được tinh chỉnh. Và sau đó bạn về cơ bản trở lại ở hình vuông 1, bởi vì các chi tiết quan trọng vẫn ở cấp độ của mã lắp ráp.

Nhà cung cấp có nhiều dòng sản phẩm vi điều khiển đôi khi đi ra ngoài để cho phép khả năng tương thích nguồn C thậm chí ở mức thấp nhất, cho phép khách hàng của họ mã cổng (hoặc ngược lại) để ngăn họ đến nhà cung cấp khác khi họ cần để chuyển đổi nền tảng). Nhưng sự khác biệt giữa C và lắp ráp làm mờ tại một điểm nhất định, khi bạn đang gọi các hàm giả tạo ra các hướng dẫn cụ thể (được gọi là nội tại).

1

Một số điều mà không thể được thực hiện trong C hoặc rằng, nếu họ có thể được thực hiện, được thực hiện tốt hơn trong lắp ráp, vì họ là đơn giản hơn và/hoặc duy trì theo cách đó bao gồm:

  • Execute trở lại-từ- ngoại lệ và hướng dẫn trả về từ gián đoạn.
  • Đọc và ghi vào sổ đăng ký bộ xử lý đặc biệt (kiểm soát trạng thái bộ xử lý, ánh xạ bộ nhớ, cấu hình bộ nhớ cache, quản lý ngoại lệ và hơn thế nữa).
  • Thực hiện đọc và ghi nguyên tử tới các địa chỉ đặc biệt là các kết nối với thiết bị phần cứng thay vì bộ nhớ.
  • Thực hiện hướng dẫn tải và lưu trữ các kích thước hoặc đặc điểm cụ thể đến các địa chỉ đặc biệt như được mô tả ở trên. (Ví dụ: ghi vào một thiết bị nhất định có thể chỉ yêu cầu sử dụng lệnh lưu trữ 16 bit và không phải hướng dẫn lưu trữ-32 bit thông thường.)
  • Thực hiện hướng dẫn về bộ nhớ hoặc đặt hàng, kiểm soát bộ nhớ cache và xả bộ nhớ .

Nói chung, C chủ yếu được thiết kế để thực hiện tính toán (đọc đầu vào, tính toán, viết đầu ra) và không điều khiển máy (tương tác với tất cả các điều khiển và thiết bị trong máy).