মেমরি-ম্যাপযুক্ত I / O সম্বোধন কীভাবে কাজ করে?


29

মেমরি-ম্যাপযুক্ত I / O সম্বোধন কীভাবে কাজ করে?

আমি সরবরাহ করা আই 2 এস নমুনাটি বোঝার চেষ্টা করছি : যে কেউ এটি চালাচ্ছে?

ঘড়ি কনফিগার করা:

#define BCM2708_PERI_BASE        0x20000000
#define CLOCK_BASE               (BCM2708_PERI_BASE + 0x101000) /* Clocks */

এটি প্রথমে কোডটির মতো করে মানচিত্র করে ...

clk_map = (unsigned char *)mmap(
      (caddr_t)clk_mem,
      MAP_BLOCK_SIZE,
      PROT_READ|PROT_WRITE,
      MAP_SHARED|MAP_FIXED,
      mem_fd,
      CLOCK_BASE
   );

তারপরে এটি কিছু করে ...

 // Always use volatile pointer!
   clk = (volatile unsigned *)clk_map;

এবং যখন এটি উল্লেখ করা হয় 0x26 এবং 0x27 এর এই বিজোড় সংযোজনগুলি তখন কী?

 printf("Disabling I2S clock\n");
 *(clk+0x26) = 0x5A000000;
 *(clk+0x27) = 0x5A000000;

 usleep(10);

 printf("Confiure I2S clock\n");
 *(clk+0x26) = 0x5A000001;
 *(clk+0x27) = 0x5A000000 | 3<<12 | 1<<9; // divider: 3.125==0b11.001

 usleep(10);
 printf("Enabling I2S clock\n");
 *(clk+0x26) = 0x5A000011;

ডাটাশিটের দিকে তাকিয়ে, আমি দেখতে পাচ্ছি যে তারা এই ঠিকানাগুলির মতো কয়েকটি মান কোথায় পেয়েছে তবে আমি অন্যগুলি বোঝার জন্য সংগ্রাম করছি। এটি কোথায় CLOCK_BASEনির্ধারিত এবং কী চলছে?


1
এটি সম্ভবত স্ট্যাকওভারফ্লোয়ের জন্য সবচেয়ে উপযুক্ত। যদিও এটি আরপিআই সম্পর্কিত, আপনি সেখানে প্রোগ্রামিং প্রশ্নের উত্তর পাওয়ার সম্ভাবনা বেশি পাবেন।
Jivings

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

ঠিক আছে. আসুন দেখুন কীভাবে হয় :)
Jivings

1
স্ট্যাক ওভারফ্লোতে এটি খুব ভাল করবে বলে আমি মনে করি না - এটি বেশ বিশেষজ্ঞ এবং সম্ভবত এখানে আরও বিশেষজ্ঞের মনোযোগ পাবেন।
ফ্লেক্সো

উত্তর:


18

একটি কম্পিউটারে আপনি একটি নির্দিষ্ট 'মেমরি ঠিকানায়' লিখুন। এই ঠিকানাটি একটি হার্ডওয়্যার অ্যাড্রেস হিসাবে সিস্টেমের দ্বারা স্বীকৃত এবং উপযুক্ত হার্ডওয়্যার উপযুক্ত মান গ্রহণ করে বা প্রেরণ করে।

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

রাস্পবেরি পাই 0x20000000 ঠিকানায় বিপুল পরিমাণ হার্ডওয়্যার নিবন্ধগুলি স্বীকৃতি দেয়। বিসিএম 2708_PERI_BASE + 0x101000 থেকে ঘড়ির সিস্টেমগুলি নিয়ন্ত্রণ করে এমন একটি রেজিস্টার রেজিস্ট্রেশন করা হয়। I2S ঘড়ি নিয়ন্ত্রণ করে এমন রেজিস্টারগুলি বিসিএম 2708_PERI_BASE + 0x101000 + 0x26 এবং 0x27 ব্যবহার করে লিখিত সেই ব্লকের 38 তম এবং 39 তম নিবন্ধ

আপনি কেবল ঘড়ির মান পরিবর্তন করতে পারবেন না, আপনাকে ঘড়িটি অক্ষম করতে হবে, মানগুলি পরিবর্তন করতে হবে এবং এটি পুনরায় চালু করতে হবে।

এই উত্তরটি যদি খুব মৌলিক হয় তবে আমার ক্ষমা চাই। এক্ষেত্রে আপনার প্রশ্নটি সত্যই শক্তিশালী, সৌভাগ্য। আপনি এই লিঙ্ক সহায়ক হতে পারে

আপডেট: এমএমএপ ব্যবহার করুন এবং মেমরিতে সরাসরি লিখবেন না কেন?

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

হার্ডওয়্যার পোর্টগুলি তবে সম্পূর্ণ শারীরিক ঠিকানায় রয়েছে। তবে আপনি তাদের সরাসরি লিখতে পারবেন না কারণ মেমরি পরিচালক আপনার ঠিকানাটি নেবে এবং এটি আপনার ব্যক্তিগত স্মৃতি অঞ্চলে ম্যাপ করবে।

লিনাক্সে / ডেভ / মেম একটি ' ক্যারেক্টার ডিভাইস ফাইল যা কম্পিউটারের মূল স্মৃতির একটি চিত্র '

আপনি যদি এটি কোনও ফাইলের মতো খোলেন তবে আপনি এটি ফাইলের মতো পড়তে এবং লিখতে পারেন। সরবরাহকৃত নমুনায় میم_ফডি হ'ল একটি ফাইল হ্যান্ডেল যা খোলার / দেব / মেম্বের ফলে ঘটে

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

সুতরাং এই নমুনায় কোডটি শারীরিক মেমরির জন্য একটি হ্যান্ডেল তৈরি করছে, এটি ডিস্কে থাকা কোনও ফাইল হিসাবে এবং তারপরে সিস্টেমটিকে এটি স্মৃতি হিসাবে মনে করে চিকিত্সা করতে বলছে। ভার্চুয়াল মেমরি ম্যানেজারকে গোল করে পেতে এবং কোনও আসল শারীরিক ঠিকানায় লিখতে গেলে কিছুটা বিশৃঙ্খল, তবে প্রয়োজনীয়। 0x20000000 মানটি মনে হয় এটি একটি লাল রঙের হারিং ring কোডটি এই ঠিকানাটিকে একটি ইঙ্গিত হিসাবে প্রস্তাব দিচ্ছে, সিস্টেমটি এখানে মানচিত্র / দেব / মেমের দরকার নেই, যদিও এটি সম্ভবত রয়েছে। সাধারণত মান নালটি পাস হয়ে যায় এবং সিস্টেমটি ফাইল হ্যান্ডেলটিকে যে ঠিকানায় ভাল বলে মনে করে ম্যাপ করে।

এখন শারীরিক স্মৃতি প্রক্রিয়াকরণগুলিতে ভার্চুয়াল মেমরির সাথে ম্যাপ করা হয় এবং আপনি যেখানে আশা করেন সেখানে পড়ে এবং লেখায়।

তথ্যসূত্র:

http://www.kernel.org/doc/man-pages/online/pages/man2/mmap.2.html

http://www.raspberrypi.org/phpBB3/viewtopic.php?f=44&t=8496&p=104359

https://superuser.com/questions/71389/what-is-dev-mem


আমার এখনও বেশ কয়েকটি প্রশ্ন রয়েছে: কেন তারা এমএম্যাপ করে? শুধু সরাসরি স্মৃতি অ্যাক্সেস না কেন?
অ্যালেক্স চেম্বারলাইন

@ অ্যালেক্সচাম্বারলাইন কারণ কোডটি লিনাক্সে চলে, সুতরাং প্রতিটি প্রক্রিয়াটির নিজস্ব ভার্চুয়াল মেমরির স্থান পাওয়ার কারণে আপনি সরাসরি মেমরি অ্যাক্সেস করতে পারবেন না। তবে এক খুলুন এবং পারেন mmap, / dev / Mem প্রকৃত মেমরি থেকে সরাসরি প্রবেশাধিকার লাভ
টি

1

@ অ্যালেক্সচ্যাম্বারলিন এটি ওএস কাঠামোর কারণে। আপনি ছাড়া যেতে পারেন mmapতবে পেজিং ঘোষণা করা হয়েছে, সুতরাং সরাসরি অ্যাক্সেস নেই। কার্নেল মোডে আপনি ছাড়াও যেতে পারেন, mmapউদাহরণস্বরূপ, কোনও প্রয়োজন ছাড়াই আপনার ড্রাইভারটি কার্নেল মডিউল হিসাবে .োকানো mmap। এছাড়াও, সহজতম ওএস ক্ষেত্রে, যেখানে কোনও পৃষ্ঠা সারণী মেমরি ব্যবহার করা mmapহয় না আপনি কোনওটি ছাড়াই অ্যাক্সেস করতে পারবেন ie সরাসরি শারীরিক ঠিকানা অ্যাক্সেস।

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