কার্নেল স্ট্যাক এবং ব্যবহারকারীর স্পেস স্ট্যাক


110

কার্নেল স্ট্যাক এবং ব্যবহারকারীর স্ট্যাকের মধ্যে পার্থক্য কী? কার্নেল স্ট্যাক ব্যবহার করা হয় কেন? কোনও স্থানীয় ভেরিয়েবল যদি আইএসআর-এ ঘোষণা করা হয় তবে এটি কোথায় সংরক্ষণ করা হবে? প্রতিটি প্রক্রিয়াটির নিজস্ব কার্নেল স্ট্যাক রয়েছে? তাহলে কীভাবে প্রক্রিয়া এই উভয় স্ট্যাকের মধ্যে সমন্বয় সাধন করে?

উত্তর:


187
  1. কার্নেল স্ট্যাক এবং ব্যবহারকারীর স্ট্যাকের মধ্যে পার্থক্য কী?

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

  1. [পৃথক] কার্নেল স্ট্যাক কেন ব্যবহার করা হয়?

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

  1. যদি কোনও স্থানীয় ভেরিয়েবল কোনও আইএসআর-এ ঘোষণা করা হয় তবে এটি কোথায় সংরক্ষণ করা হবে?

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

  1. প্রতিটি প্রক্রিয়াটির নিজস্ব কার্নেল স্ট্যাক রয়েছে?

শুধু প্রতিটি প্রক্রিয়া নয় - প্রতিটি থ্রেডের নিজস্ব কার্নেল স্ট্যাক রয়েছে (এবং বাস্তবে এটির নিজস্ব ব্যবহারকারী স্ট্যাকও রয়েছে)। মনে রাখবেন প্রক্রিয়া এবং থ্রেডের মধ্যে একমাত্র পার্থক্য (লিনাক্সের কাছে) হ'ল একাধিক থ্রেড একটি ঠিকানা স্থান ভাগ করতে পারে (প্রক্রিয়া গঠনে)।

  1. প্রক্রিয়া এই উভয় স্ট্যাকের মধ্যে সমন্বয় করে?

মোটেও নয় - এর দরকার নেই। নির্ধারিত (কীভাবে / কখন বিভিন্ন থ্রেড চলছে, কীভাবে তাদের রাজ্য সংরক্ষণ এবং পুনরুদ্ধার করা হয়) অপারেটিং সিস্টেমের কাজ এবং প্রক্রিয়াগুলি এগুলি নিয়ে তাদের উদ্বেগের প্রয়োজন নেই। থ্রেড তৈরি হওয়ার সাথে সাথে (এবং প্রতিটি প্রক্রিয়ায় কমপক্ষে একটি থ্রেড থাকা আবশ্যক), কার্নেল তাদের জন্য কার্নেল স্ট্যাক তৈরি করে, যখন ব্যবহারকারী স্পেস স্ট্যাকগুলি স্পষ্টতই তৈরি করা হয় / যে কোনও প্রক্রিয়া থ্রেড তৈরির জন্য ব্যবহৃত হয় (কলকারীর মতো কাজ makecontext()বা pthread_create()অনুমতি দেয়) "শিশু" থ্রেডের স্ট্যাকের জন্য ব্যবহার করার জন্য একটি মেমরি অঞ্চল নির্দিষ্ট করুন) বা উত্তরাধিকারসূত্রে প্রাপ্ত (কোনও নতুন প্রক্রিয়া তৈরি করার সময় অন-অ্যাক্সেস মেমরি ক্লোনিং দ্বারা সাধারণত "লিখিত অনুলিপি" / COW বলা হয়)।
বলেছিল,(রাষ্ট্র, এর মধ্যে থ্রেডের স্ট্যাকপয়েন্টার রয়েছে)। এই জন্য একাধিক উপায় রয়েছে: ইউনিক্স সংকেত, setcontext(), pthread_yield()/ pthread_cancel()... - কিন্তু এই মূল প্রশ্ন থেকে একটু disgressing করা হয়।


দুর্দান্ত উত্তর ফ্র্যাঙ্কএইচ। ধন্যবাদ।
কুমার

1
@ ফ্র্যাঙ্কএইচ চমৎকার উত্তর .. তবে এ সম্পর্কিত আমার কাছে ছোট ছোট প্রশ্ন আছে তবে এআরএম আর্কিটেকচারে .. এই কার্নেল স্ট্যাকটি বিভিন্ন প্রসেসরের মোডের সাথে কীভাবে সম্পর্কিত?
রাহুল

2
@ রাহুল: "একটি এসও মন্তব্যের মার্জিন খুব কম এ জাতীয় উত্তর থাকতে পারে"। বিভিন্ন এআরএম সিপিইউ মোডগুলিতে স্ট্যাক / স্ট্যাকপয়েন্টার কীভাবে নিবন্ধগুলি নিবন্ধভুক্ত করে (কোনটি ব্যাংকযুক্ত এসপি প্রয়োগ করে) এটি একটি ভাল প্রশ্ন, তবে কোনও মন্তব্য দেওয়ার চেয়ে উত্তর দেওয়ার জন্য আরও জায়গা প্রয়োজন requires এটিই x86 টাস্ক গেটস বা আইএসটি-র মতো জিনিসগুলিতে প্রযোজ্য - "একক" কার্নেল স্ট্যাক পয়েন্টার (যেমন "একক" ব্যবহারকারীর স্ট্যাক পয়েন্টার নেই), এবং হার্ডওয়্যার সমর্থন / ম্যান্ডেটের জন্য কোন জিনিস নেই বিভিন্ন অপারেটিং মোডে পৃথক স্ট্যাক পয়েন্টার হ'ল ... খুব হার্ডওয়ার-নির্ভর।
ফ্র্যাঙ্কএইচ।

@FrankH। আমি একই জন্য নতুন প্রশ্ন তৈরি করেছি ... stackoverflow.com/q/22601165/769260 আমি আশা করি এখন আপনি স্থানের যত্ন না নিয়েই আমাকে সহায়তা করতে পারবেন :)
রাহুল

1
@FrankH। কার্নেলের স্ট্যাকটি কোনও প্রক্রিয়াটির মেমরি বিন্যাসে অন্তর্ভুক্ত যেখানে আপনি চিত্রটি সরবরাহ করতে পারেন?
Jithin Pavithran

19

আমার উত্তরগুলি আমার স্টাফ সহ অন্যান্য এসও প্রশ্ন থেকে সংগ্রহ করা হয়েছে।

What's the difference between kernel stack and user stack?

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

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

http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-10/3194.html

Why kernel stack is used?

সুতরাং যখন আমরা কার্নেল মোডে থাকি তখন ফাংশন কলগুলি, ব্যবহারকারীর জায়গার অনুরূপ স্থানীয় ভেরিয়েবলগুলি মোকাবেলার জন্য স্ট্যাক ধরণের প্রক্রিয়াটি প্রয়োজন।

http://www.kernel.org/doc/Documentation/x86/kernel-stacks

If a local variable is declared in an ISR, where it will be stored?

এটি আইএসআর স্ট্যাকে সংরক্ষণ করা হবে (IRQSTACKSIZE)। আইএসআরটি কেবল একটি পৃথক বাধা স্ট্যাকের উপর চালিত হয় কেবলমাত্র যদি হার্ডওয়্যার সমর্থন করে। অন্যথায়, আইএসআর স্ট্যাক ফ্রেমগুলি বাধা থ্রেডের স্ট্যাকের দিকে ধাক্কা দেওয়া হয়।

ব্যবহারকারীর স্থানটি জানেন না এবং খোলামেলাভাবে বর্তমান প্রক্রিয়াটির কার্নেল স্ট্যাক বা পৃথক আইএসআর স্ট্যাকের মধ্যে বাধা দেওয়া হয় কিনা সে সম্পর্কে কোনও যত্ন নেই। সিপিইউতে যেমন বাধা আসে, তাই আইএসপি স্ট্যাকটি প্রতি সিপিইউতে হয়।

 Does each process has its own kernel stack ?

হ্যাঁ. প্রতিটি প্রক্রিয়ার নিজস্ব কার্নেল স্ট্যাক থাকে।

 Then how the process coordinates between both these stacks?

@ ফ্র্যাঙ্কএইচ এর উত্তর আমার কাছে দুর্দান্ত লাগছে।


4
  1. কার্নেল স্ট্যাক এবং ব্যবহারকারীর স্ট্যাকের মধ্যে পার্থক্য কী

রবার্ট লাভের লিনাক্স কার্নেল বিকাশ থেকে রেফারেন্স নেওয়া, মূল পার্থক্যটি আকার:

বিশাল স্ট্রাকচার এবং হাজার-অ্যালিমেন্ট অ্যারে সহ স্ট্যাকের স্ট্যাটিকভাবে অনেকগুলি ভেরিয়েবল বরাদ্দ করে ব্যবহারকারীর স্থানটি সরে যেতে পারে।
এই আচরণটি আইনী কারণ ব্যবহারকারী-স্পেসের একটি বৃহত স্ট্যাক রয়েছে যা গতিশীলভাবে বাড়তে পারে।
কার্নেলের স্ট্যাক বড় বা গতিশীল নয়; এটি আকারে ছোট এবং স্থির।
কার্নেলের স্ট্যাকের সঠিক আকারটি স্থাপত্যের দ্বারা পৃথক হয় var
X86-এ, স্ট্যাকের আকারটি সংকলন-সময়ে কনফিগারযোগ্য এবং 4KB বা 8KB হতে পারে।
.তিহাসিকভাবে, কার্নেল স্ট্যাকটি দুটি পৃষ্ঠাগুলি, যা সাধারণত সূচিত করে যে এটি 32-বিট আর্কিটেকচারে 8KB এবং K৪-বিট আর্কিটেকচারে ১B কেবি — এই আকারটি স্থির এবং নিরঙ্কুশ।
প্রতিটি প্রক্রিয়া নিজস্ব স্ট্যাক গ্রহণ করে।

এছাড়াও কার্নেল স্ট্যাকের মধ্যে থ্রেড_ইনফো কাঠামোর জন্য একটি সূচক রয়েছে যা থ্রেড সম্পর্কে তথ্য রাখে।

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