সি-তে রাস্পবেরি পাইয়ের জন্য একটি ওএস লিখুন


19

আমি ইতিমধ্যে বেকিং পাই টিউটোরিয়ালগুলি পেয়েছি তবে তারা কেবল সমাবেশের ভাষা ব্যবহার করে । আমি প্রথম পাঠগুলি অনুসরণ করেছিলাম, তবে এর পরিবর্তে সি কীভাবে ব্যবহার করব তা আমি ইতিমধ্যে ভাবছি। মানে, তারা উচ্চ-স্তরের ভাষাগুলি আবিষ্কার করার একটি কারণ রয়েছে। আমি কেবল একটি কোড ( .o) ফাইলে সংকলন করে সি কোড সংকলন করার চেষ্টা করেছি

.section .init
.globl _start
_start:

bl main

loop$:
b loop$

অন্য একটি অবজেক্ট ফাইলে এবং সেগুলি একত্রে সংযুক্ত করা এবং তাই প্রাপ্ত kernel.img। আমি তারপরে ইতিমধ্যে উপস্থিত কার্নেলটি নিজের সাথে প্রতিস্থাপন করেছি, তবে এটি সি কোডটি কার্যকর করে না। আমি যে সি কোড লিখেছি তা ঠিক ঠিক এলইডি চালু করা উচিত এবং তারপরে ফিরে আসুন (তারপরে আসে loop$: b loop$)। তবে ওকে এলইডি কয়েকবার এলোমেলোভাবে ফ্ল্যাশ করে এবং তারপরে কেবল বন্ধ থাকে। আমার সি কোডটি এখানে:

int main(int argc, char ** argv) {
    volatile unsigned *gpioAddr = (volatile unsigned *)0x20200000;
    *(gpioAddr + 4) = 1 << 18;
    *(gpioAddr + 40) = 1 << 16;
    return 0;
}

আমি কীভাবে রাস্পবেরি পাইতে অপারেটিং সিস্টেম বিকাশের জন্য সি ব্যবহার করব?

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

দ্রষ্টব্য: উপরের সি কোডের সমতুল্য এআরএম সমাবেশটি ঠিক কাজ করে। এটি LED চালু করে (কিছুটা জ্বলজ্বলে পরে)। আমি মনে করি (আশা) যা আমার রাস্পবেরি পাই সূচিত করে।


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

1
@ থরবজর্নআরভানএন্ডারসেন আমার মনে হয় আমি লিনাক্সের উত্সটি পড়তে পারছি না। লিনাক্স আমি যা জানতে চাই তার চেয়ে অনেক জটিল, এটি আমার জন্য আকর্ষণীয় টুকরোটিকে অস্পষ্ট করে।
11684

1
উম, কয়েকটি ওয়্যার আপ আপ '।
11684

1
আপনাকে ধন্যবাদ, তবে আমি বেশিরভাগ জিনিস নিজেই করতে চাই। এটি একটি শিক্ষণ প্রকল্প।
11684

1
আমি স্বীকার করতেই হবে যে আমি কখনই কোনও ওএস লিখতে হবে এমন কোনও প্রশ্ন দেখিনি। এবং কিছু আকর্ষণীয় উত্তর আছে। এটি কেবল ক্রেজি ...
পাইওটার কুলা

উত্তর:


14

আমি কয়েক বছর আগে খুব সাধারণ কার্নেল লিখেছি এবং এটি 386-এ চালিয়েছি years

  • বুট প্রক্রিয়া চলাকালীন বাধা অক্ষম করুন
  • পাইটিতে যদি মেমরির নিয়ামক থাকে তবে আপনাকে এটি সেট আপ করতে হবে
  • একটি টাইমার টিক সেট আপ করুন
  • বিঘ্নিত নিয়ামক কনফিগার করুন
  • একটি স্ট্যাক সেট আপ করুন যাতে আপনি সি কোডটি কার্যকর করতে পারেন

স্ট্যাক সেট আপ করা সহজ - কিছু মেমরি যা ব্যবহার হচ্ছে না তা খুঁজে বার করুন এবং সেই ঠিকানাটি লোড করুন যেখানে কখনও নিবন্ধভুক্ত স্ট্যাক পয়েন্টার হিসাবে ব্যবহৃত হয়।

আপনার সি কোডে আপনাকে ওএস ডেটা স্ট্রাকচারের মতো মেমরি পুল এবং থ্রেড টেবিলগুলির প্রয়োজন। আপনি সি লাইব্রেরি ফাংশন ব্যবহার করতে সক্ষম হবেন না - আপনাকে সেই জিনিসটি নিজেই লিখতে হবে।

আপনি যদি একটি সাধারণ মাল্টিটাস্কিং ওএস লিখতে চান তবে আপনাকে স্ট্যাকের সিপিইউ রেজিস্টারগুলি সংরক্ষণ করতে কিছু সংঠক রুটিন লিখতে হবে এবং অন্য থ্রেডের স্ট্যাক থেকে রেজিস্টার মানগুলির একটি পৃথক সেট লোড করতে হবে। এবং বিভিন্ন থ্রেড তৈরি করতে আপনার একটি API লিখতে হবে।


1
এই উত্তর এবং জর্জেস ডুপোরনের মধ্যে পছন্দ করা শক্ত। আমি এটিকে গ্রহণ করেছি এবং অন্যটিকে উত্সাহ দিয়েছি।
11684

13

আমি আপনার কোডটি গভীরতার সাথে দেখিনি, তবে মনে হচ্ছে আপনি সঠিক পথে আছেন on নিশ্চিত করো যে:

  • _startপ্রতীক প্রকৃতপক্ষে যখন কম্পাইল ও আপনার সমাবেশ ফাইল এবং আপনার সি ফাইল লিঙ্ক ব্যবহৃত হয় (এবং যে main()পরিবর্তে ব্যবহার করা হয় না)
  • কল করার সময় main(), আপনাকে সি কলিং কনভেনশন ব্যবহার করতে হবে:
    • আপনার কল অনুসরণ করে নির্দেশের ঠিকানা স্ট্যাকের উপর চাপ দিন (রিটার্ন ঠিকানা, যা returnবিবৃতি দ্বারা সি তে ব্যবহৃত হবে )
    • ফাংশনটির জন্য আর্গুমেন্টগুলিকে চাপ দিন। আপনার ক্ষেত্রে আপনি দুটি 32-বিট মান (মোট 8 টি বাইট) ধাক্কা দিতে পারেন, তবে বিষয়গুলি আরও সহজ করতে আপনি তর্কগুলিও সরিয়ে ফেলতে পারেন এবং ঠিক আছেint main() { ... }
    • প্রত্যাবর্তনের মানটির জন্য স্ট্যাকের জন্য কিছু স্থান সংরক্ষণ করুন
    • এই জিনিসগুলিকে কোন ক্রমে চাপ দেওয়া উচিত তা আমি মনে করতে পারি না
    • সি ফাংশনটি ঠিক কী প্রত্যাশা করে তা জানতে, এটি বিচ্ছিন্ন করুন ( objdump -S main.o) এবং দেখুন কীভাবে এটি স্ট্যাকটি পরিচালনা করে।
  • যদি আপনি কলিং কনভেনশনকে সম্মান না করেন, তবে সি সংকলক দ্বারা উত্পাদিত অ্যাসেম্বলি কোড স্ট্যাকের রিটার্ন ঠিকানার সাথে টেম্পার করতে পারে এবং আপনার ক্ষেত্রে আপনি কোনও রিটার্ন ঠিকানাও চাপেননি, সুতরাং রিটার্নের নির্দেশটি কোথাও লাফিয়ে উঠবে এলোমেলো, পরিবর্তে যাওয়া loop$

OSDev উইকি খুব দরকারী ressource হবে - এটি প্রধানত এক্স 86 বিকাশ নিয়ে কাজ করছে কিন্তু অধিকাংশ তথ্য এখনও ফলবিশেষ Pi প্রযোজ্য।

আরও কিছু রাস্পবেরি-পাই ওসদেব নির্দিষ্ট সংস্থানসমূহ:

  • http://elinux.org/RaspberryPi_Osdev
  • জিপিইউর নির্দেশিকা সেট সম্পর্কে https://github.com/hermanhermitage/videocoreiv তথ্য, যা আপনার kernel.imgলাথি প্রবেশের আগে বুট ক্রম সম্পাদন করছে ।
  • https://github.com/christinaa/rpi-open-firmware এই প্রকল্পটি আপনার kernel.imgমৃত্যুদন্ড কার্যকর হওয়ার আগে পাই বুটস্ট্র্যাপ করার জন্য ব্যবহৃত মালিকানা ব্লবকে প্রতিস্থাপন করবে ।

এই উত্তর এবং স্টিভ এর মধ্যে নির্বাচন করা কঠিন। আমি আপনাকে একটি উর্ধ্বতন দিয়েছি এবং অন্যটি গ্রহণ করেছি। আমি 5 rep পার্থক্য আফসোস।
11684

OSDev উইকি ভাল - এবং এমন কিছু নির্দিষ্ট হয়েছে RasPi কাপড়
ওয়ালি

2

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


আমার প্রশ্নের উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ (এবং এত দেরিতে সাড়া দেওয়ার জন্য দুঃখিত)। তবে (আশ্চর্য!) আমি কেবল এটি সম্পর্কে জানতে আমার পাইটি কিনেছিলাম, এটি নিম্ন স্তরের প্রক্রিয়াগুলির সাথে জড়িত (ব্যক্তিগত ফাইল / মেল / ফটো নষ্ট করার ঝুঁকি নিয়ে আমি ব্যয়বহুল ডেস্কটপে এটি না করবো)। আপনি কি দয়া করে যুক্ত করতে পারেন আমি কীভাবে স্ট্যাকটি সেট আপ করেছি, বা একটি নিবন্ধ / টিউটোরিয়াল / এমন কিছু সংস্থান ব্যাখ্যা করে? (এবং আমার আর কি চালাতে হবে)।
11684

2

পরিবর্তে এটি চেষ্টা করুন:

http://www.valvers.com/open-software/raspberry-pi/step01-bare-metal-programming-in-cpt1/

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


1
আরও কিছু বিশদ দুর্দান্ত হবে, আপনার উত্তরের লিঙ্কটি ভেঙে গেলে কী হবে?
ডার্থ ভেডার

এটি এখনও আছে তবে আমি যারা এখানে এসেছি তাদের জন্য আমি মনে করি, "ভালভ বেয়ার মেটাল" গুগল করতে পারেন এবং ওএসডিইভি সিরিজটি আরও ভালভাবে চেষ্টা করতে পারেন (ক্রুশ ডিভেলকে পেরিয়ে যাওয়ার জন্য আমি লড়াই করে যাচ্ছি, ফোরামটি পড়ি; আমি একটি পোস্ট করছি আপনি গুগল চেষ্টা করতে পারেন "ওএসডিইডিভি ফোরাম ছয় মাসের ক্রস ")
ডেনিস এনজি

আমি জানি এটি একটি পুরানো প্রশ্নেরও পুরানো উত্তর, তবে পৃষ্ঠাটি নিচে যাওয়ার ক্ষেত্রে ওয়েব.আরচাইভ.আরগে রয়েছে।
অজ্ঞাতনামা

1

s-matyukevich/raspberry-pi-os

https://github.com/s-matyukevich/raspberry-pi-os

এই দুর্দান্ত রেপো উভয় সি বুটস্ট্র্যাপিং করে এবং বেশ জটিল বিষয়গুলিতে যায়।

তদুপরি, এটি লিনাক্স কার্নেলটি কীভাবে কাজ করে তা খতিয়ে দেখায় এবং লিনাক্স কার্নেল কোডটি টিকা দেয়।

সর্বনিম্ন সেটআপের জন্য প্রথম টিউটোরিয়ালটি দেখুন: https://github.com/s-matyukevich/raspberry-pi-os/tree/43f682d406c8fc08736ca3edd08a1c8e477c72b0/src/lesson01/src

আমি এটি উচ্চ প্রস্তাব।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.