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


72

কার্নেল যখন ব্যবহারকারী প্রোগ্রামের তথা সিস্টেম কলের পক্ষ থেকে কার্যকর করা হয় তখন কার্নেল স্পেস ব্যবহার করা হয়? অথবা এটি সমস্ত কার্নেল থ্রেডের জন্য ঠিকানা স্থান (উদাহরণস্বরূপ শিডিয়ুলার)?

এটি যদি প্রথমটি হয় তবে এর চেয়ে কি সাধারণ ব্যবহারকারী প্রোগ্রামে 3 গিগাবাইটের বেশি মেমরি থাকতে পারে না (যদি বিভাগটি 3 জিবি + 1 জিবি হয়)? এছাড়াও, সেক্ষেত্রে কার্নেল কীভাবে উচ্চ মেমোরি ব্যবহার করতে পারে, কারণ ভার্চুয়াল মেমরির ঠিকানার সাথে উচ্চ মেমরির পৃষ্ঠাগুলি ম্যাপ করা হবে, কারণ 1 গিগাবাইট কার্নেল স্পেসটি যুক্তিযুক্তভাবে ম্যাপ করা হবে?

উত্তর:


93

কার্নেল যখন ব্যবহারকারী প্রোগ্রামের তথা সিস্টেম কলের পক্ষ থেকে কার্যকর করা হয় তখন কার্নেল স্পেস ব্যবহার করা হয়? অথবা এটি সমস্ত কার্নেল থ্রেডের জন্য ঠিকানা স্থান (উদাহরণস্বরূপ শিডিয়ুলার)?

হ্যাঁ এবং হ্যাঁ

আমরা আরও কিছু আগে যাওয়ার আগে আমাদের এটিকে স্মৃতি সম্পর্কে বলা উচিত।

স্মৃতি দুটি স্বতন্ত্র অঞ্চলে বিভক্ত:

  • ব্যবহারকারীর স্থান , যা লোকালগুলির একটি সেট যেখানে সাধারণ ব্যবহারকারী প্রক্রিয়াগুলি চালিত হয় (যেমন কর্নেল ব্যতীত অন্য সব কিছু)। কার্নেলের ভূমিকা হ'ল এই স্পেসে চলমান অ্যাপ্লিকেশনগুলি একে অপরের সাথে মেশানো এবং মেশিন থেকে পরিচালনা করা।
  • কার্নেল স্পেস , যা এমন অবস্থান যেখানে কার্নেলের কোডটি সংরক্ষণ করা হয় এবং এর অধীনে সঞ্চালিত হয়।

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

কার্নেল স্পেস কোডে "কার্নেল মোড" চালানোর সম্পত্তি রয়েছে যা (আপনার সাধারণ ডেস্কটপ -x86- কম্পিউটারে) আপনি কল কোডটি যা রিং 0 এর অধীনে কার্যকর হয়সাধারণত x86 আর্কিটেকচারে সুরক্ষার 4 টি রিং রয়েছে । রিং 0 (কার্নেল মোড), রিং 1 (ভার্চুয়াল মেশিন হাইপারভাইজার বা ড্রাইভার ব্যবহার করতে পারে), রিং 2 (ড্রাইভাররা ব্যবহার করতে পারেন, যদিও আমি সে সম্পর্কে এতটা নিশ্চিত নই)। রিং 3 হল টিপিক্যাল অ্যাপ্লিকেশনগুলির আওতায় চলে। এটি সর্বনিম্ন সুবিধাপ্রাপ্ত রিং, এবং এতে চলমান অ্যাপ্লিকেশনগুলির প্রসেসরের নির্দেশাবলীর একটি উপসেট অ্যাক্সেস রয়েছে। রিং 0 (কার্নেল স্পেস) সর্বাধিক সুবিধাযুক্ত রিং এবং এতে মেশিনের সমস্ত নির্দেশাবলীতে অ্যাক্সেস রয়েছে। উদাহরণস্বরূপ, একটি "সরল" অ্যাপ্লিকেশন (ব্রাউজারের মতো) x86 সমাবেশ নির্দেশাবলী ব্যবহার করতে পারে নাlgdtবিশ্বব্যাপী বর্ণনাকারী টেবিলটি লোড করতে বা hltএকটি প্রসেসরের থামাতে।

এটি যদি প্রথমটি হয় তবে এর চেয়ে কি সাধারণ ব্যবহারকারী প্রোগ্রামে 3 গিগাবাইটের বেশি মেমরি থাকতে পারে না (যদি বিভাগটি 3 জিবি + 1 জিবি হয়)? এছাড়াও, সেক্ষেত্রে কার্নেল কীভাবে উচ্চ মেমোরি ব্যবহার করতে পারে, কারণ ভার্চুয়াল মেমরির ঠিকানার সাথে উচ্চ মেমরির পৃষ্ঠাগুলি ম্যাপ করা হবে, কারণ 1 গিগাবাইট কার্নেল স্পেসটি যুক্তিযুক্তভাবে ম্যাপ করা হবে?

এর উত্তরের জন্য, দয়া করে এখানে ওয়াগের মাধ্যমে দুর্দান্ত উত্তরটি দেখুন


4
আমি কোথাও ভুল করেছি কিনা তা বলতে দ্বিধা করবেন না। আমি কার্নেল প্রোগ্রামিংয়ে নতুন, এবং আমি এখন পর্যন্ত যা শিখেছি তা এখানে ছড়িয়ে দিয়েছি এবং ওয়েবে আরও কিছু তথ্য পেয়েছি। যার অর্থ হ'ল পাঠ্যে প্রদর্শিত ধারণাগুলি সম্পর্কে আমার বোঝার মধ্যে কিছু ত্রুটি থাকতে পারে।
NlightNFotis

ধন্যবাদ! আমি এখন এটি আরও ভাল বুঝতে পারি বলে মনে করি। আমি এটি সঠিকভাবে পেয়েছি তা নিশ্চিত করার জন্য, আমার আরও একটি প্রশ্ন রয়েছে। আবার প্রথম 3 জিবি ব্যবহারকারীর জন্য এবং 128 এমবি কার্নেল স্পেসটি উচ্চ মেমরির জন্য ব্যবহৃত হবে তা বিবেচনা করে কি বাকী 896 এমবি (লো মেমোরি) স্থিরভাবে বুট-টাইমে ম্যাপ করা হয়েছে?
পুজান

1
@NlightNFotis আমি বলছি যে প্রায় 15 জন লোক বিশ্বাস করে যে আপনি যা বলেছেন তা সঠিক (বা তাই আপনি আমাদের
ভাবিয়ে

আমি ভেবেছিলাম x86 রিং -1হাইপারভাইজারদের জন্য ছিল? en.wikedia.org/wiki/Protication_ring
ডরি

1
ভার্চুয়াল মেমরি এবং শারীরিক মেমরির মধ্যে পার্থক্যটি নোট করুন। আপনি যা জিজ্ঞাসা করেন তার বেশিরভাগটি ভার্চুয়াল মেমরির বিষয়ে। এটি শারীরিক স্মৃতিতে ম্যাপ করা হয়, শারীরিক স্মৃতি 3 গিগাবাইটের কাছে যাওয়ার সাথে সাথে জটিল হয়ে ওঠে এবং পিএই ব্যবহার করা হয়। এটি আবার সহজ হয়ে যায় যখন bit৪ বিট কার্নেল ব্যবহার করা হয়, এক্ষেত্রে নেতিবাচক ঠিকানাগুলি কার্নেলের জন্য সংরক্ষিত থাকে এবং ব্যবহারকারীর জায়গার জন্য ইতিবাচক ঠিকানা থাকে। 32 বিট প্রসেসগুলি এখন 4 জিবি ভার্চুয়াল স্পেস ব্যবহার করতে পারে। 64 বিট প্রক্রিয়াগুলি আরও অনেক কিছু ব্যবহার করতে পারে - সাধারণত 48 বিট মূল্য (এই মুহুর্তে x86-64 এ)।
ctrl-alt-delor

16

সিপিইউ রিংগুলি সবচেয়ে স্পষ্ট পার্থক্য

X86 সুরক্ষিত মোডে, সিপিইউ সর্বদা 4 টি রিংয়ের মধ্যে থাকে। লিনাক্স কার্নেলটি কেবল 0 এবং 3 ব্যবহার করে:

  • কার্নেলের জন্য 0
  • 3 ব্যবহারকারীদের জন্য

এটি কার্নেল বনাম ব্যবহারকারীল্যান্ডের সর্বাধিক শক্ত এবং দ্রুত সংজ্ঞা।

কেন লিনাক্স 1 এবং 2 রিং ব্যবহার করে না: https://stackoverflow.com/questions/6710040/cpu-privilege-rings-why-rings-1-and-2- পেরেন্ট- ইউজড

বর্তমান রিংটি কীভাবে নির্ধারিত হয়?

বর্তমান রিং এর সংমিশ্রণ দ্বারা নির্বাচিত হয়েছে:

  • গ্লোবাল বর্ণনাকারী টেবিল: জিডিটি এন্ট্রিগুলির একটি মেমরি টেবিল এবং প্রতিটি প্রবেশের একটি ক্ষেত্র রয়েছে Privlযা রিংকে এনকোড করে।

    LGDT নির্দেশিকা বর্তমান বর্ণনাকারী সারণিতে ঠিকানাটি সেট করে।

    আরও দেখুন: http://wiki.osdev.org/ গ্লোবাল_ডেস্কিটার_আপনযোগ্য

  • বিভাগটি সিএস, ডিএস ইত্যাদি রেজিস্ট্রেশন করে, যা জিডিটিতে প্রবেশের সূচকে নির্দেশ করে।

    উদাহরণস্বরূপ, CS = 0জিডিটি-র প্রথম এন্ট্রি কার্যকরকারী কোডের জন্য বর্তমানে সক্রিয়।

প্রতিটি রিং কী করতে পারে?

সিপিইউ চিপটি শারীরিকভাবে তৈরি করা হয়েছে যাতে:

  • রিং 0 কিছু করতে পারে

  • 3 রিং বেশ কয়েকটি নির্দেশনা চালাতে এবং কয়েকটি নিবন্ধগুলিতে লিখতে পারে না, উল্লেখযোগ্য:

    • নিজের আংটি বদলাতে পারে না! অন্যথায়, এটি নিজেকে 0 বেজে উঠতে পারে এবং রিংগুলি অকেজো হবে।

      অন্য কথায়, বর্তমান বিভাগটি বর্ণনাকারী সংশোধন করতে পারে না , যা বর্তমান রিংটি নির্ধারণ করে।

    • পৃষ্ঠার সারণীগুলি সংশোধন করতে পারে না: https://stackoverflow.com/questions/18431261/how-does-x86-paging-work

      অন্য কথায়, সিআর 3 রেজিস্টারটি সংশোধন করতে পারে না এবং নিজেই পেজিং পৃষ্ঠার সারণিগুলির সংশোধন প্রতিরোধ করে।

      সুরক্ষা / প্রোগ্রামিং কারণে স্বাচ্ছন্দ্যের জন্য এটি অন্য প্রক্রিয়াগুলির স্মৃতি দেখতে এক প্রক্রিয়াটিকে বাধা দেয়।

    • বাধা হ্যান্ডলারদের নিবন্ধন করতে পারবেন না। এগুলি মেমোরি লোকেশনগুলিতে লিখে কনফিগার করা হয়, যা পেজিংয়ের মাধ্যমেও প্রতিরোধ করা হয়।

      হ্যান্ডলারগুলি 0 রিংয়ে চলে এবং সুরক্ষা মডেলটি ভেঙে দেয়।

      অন্য কথায়, LGDT এবং LIDT নির্দেশাবলী ব্যবহার করতে পারবেন না।

    • আইও নির্দেশাবলী পছন্দ করতে পারে না inএবং এর মতো এবং outইচ্ছামত হার্ডওয়্যার অ্যাক্সেস থাকতে পারে।

      অন্যথায়, উদাহরণস্বরূপ, কোনও প্রোগ্রাম সরাসরি ডিস্ক থেকে পড়তে পারলে ফাইল অনুমতিগুলি অকেজো হবে।

      মাইকেল পেচকে আরও স্পষ্টভাবে ধন্যবাদ : ওএসের পক্ষে 3 টি রিংয়ের আইও নির্দেশনা মঞ্জুরি দেওয়া সম্ভব, এটি আসলে টাস্ক রাষ্ট্র বিভাগ দ্বারা নিয়ন্ত্রণ করা হয় ।

      3 টি রিংয়ের পক্ষে যা সম্ভব নয় তা যদি এটির প্রথম স্থানে না থাকে তবে তা করার অনুমতি দেয়।

      লিনাক্স সর্বদা এটি অস্বীকার করে। আরও দেখুন: https://stackoverflow.com/questions/2711044/why-doesnt-linux-use-the-hardware-context-switch-via-the-tss

কীভাবে প্রোগ্রামগুলি এবং অপারেটিং সিস্টেমগুলি রিংগুলির মধ্যে রূপান্তর করে?

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

  • যখন একটি userland প্রক্রিয়া কার্নেল একটি ফাইলে লেখা মত জন্য কিছু করতে চায়, এটা একটি নির্দেশ যে যেমন একটি ইন্টারাপ্ট জেনারেট করে ব্যবহার int 0x80বাsyscall কার্নেল সংকেত। x86-64 লিনাক্স সিস্কেল হ্যালো বিশ্বের উদাহরণ:

    .data
    hello_world:
        .ascii "hello world\n"
        hello_world_len = . - hello_world
    .text
    .global _start
    _start:
        /* write */
        mov $1, %rax
        mov $1, %rdi
        mov $hello_world, %rsi
        mov $hello_world_len, %rdx
        syscall
    
        /* exit */
        mov $60, %rax
        mov $0, %rdi
        syscall
    

    সংকলন এবং চালনা:

    as -o hello_world.o hello_world.S
    ld -o hello_world.out hello_world.o
    ./hello_world.out
    

    গিটহাব উজানের দিকে

    যখন এটি ঘটে, সিপিইউ একটি বাধা কলব্যাক হ্যান্ডলার কল করে যা কার্নেল বুটের সময় নিবন্ধিত হয়েছিল। এখানে একটি কংক্রিট খোলামেলা উদাহরণ যা কোনও হ্যান্ডলারের নিবন্ধন করে এবং এটি ব্যবহার করে

    এই হ্যান্ডলারটি 0 রিংয়ে চলেছে, যা কার্নেলটি এই ক্রিয়াটিকে অনুমতি দেবে, ক্রিয়াটি করবে এবং ইউজারল্যান্ড প্রোগ্রামটি রিং 3-এ পুনরায় চালু করবে কিনা তা স্থির করে x x_

  • যখন execসিস্টেম কল ব্যবহৃত হয় (বা যখন কার্নেলটি শুরু হবে/init ), কার্নেলটি নতুন ইউজারল্যান্ড প্রক্রিয়াটির রেজিস্টার এবং মেমরি প্রস্তুত করে , তখন এটি প্রবেশের পয়েন্টে লাফিয়ে যায় এবং সিপিইউ 3 বাজায় পরিবর্তিত হয়

  • প্রোগ্রামটি যদি কোনও নিষিদ্ধ রেজিস্টার বা মেমরির ঠিকানায় (পেজিংয়ের কারণে) দুষ্টু কিছু করার চেষ্টা করে তবে সিপিইউ রিং 0-তে কিছু কার্নেল কলব্যাক হ্যান্ডলারকে কল করে।

    তবে যেহেতু ইউজারল্যান্ড দুষ্টু ছিল, তাই কার্নেলটি এবার প্রক্রিয়াটি মেরে ফেলবে বা সিগন্যাল দিয়ে এটিকে একটি সতর্কতা দেবে।

  • যখন কার্নেল বুট হয়, এটি কিছু স্থির ফ্রিকোয়েন্সি সহ একটি হার্ডওয়্যার ঘড়ি সেটআপ করে, যা সময়ে সময়ে বিঘ্ন সৃষ্টি করে।

    এই হার্ডওয়্যার ক্লকটি রিং 0 চালিত করে এমন বিঘ্ন সৃষ্টি করে এবং কোন ইউজারল্যান্ড জেগে উঠার প্রক্রিয়াটি নির্ধারণ করার অনুমতি দেয়।

    প্রক্রিয়াগুলি কোনও সিস্টেম কল না করলেও এই সময়সূচিটি ঘটতে পারে।

একাধিক রিং থাকার মানে কী?

কার্নেল এবং ইউজারল্যান্ড পৃথক করার দুটি বড় সুবিধা রয়েছে:

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

এর সাথে কীভাবে খেলা হবে?

আমি একটি বেয়ার মেটাল সেটআপ তৈরি করেছি যা রিংগুলি সরাসরি পরিচালনা করার জন্য ভাল উপায় হওয়া উচিত: https://github.com/cirosantilli/x86-bare-metal- উদাহরণ

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

বিকল্পভাবে, লিনাক্স কার্নেল মডিউলগুলি 0 রিংয়ে চলেছে, তাই আপনি সুবিধাপ্রাপ্ত অপারেশনগুলি চেষ্টা করে দেখতে পারেন, উদাহরণস্বরূপ কন্ট্রোল রেজিস্টারগুলি পড়ুন: https://stackoverflow.com/questions/7415515/how-to-access-the-control-register -cr0-CR2-Cr3-থেকে-এ-প্রোগ্রাম-পেয়ে-segmenta / 7419306 # 7419306

আপনার হোস্টকে হত্যা না করে এটি চেষ্টা করার জন্য এখানে একটি সুবিধাজনক কিউইউ + বিল্ড্রুট সেটআপ রয়েছে

কার্নেল মডিউলগুলির সর্বনিম্নতাটি হ'ল অন্যান্য কাঁথ্রেডগুলি চলছে এবং আপনার পরীক্ষায় হস্তক্ষেপ করতে পারে। তবে তত্ত্ব অনুসারে আপনি আপনার কার্নেল মডিউল সহ সমস্ত বাধাপ্রাপ্ত হ্যান্ডলারগুলি নিতে পারেন এবং সিস্টেমটির মালিক হতে পারেন, এটি আসলে একটি আকর্ষণীয় প্রকল্প হবে।

নেতিবাচক রিং

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

একটি উদাহরণ হ'ল ভার্চুয়ালাইজেশনে ব্যবহৃত হাইপারভাইজার মোড।

আরও তথ্যের জন্য দেখুন: https://security.stackexchange.com/questions/129098/ কি-is- সুরক্ষার-আরআর-1

এআরএম

এআরএম-এ, রিংগুলিকে পরিবর্তে ব্যতিক্রমী স্তর বলা হয়, তবে মূল ধারণাটি একই থাকে।

এআরএমভি 8 এ 4 টি ব্যতিক্রম স্তর রয়েছে যা সাধারণত:

  • EL0: ইউজারল্যান্ড

  • EL1: কার্নেল (এআরএম পরিভাষায় "সুপারভাইজার")।

    svcইন্সট্রাকশন (সুপারভাইজার কল) দিয়ে প্রবেশ করা হয়েছে , পূর্বে swi ইউনিফাইড সমাবেশ হিসাবে পরিচিত , যা লিনাক্স সিস্টেম কল করার জন্য ব্যবহৃত নির্দেশ। হ্যালো ওয়ার্ল্ড এআরএমভি 8 উদাহরণ:

    .text
    .global _start
    _start:
        /* write */
        mov x0, 1
        ldr x1, =msg
        ldr x2, =len
        mov x8, 64
        svc 0
    
        /* exit */
        mov x0, 0
        mov x8, 93
        svc 0
    msg:
        .ascii "hello syscall v8\n"
    len = . - msg
    

    গিটহাব উজানের দিকে

    উবুন্টু 16.04 এ কিউইএমইউ দিয়ে এটি পরীক্ষা করে দেখুন:

    sudo apt-get install qemu-user gcc-arm-linux-gnueabihf
    arm-linux-gnueabihf-as -o hello.o hello.S
    arm-linux-gnueabihf-ld -o hello hello.o
    qemu-arm hello
    

    এখানে একটি কংক্রিট খোলামেলা উদাহরণ যা একটি এসভিসি হ্যান্ডলারটিকে নিবন্ধিত করে এবং এসভিসি কল করে

  • EL2: হাইপারভাইজারস , উদাহরণস্বরূপ জেন

    hvcনির্দেশের মাধ্যমে প্রবেশ (হাইপারভাইজার কল)।

    হাইপারভাইজার একটি ওএসের কাছে হয়, ইউএসল্যান্ডের মধ্যে একটি ওএস কী।

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

    হাইপারভাইজারগুলি আজকের মেঘ অবকাঠামোর একটি মূল অঙ্গ: তারা হার্ডওয়্যার ব্যবহারকে সর্বদা 100% এর কাছাকাছি রেখে এবং প্রচুর অর্থ সাশ্রয় করে একাধিক সার্ভারকে একটি একক হার্ডওয়্যারের উপর চালানোর অনুমতি দেয়।

    এডাব্লুএস উদাহরণস্বরূপ জেনকে 2017 পর্যন্ত ব্যবহার করা হয়েছিল যখন কেভিএম-তে এটি সরানো খবরটি তৈরি করে

  • EL3: আরও একটি স্তর। TODO উদাহরণ।

    smcনির্দেশের মাধ্যমে প্রবেশ করা (সিকিউর মোড কল)

ARMv8 আর্কিটেকচার রেফারেন্স মডেল DDI 0487C.a - অধ্যায় D1 - AArch64 সিস্টেম লেভেলে প্রোগ্রামার এর মডেল - চিত্র D1-1 সুন্দর এই প্রকাশ:

এখানে চিত্র বর্ণনা লিখুন

নোটার স্তরের প্রয়োজন ছাড়াই কীভাবে এআরএম, সম্ভবত হ্যান্ডসাইটের সুবিধার কারণে, এক্সভিটিভেশন স্তরের জন্য নামকরণের আরও ভাল কনভেনশন করেছে তা নোট করুন: 0 নিম্ন এবং 3 সর্বোচ্চ। নিম্ন স্তরের তুলনায় উচ্চতর স্তরগুলি প্রায়শই তৈরি হতে থাকে।

বর্তমান EL MRSনির্দেশের সাথে অনুসন্ধান করা যেতে পারে : https://stackoverflow.com/questions/31787617/ কি-is-the-current-execution-mode-exception-level-etc

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

কোনও প্রয়োগে ব্যতিক্রমের সমস্ত স্তরের অন্তর্ভুক্ত নাও হতে পারে। সমস্ত বাস্তবায়নে অবশ্যই EL0 এবং EL1 অন্তর্ভুক্ত থাকতে হবে। EL2 এবং EL3 alচ্ছিক।

উদাহরণস্বরূপ কিউইএমইউ EL1 এর ডিফল্ট, তবে EL2 এবং EL3 কমান্ড লাইন বিকল্পের সাহায্যে সক্ষম করা যেতে পারে: https://stackoverflow.com

উবুন্টু 18.10 এ কোড স্নিপেট পরীক্ষা করা হয়েছে।


3

এটি যদি প্রথমটি হয় তবে এর চেয়ে কি সাধারণ ব্যবহারকারী প্রোগ্রামে 3 গিগাবাইটের বেশি মেমরি থাকতে পারে না (যদি বিভাগটি 3 জিবি + 1 জিবি হয়)?

হ্যাঁ এটি একটি সাধারণ লিনাক্স সিস্টেমের ক্ষেত্রে। "4G / 4G" প্যাচগুলির একটি সেট প্রায় এক পর্যায়ে ভাসছিল যা ব্যবহারকারী এবং কার্নেল ঠিকানা স্পেসগুলি সম্পূর্ণ স্বতন্ত্র করে তুলেছে (একটি কার্য সম্পাদন ব্যয়ের কারণে এটি কার্নেলের পক্ষে ব্যবহারকারীর স্মৃতি অ্যাক্সেস করা আরও শক্ত করে তোলে) তবে আমি মনে করি না এগুলি কখনও প্রবাহিত হয়ে যায় এবং x86-64 এর উত্থানের সাথে আগ্রহ কমে যায়

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

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

তাই নিম্ন ও উচ্চ স্মৃতি ধারণার জন্ম হয়েছিল। "কম" মেমরি স্থায়ীভাবে কার্নেলের ঠিকানা স্থানে ম্যাপ করা হয়। "উচ্চ" স্মৃতি হয় না।

প্রসেসর যখন একটি সিস্টেম কল চালাচ্ছে এটি কার্নেল মোডে চলমান রয়েছে তবে বর্তমান প্রক্রিয়াটির প্রসঙ্গে এখনও। সুতরাং এটি সরাসরি কার্নেলের ঠিকানা স্থান এবং বর্তমান প্রক্রিয়াটির ব্যবহারকারীর ঠিকানা স্পেস উভয়ই অ্যাক্সেস করতে পারে (ধরে নিই যে আপনি উল্লিখিত 4 জি / 4 জি প্যাচগুলি ব্যবহার করছেন না)। এর অর্থ এটি "উচ্চ" মেমরির জন্য কোনও ইউজারল্যান্ড প্রক্রিয়াতে বরাদ্দ করা কোনও সমস্যা নয়।

কার্নেলের উদ্দেশ্যে "হাই" মেমরি ব্যবহার করা আরও একটি সমস্যা। বর্তমান প্রক্রিয়াটিতে ম্যাপ করা হয়নি এমন উচ্চ স্মৃতি অ্যাক্সেস করতে এটিকে অস্থায়ীভাবে কার্নেলের ঠিকানা স্পেসে ম্যাপ করা উচিত। এর অর্থ অতিরিক্ত কোড এবং একটি পারফরম্যান্স পেনাল্টি।

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