Ví dụ runlable tối thiểu Newlib
Ở đây tôi cung cấp một ví dụ rất tự động và được ghi lại cho thấy newlib đang hoạt động trong QEMU .
Với newlib, bạn thực hiện các cuộc gọi hệ thống của riêng mình cho nền tảng từ xa.
Ví dụ, trong ví dụ trên, chúng tôi có một chương trình ví dụ exit.c
:
#include <stdio.h>
#include <stdlib.h>
void main(void) {
exit(0);
}
và trong một tệp C riêng biệt common.c
, chúng tôi thực hiện exit
với bán phần ARM :
void _exit(int status) {
__asm__ __volatile__ ("mov r0, #0x18; ldr r1, =#0x20026; svc 0x00123456");
}
Các tòa nhà cao tầng điển hình khác mà bạn sẽ thực hiện là:
write
để kết quả đầu ra cho máy chủ. Điều này có thể được thực hiện với:
- thêm bán kết
- một phần cứng UART
brk
cho malloc
.
Dễ dàng thực hiện, vì chúng ta không cần phải quan tâm đến việc phân trang!
TODO Tôi tự hỏi liệu có thực tế khi đạt được việc thực hiện các tòa nhà chọc trời được lên lịch trước mà không đi vào một RTOS đầy đủ như Zephyr hay FreeRTOS không .
Điều thú vị về Newlib, là nó thực hiện tất cả những thứ không thuộc hệ điều hành cụ thể như string.h
dành cho bạn và cho phép bạn thực hiện chỉ các sơ khai hệ điều hành.
Ngoài ra, bạn không phải thực hiện tất cả các sơ khai, mà chỉ những cái bạn sẽ cần. Ví dụ, nếu chương trình của bạn chỉ cần exit
, thì bạn không phải cung cấp a print
.
Cây nguồn Newlib đã có một số triển khai, bao gồm cả triển khai bán phần ARM newlib/libc/sys/arm
, nhưng đối với hầu hết các phần bạn phải thực hiện riêng của mình. Tuy nhiên, nó cung cấp một cơ sở vững chắc cho nhiệm vụ.
Cách dễ nhất để thiết lập Newlib là xây dựng trình biên dịch của riêng bạn với crosstool-NG, bạn chỉ cần nói với bạn rằng bạn muốn sử dụng Newlib làm thư viện C. Thiết lập của tôi xử lý tự động cho bạn với tập lệnh này , sử dụng cấu hình newlib có tại crosstool_ng_config
.
Tôi nghĩ C ++ cũng sẽ hoạt động, nhưng TODO thử nghiệm nó.