আমি কীভাবে লিনাক্স কার্নেল থেকে মেমরির একটি ব্লক সংরক্ষণ করতে পারি?


26

আমার একটি ডিভাইস রয়েছে যা ওএস হস্তক্ষেপ না করে মেমরির একটি ব্লক প্রয়োজন যা কেবলমাত্র এটির জন্য সংরক্ষিত। BIOS বা ওএসকে বলার কোনও উপায় আছে যে মেমরির একটি ব্লক সংরক্ষিত আছে, এবং এটি অবশ্যই এটি ব্যবহার করবেন না?

আমি এই ডিভাইসটি একটি ওপেনসুএস মেশিনে ব্যবহার করছি।

উত্তর:


24

আপনি যেটির জন্য জিজ্ঞাসা করছেন তাকে ডিএমএ বলা হয়। এই স্মৃতিটি সংরক্ষণ করতে আপনাকে ড্রাইভার লিখতে হবে।

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

রুবিনি, কর্বেট এবং ক্রোহ-হার্টম্যান রচিত " লিনাক্স ডিভাইস ড্রাইভারস, 3 / ই " এর অধ্যায় 15 (পিডিএফ) ডিএমএ এবং সম্পর্কিত বিষয়গুলি কভার করে।

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


ডিএমএ দিয়ে আমি কী শারীরিক ঠিকানা ব্যবহার করতে পারি তা চয়ন করতে পারি? কার্নেলটি কি আমাকে স্মৃতির একটানা ব্লক দেবে? এটি কি সর্বদা উপলব্ধ থাকার গ্যারান্টিযুক্ত?
নাথান ফেলম্যান

1
আপনার প্রশ্নের উত্তরগুলি পিডিএফের 442 পৃষ্ঠায় শুরু করা হয়েছে আমি আপনাকে নির্দেশ করেছি।
ওয়ারেন ইয়ং

25

আপনি যদি ওএসটিকে সম্পূর্ণ উপেক্ষা করতে চান তবে আপনাকে memmap" " ব্যবহার করে একটি মেমরির গর্ত তৈরি করতে হবে । এই রেফারেন্স দেখুন । উদাহরণস্বরূপ, আপনি যদি 2 জিবি বাধাতে 512 এম চান, আপনি memmap=512M$2Gআপনার কার্নেল কমান্ড লাইনে " " লাগাতে পারেন ।

dmesgচুরির জন্য একটি উপযুক্ত গর্ত খোঁজার জন্য আপনাকে পরীক্ষা করতে হবে যাতে আপনি কোনও ডিভাইসে স্টম্প না করেন; এটি আপনার মাদারবোর্ড + কার্ডের ক্ষেত্রে নির্দিষ্ট।

এটি কাজ করার প্রস্তাবিত উপায় নয় - কীভাবে সঠিকভাবে এটি করা যায় তার জন্য ওয়ার্ন ইয়ংয়ের উত্তর দেখুন (কার্নেল ড্রাইভার + ডিএমএ)। আপনি ঠিক জিজ্ঞাসা করেছেন ঠিক উত্তর আমি দিচ্ছি। যদি আপনি শেষ ব্যবহারকারীদের জন্য এটি তৈরির পরিকল্পনা করেন, আপনি যদি তাদের সাথে এটি করেন তবে তারা আপনাকে ঘৃণা করবে ... বিশ্বাস করুন, আমি এই উত্তরটি জানতাম এ কারণেই reason


সম্পাদনা করুন: আপনার grub2 W / অপরিচ্ছন্ন (যেমন সেন্টওএস 7) ব্যবহার করে থাকেন, আপনি প্রয়োজন $ অব্যাহতি নিশ্চিত\আগে একক থাকতে হবে $। উদাহরণ:

$ sudo -v
$ sudo grubby --update-kernel=ALL --args=memmap='128M\\$0x57EF0000'
$ sudo grubby --info $(sudo grubby --default-kernel) | grep memmap
args="ro crashkernel=auto ... memmap=128M\$0x57EF0000"

1
যদিও আপনার উত্তরটি আমার প্রশ্নের সরাসরি উত্তর দেয়, ওয়ারেনের উত্তরটি এটির পক্ষে যাওয়ার আরও ভাল উপায় বলে মনে হয়। :-)
নাথান ফেলম্যান

1
@ ওয়ারেন ইউইং এটি সম্পর্কে আপনার কী ধারণা করা হচ্ছে তা আমার কোনও ধারণা নেই । আমি uint8_t *ptr = 0x8000000আমার উদাহরণ দিয়ে " " অনুমান করব? অথবা সেগফল্ট হতে পারে ... হু, আমি আসলে জানি না। আবার, আমি উত্তরটি জানতাম কারণ আমি একটি দুর্বল ডিজাইন করা পিসিআই কার্ডের শেষ ব্যবহারকারী যেখানে আমাকে নিজেই 4 জি চিহ্নের নীচে একটি বাফার বরাদ্দ করতে হয়েছিল এবং তারপরে কোনও ড্রাইভারকে বলতে হবে যে জায়গাটি কোথায় ছিল; এটি ব্যবহারকারীর দেশ হতে পারে না।
অ্যারন ডি ম্যারাস্কো

2
কেবল গ্রিনগুলির জন্য, আমি এটির আরও গভীরতর দিকে চেয়েছিলাম এবং এটি আপনার প্রয়োজন বলে মনে হচ্ছে MMAP_FIXED | MMAP_ANON। এখানে কাস্টম ডিএমএ ডিভাইসটি খেলতে না পারলে, আমি বলতে পারি না এটি ওপি যা চায় তা আসলে করে, তবে আমার সেন্টস বক্স খুশিতে আমাকে একটি 8 এমবি ব্লক দিয়েছে 512 এমবিতে যখন আমি memmap=8M$512Mজিআরউবিতে বলেছিলাম । এটি এমনকি রুট অ্যাক্সেসের প্রয়োজন হয় না, যেমনটি আমি আশঙ্কা করেছি এটি হতে পারে। তবে এটি যদি সঠিক কাজটি করে, তবুও আমি মনে করি আপনার বাধা এবং এই জাতীয় ব্যবস্থাগুলি পরিচালনার জন্য সম্ভবত ড্রাইভারের দরকার হবে।
ওয়ারেন ইয়ং

3
@ অ্যারোনডি.মারাস্কো: না, mmap()' ইউ পৃষ্ঠাগুলি কোডগুলি দেখার জন্য পাতাগুলি শূন্য করা হবে। এটি সুরক্ষার জন্য করা হয়েছে, যাতে ডেটা এক প্রক্রিয়া থেকে অন্য প্রক্রিয়াতে ফাঁস হয় না। ড্রাইভার ব্যবহার করার আর একটি কারণ, কারণ ড্রাইভারের লোডের সময় আপনার ডিএমএ বাফারের সামগ্রী সংরক্ষণের প্রয়োজন হতে পারে। ওহ এবং যাইহোক, নির্বিচারে-অবস্থিত mmap()কলটি memmapকার্নেল বুট বিকল্পটি ছাড়াই সফল হয় , যতক্ষণ না কেউ ইতিমধ্যে যেখানে আপনি জিজ্ঞাসা করেছেন সেখানে ইতিমধ্যে মেমরি ব্যবহার করছে না। সন্দেহজনকভাবে বুট বিকল্পটি সাফল্যের সম্ভাবনা বাড়িয়ে তোলে, তবে এটি কঠোরভাবে প্রয়োজনীয় নয়।
ওয়ারেন ইয়ং

1
@ অ্যারোনডি.মারাসকো হুম, ঠিক আছে। মজাদার. এই লিঙ্কটির জন্য আপনাকে ধন্যবাদ, এটি একটি ভাল পড়া।
উড্রো বার্লো

5

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

memory {
    reg = <0x40000000 0x40000000>;
};

reserved-memory {
    #address-cells = <1>;
    #size-cells = <1>;
    ranges;

    /* global autoconfigured region for contiguous allocations */
    linux,cma {
        compatible = "shared-dma-pool";
        reusable;
        size = <0x4000000>;
        alignment = <0x2000>;
        linux,cma-default;
    };

    display_reserved: framebuffer@78000000 {
        reg = <0x78000000 0x800000>;
    };

    multimedia_reserved: multimedia@77000000 {
        compatible = "acme,multimedia-memory";
        reg = <0x77000000 0x4000000>;
    };
};

0

আপনার বর্তমান সেটিংস পরীক্ষা করতে প্রথমে এই আদেশটি প্রবেশ করান:

sysctl vm.min_free_kbytes

সেট মান পরিবর্তন করতে, সম্পাদনা করুন /etc/sysctl.conf। লাইনটি দেখুন:

vm.min_free_kbytes=12888

যদি এটি বিদ্যমান না থাকে তবে এটি তৈরি করুন (আপনার পছন্দসই মান সহ)। নিম্নলিখিত মানগুলি গ্রহণযোগ্য:

8192
12288
16384
20480

8 এম অত্যন্ত রক্ষণশীল; এটি আরামদায়ক 16M এ বসতে পারে। একবার আপনি মান পরিবর্তন করার পরে এটি চালান এবং কোনও পুনরায় বুট করার দরকার হয় না:

sudo sysctl -p

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