খালি ধাতুতে সি স্ট্যান্ডার্ড লাইব্রেরি


24

আমি বেশিরভাগ ডিভাইসগুলিতে বিকাশ করছি যেগুলি লিনাক্স পোর্ট করেছে তাই স্ট্যান্ডার্ড সি লাইব্রেরি প্রচুর পরিমাণে এর কার্যকারিতা সরবরাহ করে সিস্টেম কল প্রয়োগ করে যার একটি মানক আচরণ রয়েছে।

তবে খালি ধাতুর জন্য, কোনও অন্তর্নিহিত ওএস নেই। এসি গ্রন্থাগারটি কীভাবে কার্যকর করা উচিত বা কোনও বিএসপি সরবরাহকারী নতুন বোর্ডে স্যুইচ করার সময় আপনার কোনও লাইব্রেরি বাস্তবায়নের বিশিষ্টতা প্রকাশ করতে হবে তার সাথে কি কোনও মানদণ্ড সম্পর্কিত?


4
আপনার প্রশ্নের জন্য ভুল সাইট।
অট--

8
আমি এই প্রশ্নটিকে অফ-টপিক হিসাবে বন্ধ করতে ভোট দিচ্ছি কারণ এটি স্ট্যাক ওভারফ্লোতে অন্তর্ভুক্ত
uint128_t

1
সাধারণত আপনি ছাড়া। এগুলি সমর্থন করার জন্য আপনার কেন অপারেটিং সিস্টেম ব্যতীত এমন জিনিসগুলির প্রয়োজন হবে? মেমকি এবং নিশ্চিত ফাইল সিস্টেমগুলি প্রয়োজনীয় নয়, যদিও প্রয়োগ করা fopen, ক্লোজ, ইত্যাদি রামের তুলনায় অতি ক্ষুদ্র। প্রিন্টফ () খুব খুব ভারী, টন এবং টন কোডের প্রয়োজন, না করেই করুন। যে কোনও আই / ও প্রতিস্থাপন করুন বা ছাড়াই করুন। newlib বেশ চরম, কিন্তু আপনি যদি না করতে না পারেন তবে সাহায্য করবে, তবে আপনাকে যেভাবেই হোক ব্যাকএন্ডে সিস্টেমটি প্রয়োগ করতে হবে, সুতরাং আপনার অতিরিক্ত স্তরটির কী দরকার?
old_timer

12
যদিও এই প্রশ্নটি সফ্টওয়্যার সম্পর্কিত, এটি এমবেডড প্রোগ্রামিংয়ের সাথে খুব নির্দিষ্ট, যা সাধারণত এসও দ্বারা প্রত্যাখ্যান করা হয়। যেহেতু আমাদের এখানে ইতিমধ্যে কিছু ভাল উত্তর রয়েছে, তাই স্থানান্তর উপযুক্ত নয়।
ডেভ টুইট করেছেন

1
নীচে একটি উত্তরে উল্লিখিত থাকলেও আপনি নিউলিব-ন্যানোকেও দরকারী বলে মনে করতে পারেন - এটি রিসোর্স সীমাবদ্ধ এম্বেড থাকা সিস্টেমগুলিতে ব্যবহারের জন্য স্ট্রিপ -ব্যাক সংস্করণ হতে পারে। আমি এটি কর্টেক্স এম0 এমসিইউগুলির প্রকল্পগুলিতে ব্যবহার করি। সংখ্যক সংকলক (অ্যাটলিক ট্রুস্টুডিও এক হওয়া) নিউলিব বা নিউলিব-ন্যানো ব্যবহারের বিকল্প দেবে।
jjmilburn

উত্তর:


20

হ্যাঁ, একটি মান আছে, কেবল সি স্ট্যান্ডার্ড লাইব্রেরি । লাইব্রেরির ফাংশনগুলির জন্য "ফুল ব্লোন্ড" ওএস বা কোনও ওএসের প্রয়োজন হয় না এবং "বেয়ার মেটাল" কোড অনুসারে প্রচুর বাস্তবায়ন হয়, নিউলিব সম্ভবত সবচেয়ে বেশি পরিচিত।

নিউলিবকে উদাহরণ হিসাবে গ্রহণ করার জন্য আপনাকে মূল ফাংশনগুলির একটি ছোট উপসেট লিখতে হবে, প্রধানত কীভাবে আপনার সিস্টেমে ফাইল এবং মেমরি বরাদ্দ করা হয়। আপনি যদি একটি সাধারণ লক্ষ্য প্ল্যাটফর্ম ব্যবহার করে থাকেন তবে সম্ভাবনা হ'ল যে কেউ ইতিমধ্যে আপনার জন্য এই কাজটি করেছে।

যদি আপনি লিনাক্স (সম্ভবত ওএসএক্স এবং এমনকি সাইগউইন / এমএসএসি) ব্যবহার করেন এবং টাইপ করেন man strlenতবে এর একটি অংশ CONFORMING TOথাকতে হবে এর মতো কিছু বলা যেতে পারে , যা আপনাকে বলবে যে বাস্তবায়নটি একটি নির্দিষ্ট মানের সাথে সঙ্গতিপূর্ণ। আপনি যে কোনও কিছু ব্যবহার করছেন তা কোনও স্ট্যান্ডার্ড ফাংশন বা এটি কোনও নির্দিষ্ট ওএসের উপর নির্ভর করে কিনা তা আপনি বুঝতে পারবেন।


1
আমি ওএসের উপর নির্ভরশীল না হয়ে কীভাবে কোনও stdlibপ্রয়োগগুলি জানতে আগ্রহী stdio। মত fopen(), fclose(), fread(), fwrite(), putc()এবং getc()? এবং malloc()ওএসের সাথে কথা না বলে কীভাবে কাজ করবে?
রবার্ট ব্রিস্টো-জনসন

4
নিউলিব সহ, এর নীচে একটি স্তর রয়েছে যার নাম "লিবিগ্লাস" রয়েছে যা আপনার প্ল্যাটফর্মের জন্য কয়েক ডজন ফাংশন ধারণ করে (বা আপনি লেখেন)। উদাহরণস্বরূপ, একটি getcharএবং putcharযা আপনার হার্ডওয়্যারটির ইউআআআরটি সম্পর্কে জানে; তারপরে নিউলিব স্তরগুলি printf। ফাইল I / O একইভাবে কয়েকটি প্রাথমিকের উপর নির্ভর করবে।
ব্রায়ান ড্রামন্ড

হ্যাঁ, আমি পাইপের দ্বিতীয় অনুচ্ছেদটি মনোযোগ সহকারে পড়িনি। সঙ্গে তার আচরণ বাদ দিয়ে stdinএবং stdoutএবং stderr (যা যত্ন নেয় putchar()এবং getchar()) যা আমি UART করার নির্দেশ / / থেকে হে, যদি আপনার প্ল্যাটফর্মে একটি ফ্ল্যাশ মতো, ফাইল সঞ্চয় স্থান আছে, তাহলে আপনি যে জন্য লেখ আঠা আছে। এবং আপনাকে উপায়ে আছে malloc()এবং free()। আমি মনে করি আপনি যদি এই বিষয়গুলির যত্ন নেন তবে আপনি আপনার এম্বেড থাকা লক্ষ্যটিতে (বহনযোগ্য argvনয় argc) প্রচুর পরিমাণে বহনযোগ্য সি চালাতে পারেন ।
রবার্ট ব্রিস্টো-জনসন

2
আপনি যদি এমসিইউর সাথে 1 বা 2 কেবি কোড স্পেসের সাথে লেনদেন করেন তবে নিউলিবও বিশাল ...
ব্রায়ান

2
@ বাসিন্দা আপনি নিজের ওএস তৈরি করছেন না, আপনি সি লাইব্রেরি তৈরি করছেন। যদি আপনি এটি না চান, তবে হ্যাঁ, এটি অপ্রয়োজনীয় বড়।
পাইপ

8

এসি গ্রন্থাগারটি কীভাবে কার্যকর করা উচিত বা কোনও বিএসপি সরবরাহকারী নতুন বোর্ডে স্যুইচ করার সময় আপনার কোনও লাইব্রেরি বাস্তবায়নের বিশিষ্টতা প্রকাশ করতে হবে তার সাথে কি কোনও মানদণ্ড সম্পর্কিত?

প্রথমে, সি স্ট্যান্ডার্ড একটি "হোস্টেড" বাস্তবায়ন (যা আমাদের বেশিরভাগের সাথে পরিচিত, অন্তর্নিহিত ওএস দ্বারা সমর্থিত সি ফাংশনগুলির সম্পূর্ণ পরিসীমা) এর বিপরীতে "ফ্রিস্ট্যান্ডিং" বাস্তবায়ন বলে কিছু সংজ্ঞায়িত করে।

একটি "ফ্রিস্ট্যান্ডিং" বাস্তবায়ন কেবল সি লাইব্রেরির শিরোনামের কেবলমাত্র একটি উপসেট সংজ্ঞায়িত করা প্রয়োজন, যথা যাদের সমর্থন প্রয়োজন হয় না , বা এমনকি কার্যাদি সংজ্ঞাও হয় (তারা কেবলমাত্র #defineএস ও typedefএস করেন):

  • <float.h>
  • <iso646.h>
  • <limits.h>
  • <stdalign.h>
  • <stdarg.h>
  • <stdbool.h>
  • <stddef.h>
  • <stdint.h>
  • <stdnoreturn.h>

আপনি যখন কোনও হোস্টেড বাস্তবায়নের দিকে পরবর্তী পদক্ষেপ নিচ্ছেন তখন আপনি দেখতে পাবেন যে খুব কম ফাংশন রয়েছে যা "সিস্টেম" এর যে কোনও উপায়েই ইন্টারফেস করা দরকার, বাকী লাইব্রেরি সেই "আদিমদের উপরে প্রয়োগযোগ্য" "। PDCLib বাস্তবায়নের সময় , নতুন প্ল্যাটফর্মে লিবকে পোর্ট করার সময় আমি সহজে সনাক্তকরণের জন্য তাদের একটি পৃথক সাব-ডিরেক্টরিতে পৃথক করার কিছু চেষ্টা করেছি ( প্যারেনেসিসে লিনাক্স বন্দরের উদাহরণ):

  • getenv()( extern char * * environ)
  • system()( fork()/ execve()/ wait())
  • malloc()এবং free()( brk()/ sbrk())
  • _Exit()( _exit())
  • time() (না এখনো বাস্তবায়িত)

এবং এর জন্য <stdio.h>(C99 শিরোনামগুলির মধ্যে সবচেয়ে যুক্তিযুক্ত "ওএস-জড়িত"):

  • একটি ফাইল খোলার কিছু উপায় ( open())
  • এটি বন্ধ করার কিছু উপায় ( close())
  • এটি অপসারণ করার কিছু উপায় ( unlink())
  • এর নামকরণের কিছু উপায় ( link()/ unlink())
  • এটি লিখতে কিছু উপায় ( write())
  • এটি থেকে পড়ার কিছু উপায় ( read())
  • এর মধ্যে পুনঃস্থাপনের কিছু উপায় ( lseek())

গ্রন্থাগারের কয়েকটি বিশদ alচ্ছিক, মানকটি কেবলমাত্র একটি আদর্শ উপায়ে প্রয়োগ করার প্রস্তাব দেয় তবে এ জাতীয় প্রয়োগকে প্রয়োজনীয়তা তৈরি করে না।

  • time()ফাংশন আইনত ঠিক ফেরত দিতে পারেন (time_t)-1যদি কোনো সময় পালন বলবিজ্ঞান পাওয়া যায়।

  • সিগন্যাল হ্যান্ডলারের জন্য বর্ণিত সংস্থাগুলি <signal.h>কল করার চেয়ে অন্য কোনও কিছু দ্বারা প্রেরণার raise()প্রয়োজন নেই, সিস্টেমটির আসলে কোনও প্রয়োজন নেইSIGSEGV অ্যাপ্লিকেশনটির মতো কিছু প্রেরণ

  • সি 11 শিরোনাম <threads.h>, যা (স্পষ্ট কারণে) খুব ওএসের উপর নির্ভরশীল, যদি প্রয়োগটি সংজ্ঞায়িত করে তবে তা সরবরাহ করার দরকার নেই __STDC_NO_THREADS__...

আরও উদাহরণ রয়েছে, তবে এখনই সেগুলি আমার হাতে নেই।

বাকী লাইব্রেরি পরিবেশের কোনও সহায়তা ছাড়াই প্রয়োগ করা যেতে পারে ((*)


(*) ক্যাভেট: পিডিসিএলআইবি বাস্তবায়ন এখনও সম্পূর্ণ হয়নি, তাই আমি হয়ত দু'টি জিনিস উপেক্ষা করেছি। ;-)


4

স্ট্যান্ডার্ড সি আসলে অপারেটিং পরিবেশ থেকে পৃথক সংজ্ঞায়িত করা হয়। হোস্ট ওএস উপস্থিত থাকার বিষয়ে কোনও অনুমান করা হয় না, এবং যে অংশগুলি হোস্ট নির্ভরশীল সেগুলি সংজ্ঞায়িত করা হয়।

এটি হ'ল সি স্ট্যান্ডার্ডটি ইতিমধ্যে বেশ খালি ধাতব।

অবশ্যই, সেই ভাষার অংশগুলি আমরা খুব বেশি পছন্দ করি, গ্রন্থাগারগুলি প্রায়শই যেখানে মূল ভাষা নির্দিষ্ট স্টাফগুলিকে হোস্ট করে। অতএব, প্রচলিত "এক্সএক্সএক্সএক্সএইচএইবিবি" ক্রস সংকলক উপাদানগুলি অনেকগুলি খালি ধাতব প্ল্যাটফর্ম সরঞ্জামগুলির জন্য পাওয়া যায়।


3

নিউলিব ন্যূনতম চলমান উদাহরণ

এখানে আমি একটি উচ্চতর স্বয়ংক্রিয় এবং ডকুমেন্টেড উদাহরণ সরবরাহ করি যা কিউইইএমইউতে কর্মে নিউলিব দেখায়

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");
}

আপনি যে সাধারণ টিউটোরিয়াল প্রয়োগ করবেন তা হ'ল:

  • writeহোস্টের ফলাফল আউটপুট। এটি হয় এর মাধ্যমেও করা যেতে পারে:

    • আরও সেমহোস্টিং
    • একটি UART হার্ডওয়্যার
  • brkজন্য malloc

    বেয়ারমেটলে সহজ, যেহেতু আমাদের পেজিংয়ের কোনও যত্ন নেই!

করণীয় আমি ভাবছি যদি এটা একটি পূর্ণ প্রস্ফুটিত মধ্যে যাওয়া ছাড়া স্বতপ্রণোদিত সিডিউলিং syscalls সঞ্চালনের পৌঁছানোর বাস্তবসম্মত RTOS মত পশ্চিমা বাতাস বা FreeRTOS

নিউলিব সম্পর্কে দুর্দান্ত জিনিসটি হ'ল এটি আপনার জন্য সমস্ত নন-ওএস নির্দিষ্ট জিনিস string.hকার্যকর করে এবং আপনাকে কেবল ওএস স্টাবগুলি প্রয়োগ করতে দেয়।

এছাড়াও, আপনাকে সমস্ত স্টাব বাস্তবায়ন করতে হবে না, তবে কেবলমাত্র আপনার প্রয়োজন হবে। উদাহরণস্বরূপ, যদি আপনার প্রোগ্রামটির কেবল প্রয়োজন হয় exit, তবে আপনাকে একটি সরবরাহ করতে হবে না print

নিউলিব উত্স ট্রিটিতে ইতিমধ্যে কয়েকটি এআরএম সেমহোস্টিং বাস্তবায়ন সহ কিছু বাস্তবায়ন রয়েছে newlib/libc/sys/armতবে বেশিরভাগ অংশে আপনাকে নিজের প্রয়োগ করতে হবে। এটি অবশ্য কাজের জন্য একটি শক্ত বেস সরবরাহ করে।

নিউলিব সেটআপ করার সবচেয়ে সহজ উপায় হ'ল ক্রসস্টুল-এনজি দিয়ে আপনার নিজস্ব সংকলক তৈরি করা, আপনাকে কেবল এটিই বলতে হবে যে আপনি নিউ লাইবকে সি লাইব্রেরি হিসাবে ব্যবহার করতে চান। আমার সেটআপ হ্যান্ডেল করে যা স্বয়ংক্রিয়ভাবে আপনার জন্য এই স্ক্রিপ্টটি উপস্থিত রয়েছে , যা উপস্থিত নতুনলিব কনফিগারেশনগুলিকে ব্যবহার করেcrosstool_ng_config

আমার ধারণা সি ++ কাজ করবে তবে এটি পরীক্ষাও করুন TO


3
@ ডাউনভোটার্স: দয়া করে ব্যাখ্যা করুন যাতে আমি তথ্য শিখতে এবং উন্নত করতে পারি। আশা করি ভবিষ্যতে পাঠকরা ওয়েবে কেবলমাত্র কাজ করে এমন একমাত্র প্রারম্ভিক নিউলিব সেটআপের মান দেখতে পাবেন :-)
সিওরো সান্তিলি 事件

2

আপনি যখন এটি খোলামেলা ব্যবহার করেন, আপনি কিছু প্রয়োগ না করা নির্ভরতা আবিষ্কার করেন এবং সেগুলি পরিচালনা করতে হবে। এই সমস্ত নির্ভরতা আপনার সিস্টেমের ব্যক্তিত্ব অনুযায়ী ইন্টার্নাল টিউন করা সম্পর্কে। উদাহরণস্বরূপ যখন আমি স্প্রিন্টফ () ব্যবহার করার চেষ্টা করেছি যা ভিতরে ম্যালোক () ব্যবহার করে। মেলোকের কোড "হুক ইন কোড" হিসাবে "t_sbrk" ফাংশন প্রতীক রয়েছে, যা ব্যবহারকারীর দ্বারা হার্ডওয়্যার মিশ্রণ প্রয়োগের জন্য প্রয়োগ করা উচিত। এখানে আমি এটি বাস্তবায়ন করতে পারি, বা আমার নিজস্ব মালক () তৈরি করতে পারি যদি আমি বিশ্বাস করি যে এম্বেডেড হার্ডওয়্যার, প্রধানত অন্যান্য ব্যবহারের জন্য, কেবল স্প্রিন্টফের জন্য আমি আরও ভাল একটি করতে পারি।


স্প্রিন্টফের কেন ম্যালোক () দরকার?
ক্যাট

আমি জানি না। আমি মনে করি আপনার পয়েন্টটি ইতিমধ্যে এটি রয়েছে বাফার, তাই না? তবে প্রিন্টফের জন্যও ম্যালোকের দরকার নেই। সম্ভবত কিছু অভ্যন্তরীণ ভেরিয়েবলগুলি গতিশীলভাবে বরাদ্দ করতে, যখন অনুরোধ করা আউটপুটের গণনা স্ট্যাকড বরাদ্দের (ফাংশনের গতিশীল ভেরিয়েবল) দূরদর্শনের চেয়ে ভারী হয়? আমি নিশ্চিত যে স্প্রিন্টফের জন্য প্রয়োজন ম্যালোক (আর্ম-নন-ইবি-নিউলিব)। এখন আমি একটি সাধারণ প্রোগ্রাম পরীক্ষা করেছিলাম কম্পিউটারে স্প্রিন্টফ ব্যবহার করি (গ্লিবিসি)। এটি কখনও ম্যালোক বলে না। তারপরে প্রিন্টফ ব্যবহার করুন। এটি malloc বলা হয়। মলোক জাল ছিল, সর্বদা 0। তারা একটি স্ট্রিং এবং দশমিক পরিবর্তনশীল মুদ্রণ করতে হবে। @supercat
আইহান

আমি নিজের প্রিন্টফের অনুরূপ কয়েকটি সংস্করণ বা অনুরূপ পদ্ধতি তৈরি করেছি, আমার অ্যাপ্লিকেশনগুলি ব্যবহৃত ফর্ম্যাটগুলিকে সমর্থন করার জন্য কাস্টমাইজ করেছি। দশমিক আউটপুটটির পক্ষে দীর্ঘতম সম্ভাব্য সংখ্যা ধরে রাখার জন্য যথেষ্ট পরিমাণে বাফার প্রয়োজন হয়, তবে অন্যথায় বেস রুটিন এমন একটি কাঠামো গ্রহণ করে যা এর প্রথম সদস্য একটি আউটপুট ফাংশন যা সেই কাঠামোর সাথে পয়েন্টারকে আউটপুট হিসাবে গ্রহণ করে। এই জাতীয় নকশা প্রিন্টফ রূপগুলি যুক্ত করা সম্ভব করে যা অভিশাপ-শৈলী কনসোলগুলি, সকেট ইত্যাদিতে আউটপুট দেয় I've এ জাতীয় জিনিসটিতে আমার কখনই "মালোক" দরকার ছিল না।
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.