লিনাক্স কার্নেল ভাগ করে নেওয়া আইআরকিউগুলি কীভাবে পরিচালনা করতে পারে?


14

আমি এখনও অবধি যা পড়েছি তার অনুসারে, "যখন কার্নেলটি একটি বাধা পায়, তখন সমস্ত নিবন্ধিত হ্যান্ডলারের অনুরোধ করা হয়।"

আমি বুঝতে পারি যে প্রতিটি আইআরকিউর জন্য নিবন্ধিত হ্যান্ডলারের মাধ্যমে দেখা যেতে পারে /proc/interrupts, এবং আমি আরও বুঝতে পারি যে নিবন্ধিত হ্যান্ডলারগুলি request_irqফর্মের একটি কলব্যাকটি পাস করার আহ্বান জানিয়েছে এমন ড্রাইভারদের কাছ থেকে এসেছে :

irqreturn_t (*handler)(int, void *)

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

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

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

হ্যান্ডলার কীভাবে সিদ্ধান্ত নিয়েছে যে বাধাদান এটির মাধ্যমে পরিচালনা করা উচিত তা হ'ল রহস্য।

সম্পাদনা: যদি এটি প্রাসঙ্গিক হয় তবে প্রশ্নে থাকা সিপিইউ আর্কিটেকচারটি x86


1
স্ট্যাকওভারফ্লো / প্রশ্ন
14371513/for-a-shared-interrupt-line-how-do-i-find- which-interrupt-handler-to-

উত্তর:


14

এই আচ্ছাদিত করা হয় 10 অধ্যায়ে এর লিনাক্স ডিভাইস ড্রাইভার , 3 য় সংস্করণ, Corbet এট দ্বারা। এটি অনলাইনে বিনামূল্যে পাওয়া যায় , অথবা আপনি মৃত গাছ বা ইবুক ফর্মগুলির জন্য কয়েকটি শেকল ও'রিলির উপায় টস করতে পারেন । আপনার প্রশ্নের সাথে সম্পর্কিত অংশটি প্রথম লিঙ্কের 278 পৃষ্ঠায় শুরু হয়।

এটির মূল্যের জন্য, আমি এই তিনটি পৃষ্ঠাটি প্যারাফ্রেস করার চেষ্টা করছি, এছাড়াও অন্যান্য বিটগুলিও গুগল করেছি:

  • যখন আপনি একটি ভাগ করা আইআরকিউ হ্যান্ডলার নিবন্ধভুক্ত করেন, কার্নেলটি যা তা পরীক্ষা করে:

    ক। বাধাদানের জন্য অন্য কোনও হ্যান্ডলার উপস্থিত নেই, বা

    খ। পূর্বে নিবন্ধভুক্ত সকলেই বাধা ভাগ করে নেওয়ার অনুরোধ করেছে

    যদি উভয় ক্ষেত্রেই প্রযোজ্য হয়, তবে এটি পরীক্ষা করে আপনার dev_idপ্যারামিটারটি অনন্য, যাতে কার্নেল একাধিক হ্যান্ডলারের পার্থক্য করতে পারে, যেমন হ্যান্ডলার অপসারণের সময়।

  • যখন একটি পিসিআই¹ হার্ডওয়্যার ডিভাইস আইআরকিউ লাইন উত্থাপন করে তখন কার্নেলের নিম্ন-স্তরের বাধা হ্যান্ডলারটি ডাকা হয় এবং এর ফলে আপনি নিবন্ধিত সমস্ত বাধা হ্যান্ডলারকে কল dev_idকরে, হ্যান্ডলারের মাধ্যমে আপনি যে নিবন্ধটি ব্যবহার করেছিলেন তার প্রতিটি পিছনে ফিরে যায় request_irq()

    dev_idমান মেশিন-অনন্য হতে হবে। এটি করার সাধারণ উপায় হ'ল structআপনার ড্রাইভার সেই ডিভাইসটি পরিচালনা করতে ব্যবহার করে প্রতি-ডিভাইসে কোনও পয়েন্টারটি পৌঁছে দেয় । যেহেতু এই পয়েন্টার আপনার ড্রাইভিং মেমরি স্পেস মধ্যে হতে হবে এটা ড্রাইভারে উপযোগী হতে করার জন্য, এটা কার্যত ipso যে driver.² অনন্য

    যদি কোনও প্রদত্ত বিঘ্নের জন্য একাধিক ড্রাইভার নিবন্ধিত থাকে, ডিভাইসগুলির মধ্যে যে কোনও একটি ভাগ করে নেওয়া বাধা লাইন উত্থাপিত করে তখন তাদের সমস্ত কল করা হবে । যদি এটি আপনার ড্রাইভারের ডিভাইস না করে তবে এটি আপনার ড্রাইভারের বিঘ্নিত হ্যান্ডলার এমন একটি মান পাস করবে যা এটির নয় doesn't আপনার ড্রাইভারের বিঘ্নিত হ্যান্ডলারটি যখন এটি ঘটে তখন তাৎক্ষণিকভাবে ফিরে আসতে হবে।dev_id

    অন্য কেসটি হ'ল আপনার ড্রাইভার একাধিক ডিভাইস পরিচালনা করছে। ড্রাইভারের বিঘ্নিত হ্যান্ডলার dev_idড্রাইভারকে জ্ঞাত মানগুলির মধ্যে একটি পাবে । আপনার কোডটি কোনটি বাধাগ্রস্থ করেছে তা নির্ধারণের জন্য প্রতিটি ডিভাইসকে পোল করার কথা to

    উদাহরণস্বরূপ Corbet ইত্যাদি। একটি পিসি সমান্তরাল পোর্ট যে দিতে। এটি যখন বাধা লাইনটি জোর দেয়, তখন এটি তার প্রথম ডিভাইস রেজিস্টারে শীর্ষ বিট সেট করে। (এটি inb(0x378) & 0x80 == trueস্ট্যান্ডার্ড আই / ও পোর্ট নম্বর গণনা করে।) আপনার হ্যান্ডলার যখন এটি সনাক্ত করে তখন এটির কাজটি করার কথা মনে করা হয়, তারপরে আই / ও পোর্ট থেকে পঠিত মানটি শীর্ষে দিয়ে বন্দরে ফিরে লিখে আইআরকিউ সাফ করুন বিট সাফ

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

  • আপনার বাধা হ্যান্ডলার যখন কার্নেলটিকে এটি বাধা হ্যান্ডেলটি বলে, এটি একই বাধাটির জন্য নিবন্ধিত অন্য কোনও হ্যান্ডলারকে কল করা থেকে কর্নেলটিকে থামিয়ে দেয় না। স্তর-ট্রিগারযুক্ত বিঘ্ন ব্যবহার করার সময় আপনি যদি বাধা লাইন ভাগ করতে চান তবে এটি অনিবার্য।

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

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


পাদটিকা:

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

  2. লিনাক্স কার্নেল ড্রাইভাররা সকলেই একই মেমরির স্থান ভাগ করে নেয় তবে কোনও সম্পর্কযুক্ত ড্রাইভার অন্যের মেমোরি স্পেসে ঘুরে বেড়াচ্ছে। যদি আপনি এই পয়েন্টারটি চারপাশে পাস না করেন তবে আপনি নিশ্চিত হয়ে উঠতে পারেন যে অন্য চালক দুর্ঘটনাক্রমে নিজেই সেই একই মানটি নিয়ে আসছেন না।


1
আপনি যেমনটি উল্লেখ করেছেন, বাধা হ্যান্ডলারটি dev_idতার নিজস্ব নয় এমনটি পাস হতে পারে । আমার কাছে মনে হয় এমন একটি শূন্য-সম্ভাবনা রয়েছে যে কোনও ড্রাইভারের dev_idকাঠামোর মালিকানা নেই তারপরেও কীভাবে বিষয়বস্তুর ব্যাখ্যা করে তার ভিত্তিতে এটি নিজের হিসাবে ভুল করতে পারে। যদি এটি না হয় তবে কী ব্যবস্থা এটি প্রতিরোধ করবে?
বিসিরং

আপনি dev_idআপনার ড্রাইভারের মেমরি স্পেসের মধ্যে কোনও কিছুর জন্য পয়েন্টার তৈরি করে এটি প্রতিরোধ করছেন । আরেকজন ড্রাইভারকে পারে একটি আপ করতে dev_idমান ঘটেছে মেমরির আপনার ড্রাইভার মালিক একটি পয়েন্টার সঙ্গে confusable হতে, কিন্তু যে ঘটতে কারণ সবাই বিধি দ্বারা বাজানো হয় যাচ্ছে না। এটি কার্নেল-স্পেস, মনে রাখবেন: স্ব-শৃঙ্খলা অবশ্যই ব্যবহারকারী-স্পেস কোডের সাথে ভিন্ন হিসাবে বিবেচনা করা হয়, যা নির্লিপ্তভাবে ধরে নিতে পারে যে নিষিদ্ধ নয় এমন কোনও কিছু অনুমোদিত নয় allowed
ওয়ারেন ইয়ং

এলডিডি 3 এর দশম অধ্যায়ে: "যখনই দুই বা ততোধিক ড্রাইভার একটি বিঘ্নিত লাইন ভাগ করে নিচ্ছে এবং হার্ডওয়্যার সেই লাইনে প্রসেসরের বাধা দেয়, কার্নেল সেই বিঘ্নের জন্য নিবন্ধিত প্রতিটি হ্যান্ডলারকে অনুরোধ করে, প্রতিটি তার নিজস্ব ডি_আইডি করে" এটি আগের বোঝার মতো বলে মনে হয় কোনও বাধাপ্রাপ্ত হ্যান্ডলার এমনটির মধ্যে পাস হতে পারে কিনা সে সম্পর্কে ভুল ছিল dev_id
বিসিরং

এটি আমার পক্ষ থেকে একটি ভুল পাঠ্য ছিল। আমি যখন এটি লিখেছিলাম, আমি দুটি ধারণাকে বিভ্রান্ত করছি। আমি আমার উত্তর সম্পাদনা করেছি। আপনার বাধা হ্যান্ডলারটি দ্রুত ফিরে আসার জন্য যে শর্তটি প্রয়োজন তা হ'ল এটি পরিচালনা করছে না এমন কোনও ডিভাইস দ্বারা বাধা দেওয়া দৃ as়তার কারণে এটি কল হয়ে যায়। মানটি dev_idএটি ঘটেছে কিনা তা নির্ধারণ করতে আপনাকে সহায়তা করে না। আপনাকে হার্ডওয়ারটি জিজ্ঞাসা করতে হবে, "আপনি বাজে?"
ওয়ারেন ইয়ং

হ্যাঁ, এখন আমার কীভাবে সংলাপ করছি তা অন্য কারেন্টের দ্বারা কার্নেলটি পুনরায় চালু করার পরে তাদের ডিভাইসগুলিকে "বেজে উঠেছে" বিশ্বাস করতে বাধ্য করছে তা এখনই বুঝতে হবে kexec
বিসিরাং

4

যখন ড্রাইভার একটি ভাগ করা আইআরকিউ অনুরোধ করে, এটি ড্রাইভারের মেমরি স্পেসের মধ্যে কোনও ডিভাইস নির্দিষ্ট কাঠামোর রেফারেন্সের জন্য কার্নেলের কাছে একটি পয়েন্টার দেয় passes

এলডিডি 3 অনুসারে:

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

বেশ কয়েকটি ড্রাইভারের আইআরকিউ হ্যান্ডলার চেক করার পরে, এটি প্রদর্শিত হয় যে এটি বাধা হ্যান্ডেল করতে হবে বা ফিরে আসবে কিনা তা নির্ধারণ করার জন্য তারা হার্ডওয়্যারটি নিজেই তদন্ত করে IRQ_NONE

উদাহরণ

ইউএইচসিআই-এইচসিডি ড্রাইভার
  status = inw(uhci->io_addr + USBSTS);
  if (!(status & ~USBSTS_HCH))  /* shared interrupt, not mine */
    return IRQ_NONE;

উপরের কোডে ড্রাইভারটি USBSTSপরিষেবাতে কোনও বাধা আছে কিনা তা নির্ধারণ করতে নিবন্ধটি পড়ছেন ।

এসডিএইচসিআই ড্রাইভার
  intmask = sdhci_readl(host, SDHCI_INT_STATUS);

  if (!intmask || intmask == 0xffffffff) {
    result = IRQ_NONE;
    goto out;
  }

পূর্ববর্তী উদাহরণের মতোই, ড্রাইভার স্ট্যাটাস রেজিস্টারটি পরীক্ষা করে SDHCI_INT_STATUSদেখছে, এটির জন্য কোনও বিঘ্নিত পরিষেবা দেওয়া দরকার কিনা তা নির্ধারণ করতে।

অ্যাথ 5 কে ড্রাইভার
  struct ath5k_softc *sc = dev_id;
  struct ath5k_hw *ah = sc->ah;
  enum ath5k_int status;
  unsigned int counter = 1000;

  if (unlikely(test_bit(ATH_STAT_INVALID, sc->status) ||
        !ath5k_hw_is_intr_pending(ah)))
    return IRQ_NONE;

আরও একটি উদাহরণ।


0

দয়া করে এই লিঙ্কটি দেখুন দেখুন :

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


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