মাইক্রোকন্ট্রোলাররা র‌্যামের বাইরে চলে গেলে কী ঘটে?


12

এটি কেবল একটি কাকতালীয় ঘটনা হতে পারে তবে আমি লক্ষ্য করেছি যে আমি যে মাইক্রোকন্ট্রোলারগুলি ব্যবহার করেছি সেগুলি যখন র‌্যামের বাইরে চলে গেছে তখন পুনরায় বুট করা হয়েছে (হার্ডওয়্যার নির্দিষ্ট হলে আতমেগা 328)। মাইক্রোকন্ট্রোলাররা স্মৃতিশক্তি শেষ হয়ে যাওয়ার পরে কি সেগুলি করা হয়? তা না হলে কি হয়?

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

আমি নিশ্চিত নই যে এটি এখানে বা স্ট্যাক ওভারফ্লোতে থাকা উচিত, দয়া করে আমাকে জানান যে এটি স্থানান্তরিত হওয়া উচিত কিনা যদিও আমি নিশ্চিত যে এর মধ্যে হার্ডওয়্যারটির ভূমিকা রয়েছে pretty

হালনাগাদ

আমার উল্লেখ করা উচিত আমি মেমোরি দুর্নীতির পিছনে প্রকৃত প্রক্রিয়া সম্পর্কে বিশেষত আগ্রহী (এটি কি এসপি-রোলিংয়ের ফলাফল -> এটি কি ইউসির মেমরি ম্যাপিংয়ের উপর নির্ভর করে)?


8
আপনি যদি অবৈধ ঠিকানাগুলি অ্যাক্সেস করার চেষ্টা করেন তবে কিছু মাইক্রো রিসেট করবে। এটি হার্ডওয়ারে প্রয়োগ করা একটি মূল্যবান বৈশিষ্ট্য। অন্য সময় এটি নির্বিচারে কোথাও ঝাঁপিয়ে পড়তে পারে (বলুন যে আপনি কোনও আইএসআরের জন্য ফেরতের ঠিকানাটি ক্লোবারড করেছেন), সম্ভবত কোডের পরিবর্তে ডেটা এক্সিকিউট করা যদি আর্কিটেকচার এটির অনুমতি দেয় এবং সম্ভবত এমন একটি লুপে আটকে যায় যা নজরদারিটি এনে দেয় it করুন।
স্পিহ্রো পেফানি

2
কোনও প্রসেসর র‌্যামের বাইরে চলে যেতে পারে না, এমন কোনও নির্দেশ নেই যা এটি র‌্যামের বাইরে চলে যাবে। র‌্যামের বাইরে চলে যাওয়া পুরোপুরি একটি সফ্টওয়্যার ধারণা।
ব্যবহারকারী 253751

উত্তর:


14

সাধারণভাবে স্ট্যাক এবং গাদা একে অপরের সাথে ক্রাশ। এই সময়ে এটি অগোছালো হয়ে যায়।

MCU এর উপর নির্ভর করে বেশ কয়েকটি জিনিস ঘটতে পারে (বা হবে)।

  1. পরিবর্তনগুলি কলুষিত হয়
  2. স্ট্যাকটি দূষিত হয়
  3. প্রোগ্রামটি দূষিত হয়ে যায়

যখন 1 ঘটে তখন আপনি অদ্ভুত আচরণ করা শুরু করেন - জিনিসগুলি যা করা উচিত তা করছে না। যখন 2 ঘটে যায় তখন সমস্ত ধরণের নরকে sিলে .ালা ভাঙে। যদি স্ট্যাকের রিটার্ন ঠিকানা (যদি থাকে তবে) দূষিত হয়, তবে বর্তমান কলটি যেখানে ফিরে আসবে তা কারও অনুমান। সেই সময়ে মূলত এমসিইউ এলোমেলো কাজ করা শুরু করবে। যখন আবার 3 ঘটে তখন কে কী করবে তা যথেষ্ট জানেন। এটি কেবল তখনই ঘটে যখন আপনি র‌্যামের বাইরে কোড চালাবেন।

সাধারণভাবে যখন স্ট্যাকটি দূষিত হয় তখন এটি শেষ হয়ে যায়। এমসিইউ-তে কেবল যা ঘটে তা হ'ল।

এটি হতে পারে যে মেমোরিটিকে প্রথমে বরাদ্দ দেওয়ার চেষ্টা ব্যর্থ হয় যাতে দুর্নীতি না ঘটে। এক্ষেত্রে এমসিইউ ব্যতিক্রম বাড়াতে পারে। যদি কোনও ব্যতিক্রম হ্যান্ডলার ইনস্টল না থাকে তবে বেশিরভাগ ক্ষেত্রে এমসিইউ কেবল থামবে (এর সমতুল্য while (1);there যদি কোনও হ্যান্ডলার ইনস্টল থাকে তবে এটি পরিষ্কারভাবে পুনরায় বুট করতে পারে।

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

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


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

1
এটি বেশিরভাগই সংকলক এবং ব্যবহারের মানক সি লাইব্রেরির উপর নির্ভরশীল। এটি কখনও কখনও কম্পাইলার কীভাবে কনফিগার করা হয় তার উপরও নির্ভর করে (লিঙ্কার স্ক্রিপ্টস ইত্যাদি)।
মাজনকো

আপনি কি উদাহরণস্বরূপ কয়েকটি দিয়ে এটিকে প্রসারিত করতে পারেন?
মিস্টার মাইস্টের

আসলেই না, না। কিছু সিস্টেম বিভিন্ন বিভাগের জন্য সীমাবদ্ধ স্থান বরাদ্দ দেয়, কিছু না। কিছু বিভাগগুলি সংজ্ঞায়িত করতে লিঙ্কার স্ক্রিপ্ট ব্যবহার করে, কিছু না। একটি মাইক্রোকন্ট্রোলার আপনার আগ্রহের যে বাছুন এবং কিভাবে তার মেমরি বরাদ্দ কাজে কিছু গবেষণা করতে।
Majenko

12

একটি বিকল্প দৃষ্টিভঙ্গি: মাইক্রোকন্ট্রোলারগুলির মেমরি শেষ হয় না।

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

তবে মাজেঙ্কো এবং অন্যেরা যেমন বলেছিলেন, একটি খারাপভাবে প্রোগ্রাম করা মাইক্রোকন্ট্রোলার স্মৃতি থেকে বেরিয়ে যেতে পারে এবং তারপরে অসীম লুপ সহ কিছু করতে পারে (যা কমপক্ষে ওয়াচডোগ টাইমারকে পুনরায় সেট করার সুযোগ দেয় You আপনি নজরদারি টাইমার সক্ষম করেছিলেন, তাই না? )

মাইক্রোকন্ট্রোলারদের জন্য সাধারণ প্রোগ্রামিং বিধিগুলি এড়ানো যায়: উদাহরণস্বরূপ, সমস্ত মেমরি হয় স্ট্যাকের উপর বরাদ্দ করা হয় বা স্ট্যাটিকালি (বিশ্বব্যাপী) বরাদ্দ করা হয়; "নতুন" বা "ম্যালোক" নিষিদ্ধ। পুনরাবৃত্তিটিও তাই, যাতে সাব্রুটিন বাসা বাঁধার সর্বাধিক গভীরতা বিশ্লেষণ করা যায় এবং উপলভ্য স্ট্যাকের সাথে মানিয়ে যায়।

সুতরাং আপনার প্রয়োজনীয় নির্দিষ্ট প্রসেসরের জন্য প্রোগ্রামটি সংকলিত বা সংযুক্ত করা অবস্থায়, এবং মেমরির আকারের (সাধারণত লিঙ্কার স্ক্রিপ্টে এনকোডড) সাথে তুলনা করাতে সর্বাধিক প্রয়োজনীয় স্টোরেজটি গণনা করা যেতে পারে।

তারপরে মাইক্রোকন্ট্রোলার মেমরির বাইরে চলে না যেতে পারে তবে আপনার প্রোগ্রামটি সম্ভবত। এবং এই ক্ষেত্রে, আপনি পেতে

  • এটি আবার ছোট, বা লিখুন
  • একটি বড় প্রসেসর বাছুন (তারা প্রায়শই বিভিন্ন মেমরি আকারের সাথে উপলব্ধ থাকে)।

মাইক্রোকন্ট্রোলার প্রোগ্রামিংয়ের নিয়মের একটি সাধারণ সেট হ'ল মিজরা-সি , মোটর শিল্প দ্বারা গৃহীত।

আমার দৃষ্টিতে সেরা অনুশীলন হ'ল অ্যাডারের স্পার্ক -2018 উপসেটটি ব্যবহার করা । অ্যাডা আসলে এভিআর, এমএসপি ৪৩০ এবং এআরএম কর্টেক্সের মতো ছোট কন্ট্রোলারগুলিকে যথাযথভাবে টার্গেট করে এবং সি এর চেয়ে মাইক্রোকন্ট্রোলার প্রোগ্রামিংয়ের জন্য অন্তর্নিহিত আরও ভাল মডেল সরবরাহ করে তবে স্পার্ক প্রোগ্রামটির মন্তব্যগুলির আকারে টীকা যুক্ত করে, যা প্রোগ্রামটি কী করছে তা বর্ণনা করে।

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

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

মিশ্র-সি এবং স্পার্কের একটি তুলনা


3
এটি +1 করুন। এভিআর-তে পোর্টিং malloc()(এবং এটি সি ++ সহচর new) আর্দুইনো লোকেরা যে সবচেয়ে খারাপ কাজ করতে পারে তার মধ্যে একটি, এবং তাদের ফোরামে উভয় ভাঙা কোড সহ অনেকগুলি খুব বিভ্রান্ত প্রোগ্রামার এবং আরডুইনো স্ট্যাক এক্সচেঞ্জের দিকে নিয়ে যায়। খুব, খুব কম পরিস্থিতি রয়েছে যেখানে mallocএটিমেগা থাকা উপকারী।
কনার ওল্ফ

3
দর্শনের জন্য +1, বাস্তববাদের জন্য -1। স্টাফগুলি যদি সঠিকভাবে প্রোগ্রাম করা হয় তবে এই প্রশ্নের প্রয়োজন হবে না। প্রশ্নটি ছিল মাইক্রোকন্ট্রোলারদের স্মৃতিশক্তি শেষ হয়ে গেলে কী ঘটে । কীভাবে তাদের স্মৃতিশক্তি ফুরিয়ে যাওয়া রোধ করতে হবে তা অন্য প্রশ্ন। অন্য নোটে, পুনরাবৃত্তি একটি শক্তিশালী সরঞ্জাম, উভয়ই সমস্যা সমাধান এবং স্ট্যাকের বাইরে চলে যাওয়ার জন্য।
পিকেপি

2
@Brian, যেহেতু আমি না একটা বোকা, আমি স্পষ্টত আপনার সাথে একমত। আমি কেবল বিপরীত দৃষ্টিকোণে এটি সম্পর্কে ভাবতে চাই - আমি আশা করতে চাই যে আপনি যখন স্মৃতি থেকে সরে যাওয়ার (স্ট্যাক) ভয়াবহ পরিণতি উপলব্ধি করবেন, তখন আপনি এটির থেকে রোধ করার উপায় অনুসন্ধান করবেন। এইভাবে আপনার কেবলমাত্র ভাল প্রোগ্রামিং পরামর্শ অনুসরণ করার পরিবর্তে ভাল প্রোগ্রামিং অনুশীলনগুলি সন্ধান করার পক্ষে সত্যিকারের প্রেরণা রয়েছে ... এবং যখন আপনি মেমরির প্রতিবন্ধকতাটি আঘাত করেন তখন আপনি সুবিধামত ব্যয়ে এমনকি ভাল অভ্যাসগুলি প্রয়োগ করার সম্ভাবনা বেশি থাকে। এটি কেবল একটি দৃষ্টিকোণ ...
পিকেপি

2
@ পিকেপি: শুনুন আপনি উচ্চস্বরে এবং পরিষ্কার। আমি এটিকে বিকল্প মতামত হিসাবে লেবেল দিয়েছি - কারণ এটি আসলে প্রশ্নের উত্তর দেয় না!
ব্রায়ান ড্রামমন্ড

2
@ মিস্টারমিস্টের: মাইক্রোকন্ট্রোলার সাধারণত মেমরির বাইরে চলে না। একটি মাইক্রোকন্ট্রোলার যার র‌্যামের 4096 বাইট থাকে যখন এটি প্রথম চালিত হয় তখন তার চিরতরে 4096 বাইট থাকবে। এটা সম্ভব যে কোডটি ভ্রষ্টভাবে এমন ঠিকানাগুলিতে অ্যাক্সেস করার চেষ্টা করতে পারে যা বিদ্যমান নেই বা আশা করে যে কম্পিউটিং ঠিকানাগুলির দুটি পৃথক পদ্ধতি পৃথক মেমরি অ্যাক্সেস করতে পারে না যখন সেগুলি দেয় তবে কন্ট্রোলার নিজেই কেবলমাত্র প্রদত্ত নির্দেশাবলী কার্যকর করবে।
সুপারক্যাট

6

আমি সত্যিই মাজেঙ্কোর উত্তর পছন্দ করেছি এবং এটি নিজেই +1 করেছি। তবে আমি এটি একটি স্পষ্ট বক্তব্য স্পষ্ট করতে চাই:

যখন কোনও মাইক্রোকন্ট্রোলার স্মৃতিশক্তি শেষ হয় না তখন কিছু হতে পারে।

এটি ঘটলে আপনি সত্যিই কোনও কিছুর উপর নির্ভর করতে পারবেন না। যখন মেশিনটি স্ট্যাক মেমরির বাইরে চলে যায়, তখন স্ট্যাকটি সম্ভবত দূষিত হয়ে যায়। এবং যেমনটি ঘটে, কিছু ঘটতে পারে। পরিবর্তনশীল মান, স্পিল, টেম্প রেজিস্টারগুলি, সমস্ত দূষিত হয়ে যায়, প্রোগ্রামের প্রবাহকে ব্যাহত করে। যদি / তারপরে / এলিজগুলি ভুলভাবে মূল্যায়ন করতে পারে। রিটার্ন ঠিকানাগুলি গার্ফ করা হয়, যাতে প্রোগ্রামটি এলোমেলো ঠিকানায় ঝাঁপিয়ে পড়ে। আপনি প্রোগ্রামটিতে যে কোনও কোড লিখেছেন তা কার্যকর করতে পারে। (কোডটির মতো বিবেচনা করুন: "যদি [শর্ত] থাকে তবে {ফায়ার_সকল_মিজাইলস ();}")। এছাড়াও নির্দেশাবলী আভা নি নির্বাহ করতে পারেন যখন কোর একটি nonconnected মেমরির অবস্থান অনেক উঁচুতে লাফাতে লিখিত। সমস্ত বেট বন্ধ আছে।


2
সংযোজনের জন্য ধন্যবাদ, আমি বিশেষত ফায়ার_স_মিসাইলস () লাইনটি পছন্দ করেছি।
মিস্টার মাইস্টের

1

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

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