2009-04-03 39 views
9

Làm thế nào để bạn biên dịch một chương trình C vào một giá trị định dạng ELF (hoặc định dạng RAW) để nó có thể được thực hiện trực tiếp từ RAM mà không cần bất kỳ OS? Giả sử rằng bộ tải khởi động tồn tại có khả năng tải mã tới bất kỳ vị trí nào trong RAM và bắt đầu thực thi tại địa chỉ đó. Để chính xác, cờ biên dịch (GCC) là gì? Có cần cho một tập tin bản đồ?Thực hiện mà không cần hệ điều hành

Một ứng dụng mẫu helloworld sẽ là nhất chào đón :)

Chỉ cần để xây dựng quan điểm của tôi,
phép phương thức main() là một vô hạn rỗng trong khi vòng lặp để đảm bảo rằng không OS cuộc gọi thư viện cụ thể hoặc tiêu chuẩn được sử dụng. Các o/p mong muốn là một hang. Với các tùy chọn GCC tùy chọn, bộ tải khởi động chắc chắn sẽ không tải được tệp thực thi cho biết nó không hợp lệ Định dạng ELF. Tuy nhiên, bằng cách chuyển tùy chọn -dN cho trình liên kết sẽ làm cho nó hợp lệ ELF. Thêm các tùy chọn trình biên dịch/liên kết được yêu cầu để làm cho nó treo và không sụp đổ !! Chính xác thì các tùy chọn biên dịch này là gì?

file.c: 
int main() 
{ 
    while(1); 
} 

Compilation
gcc -c -nostdinc file.c -fno-BUILTIN
ld -dN -nostdlib file.o

Bootloader tải a.out vào bộ nhớ RAM và thực thi.

Trả lời

6

Thứ nhất, có những hạn chế đối với những gì bạn có thể làm, sau khi trình tải khởi động kết thúc công việc của mình. Những hạn chế này là do những điều sau đây: (Giả sử rằng bộ nạp khởi động của bạn (ví dụ: grub), đưa bạn đến chế độ được bảo vệ 32 bit) 1. Không bật phân trang. Bạn cần phải kích hoạt nó. 2. Ở đó bạn không thể tương tác với các thiết bị vì bạn phải đặt các trình xử lý cho IRQ.

Đây là một liên kết cổ điển mà tôi đã sử dụng để học nghệ thuật lập trình trên kim loại trần (http://geezer.osdevbrasil.net/osd/index.htm). Ngoài ra, có một liên kết tải xuống trên trang (http://geezer.osdevbrasil.net/osd/code/osd.tgz). Tệp tar chứa các hạt nhân bản demo với mức độ phức tạp ngày càng tăng. Ngoài ra, bạn có thể xem tệp tạo (linux.mak) và nhận cờ bắt buộc cho gcc.

Tôi mở một làm cho tập tin ngẫu nhiên và thấy rằng cờ sau được sử dụng: gcc: -nostdinc -fno-BUILTIN ld: -nostdlib
(Một cuộc gọi rõ ràng để mối liên kết được thực hiện, do đó LD cũng cần một lá cờ) .

Mục đích cờ là cho gcc biết rằng không có liên kết nào được thực hiện với thư viện chuẩn.

+0

Cảm ơn ... Các liên kết rất nhiều hữu ích :) – AIB

0

Bạn có nhận ra rằng nếu bạn không tải hệ điều hành, bạn phải viết trình điều khiển thiết bị để làm việc với bất kỳ thiết bị nào. Điều đó có nghĩa là không ghi lên màn hình mà không cần viết trình điều khiển cho thẻ video cụ thể đó, không đọc từ đĩa mà không viết trình điều khiển cho thẻ điều khiển ổ đĩa cứng cụ thể đó, không truy cập bàn phím, v.v.

Thay vào đó, bạn có thể muốn xem thứ gì đó được gọi là Kiosk Mode. Ý tưởng cơ bản là hệ điều hành chạy, tải mọi thứ cần thiết cho ứng dụng của bạn, tải ứng dụng của bạn và sau đó bạn không thể chuyển sang ứng dụng khác.

+0

Thay vì viết trình điều khiển thiết bị, bạn chỉ có thể ở chế độ thực và sử dụng các ngắt BIOS để truy cập tất cả những thứ này. Nếu không, video (VESA), bàn phím (PS/2 thi đua), vv là khá chuẩn hóa. – Andy

+0

Để bắt đầu, tôi đã cố gắng tạo Hang trên Hệ thống (Xem mã trong câu hỏi). Đối với sản xuất một hang, bạn không cần bất kỳ trình điều khiển (ngoại trừ có thể là trình điều khiển bộ nhớ mà tôi nghĩ rằng bộ nạp khởi động sẽ cung cấp). Nhưng tôi đã nhận được một vụ tai nạn. Khi tôi đã hoàn tất việc này, tôi có thể lấy mã trình điều khiển và khám phá thêm ... – AIB

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