न्यूलिब न्यूनतम रननीय उदाहरण
यहां मैं एक अत्यधिक स्वचालित और प्रलेखित उदाहरण प्रदान करता हूं जो QEMU में कार्रवाई में न्यूलिब दिखाता है ।
Newlib के साथ, आप अपने नंगे प्लेटफॉर्म के लिए अपने सिस्टम कॉल को लागू करते हैं।
उदाहरण के लिए, उपरोक्त उदाहरण पर, हमारे पास एक उदाहरण कार्यक्रम है exit.c
:
#include <stdio.h>
#include <stdlib.h>
void main(void) {
exit(0);
}
और एक अलग सी फ़ाइल में common.c
, हम एआरएम सेमीहोस्टिंग के exit
साथ लागू करते हैं :
void _exit(int status) {
__asm__ __volatile__ ("mov r0, #0x18; ldr r1, =#0x20026; svc 0x00123456");
}
अन्य विशिष्ट syscalls जिन्हें आप लागू करेंगे:
write
होस्ट को परिणाम देने के लिए। यह या तो साथ किया जा सकता है:
- अधिक अर्धचालक
- एक UART हार्डवेयर
brk
के लिए malloc
।
नंगे पैर पर आसान, क्योंकि हमें पेजिंग की परवाह नहीं है!
TODO मुझे आश्चर्य है कि अगर Zephyr या FreeRTOS जैसे पूर्ण विकसित RTOS में जाए बिना प्रीमेप्टिव शेड्यूलिंग syscalls निष्पादन तक पहुंचना यथार्थवादी है ।
न्यूलिब के बारे में अच्छी बात यह है कि यह आपके लिए सभी गैर-ओएस विशिष्ट चीजों को लागू करता है string.h
, और आपको बस ओएस स्टब्स को लागू करने देता है।
इसके अलावा, आपको सभी स्टब्स को लागू करने की आवश्यकता नहीं है, लेकिन केवल उन लोगों की आवश्यकता होगी जो आपको चाहिए। उदाहरण के लिए, यदि आपके प्रोग्राम को केवल जरूरत है exit
, तो आपको ए प्रदान करने की आवश्यकता नहीं है print
।
न्यूलिब स्रोत के पेड़ में पहले से ही कुछ कार्यान्वयन हैं, जिनमें एआरएम सेमीहोस्टिंग कार्यान्वयन शामिल है newlib/libc/sys/arm
, लेकिन अधिकांश भाग के लिए आपको स्वयं को लागू करना होगा। हालांकि यह कार्य के लिए एक ठोस आधार प्रदान करता है।
न्यूलिब को सेटअप करने का सबसे आसान तरीका है क्रॉस्स्टूल-एनजी के साथ अपने स्वयं के कंपाइलर का निर्माण करना, आपको बस यह बताना होगा कि आप न्यूलिब को सी लाइब्रेरी के रूप में उपयोग करना चाहते हैं। मेरा सेटअप आपके लिए इस स्क्रिप्ट के साथ स्वचालित रूप से हैंडल करता है, जो कि यहां मौजूद newlib config का उपयोग करता है crosstool_ng_config
।
मुझे लगता है कि C ++ भी काम करेगी, लेकिन TODO इसका परीक्षण करेगा।