Fungsi gangguan lembut dan baris gilir kerja dalam Linux adalah untuk melaksanakan pemprosesan gangguan. Gangguan lembut dan baris gilir kerja ialah mekanisme pelaksanaan separuh bawah bagi mekanisme gangguan atas dan bawah. Gangguan lembut tidak boleh tidur, menyekat atau bertukar antara proses, dan hanya boleh diganggu oleh gangguan perkakasan manakala baris gilir kerja boleh tidur atau disekat, dan boleh bertukar antara proses yang berbeza untuk menyelesaikan tugasan yang berbeza.
Persekitaran pengendalian tutorial ini: sistem linux5.9.8, komputer Dell G3.
Fungsi gangguan lembut dan baris gilir kerja dalam Linux adalah untuk melaksanakan pemprosesan gangguan.
Sampukan merujuk kepada gangguan semasa operasi biasa CPU disebabkan oleh peristiwa dalaman atau luaran atau oleh a program Acara yang dipraatur menyebabkan CPU menghentikan sementara program yang sedang berjalan dan beralih kepada program yang menyediakan acara dalaman atau luaran atau acara yang diprasusun Selepas perkhidmatan selesai, ia kembali untuk meneruskan sementara program tergendala. Linux biasanya dibahagikan kepada gangguan luaran (juga dipanggil gangguan perkakasan) dan gangguan dalaman (juga dipanggil pengecualian).
Dalam mod alamat sebenar, CPU menggunakan ruang 1KB bermula dari 0 dalam memori sebagai jadual vektor gangguan. Setiap entri dalam jadual menduduki 4 bait. Walau bagaimanapun, dalam mod dilindungi, jadual vektor sampukan yang terdiri daripada entri 4-bait ini tidak memenuhi keperluan sebenar Oleh itu, berdasarkan maklumat yang mencerminkan suis mod dan offset, entri jadual vektor sampukan dibuat daripada 8 bait jadual vektor sampukan juga dipanggil jadual deskriptor sampukan (IDT). Daftar (IDTR) yang digunakan untuk menerangkan jadual deskriptor sampukan ditambah pada CPU untuk menyimpan alamat permulaan jadual deskriptor sampukan.
2.1 Nombor gangguan sistem
Ia boleh dilihat dari definisi sampukan di atas, sebanyak 256 entri vektor sampukan boleh disimpan dalam jadual vektor sampukan sistem, , iaitu 256 deskriptor sampukan (bersamaan dengan 256 vektor sampukan) yang terkandung dalam IDT.
Vektor sampukan 0-31 dikhaskan oleh Intel untuk mengendalikan kejadian luar biasa dan tidak boleh digunakan untuk tujuan lain. Untuk vektor gangguan No. 0-31, sistem pengendalian hanya perlu menyediakan pengendali pengecualian Apabila pengecualian berlaku, pemproses akan secara automatik memindahkan kawalan ke kemasukan pengendali yang sepadan dan sebenarnya, untuk 32 ini vektor sampukan yang mengendalikan pengecualian, versi 2.6 Linux hanya menyediakan pengendali untuk vektor sampukan No. 0-17 Untuk pengendali yang sepadan, sila rujuk jadual berikut, vektor sampukan dan jadual surat-menyurat acara pengecualian kata lain, vektor sampukan No. 17-31 adalah kosong dan tidak digunakan.
中断向量号 | 异常事件 | Linux的处理程序 |
0 | 除法错误 | pide_error |
1 | 调试异常 | Debug |
2 | NMI中断 | Nmi |
3 | 单字节,int 3 | Int3 |
4 | 溢出 | Overflow |
5 | 边界监测中断 | Bounds |
6 | 无效操作码 | Invalid_op |
7 | 设备不可用 | Device_not_available |
8 | 双重故障 | Double_fault |
9 | 协处理器段溢出 | Coprocessor_segment_overrun |
10 | 无效TSS | Incalid_tss |
11 | 缺段中断 | Segment_not_present |
12 | 堆栈异常 | Stack_segment |
13 | 一般保护异常 | General_protection |
14 | 页异常 | Page_fault |
15 | (intel保留) | Spurious_interrupt_bug |
16 | 协处理器出错 | Coprocessor_error |
17 | 对齐检查中断 | Alignment_check |
Vektor sampukan 0-31 telah ditempah, menjadikan sejumlah 224 vektor sampukan 32-255 tersedia. Bagaimanakah 224 vektor gangguan ini diperuntukkan? Dalam versi 2.6 Linux, kecuali 0x80 (SYSCALL_VECTOR) yang digunakan sebagai pintu masuk utama panggilan sistem , yang lain digunakan untuk sumber gangguan perkakasan luaran , termasuk 15 irq pengawal gangguan boleh atur cara 8259A sebenarnya, apabila CONFIG_X86_IO_APIC tidak ditakrifkan, 223 lagi (kecuali 0x80) vektor gangguan hanya menggunakan 15 bermula dari 32, dan 208 yang lain dibiarkan kosong.
2.2 Permintaan gangguan
2.2.1 Permintaan gangguan Gambaran Keseluruhan
Apabila peranti luaran memerlukan sistem pengendalian untuk melakukan perkara yang berkaitan, ia akan menghasilkan gangguan yang sepadan.
Peranti menghantar tahap tinggi kepada pengawal sampukan melalui talian sampukan yang sepadan untuk menjana isyarat sampukan, dan sistem pengendalian akan memperoleh talian sampukan itu daripada bit status pengawal sampukan sampukan yang dihasilkan. Dan hanya apabila peranti mempunyai kawalan ke atas talian gangguan tertentu, ia boleh menghantar isyarat kepada talian gangguan ini. Juga kerana semakin banyak peranti pada masa kini, talian interupsi merupakan sumber yang sangat berharga dan tidak boleh dipetakan satu sama lain. Oleh itu, sebelum menggunakan talian sampukan, anda mesti memohon talian sampukan yang sepadan. Tidak kira sama ada kaedah sampukan kongsi atau sampukan eksklusif digunakan, proses permohonan adalah untuk mengimbas terlebih dahulu semua talian sampukan untuk mengetahui yang mana satu tidak diduduki oleh orang lain, dan pilih salah satu daripadanya sebagai IRQ peranti. Kedua, memohon IRQ yang sepadan melalui fungsi aplikasi gangguan. Akhir sekali, semak sama ada gangguan boleh dilaksanakan berdasarkan hasil aplikasi.
2.2.2 Mengganggu struktur berkaitan
Teras memproses data semasa gangguan Strukturnya ialah irq_desc, yang menerangkan sepenuhnya baris gangguan Kod sumber dalam Linux 2.6.22.6 adalah seperti berikut.
irq_desc ditakrifkan dalam include/linux/irq.h
/** * struct irq_desc - interrupt descriptor * * @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()] * @chip: low level interrupt hardware access * @msi_desc: MSI descriptor * @handler_data: per-IRQ data for the irq_chip methods * @chip_data: platform-specific per-chip private data for the chip * methods, to allow shared chip implementations * @action: the irq action chain * @status: status information * @depth: disable-depth, for nested irq_disable() calls * @wake_depth: enable depth, for multiple set_irq_wake() callers * @irq_count: stats field to detect stalled irqs * @irqs_unhandled: stats field for spurious unhandled interrupts * @lock: locking for SMP * @affinity: IRQ affinity on SMP * @cpu: cpu index useful for balancing * @pending_mask: pending rebalanced interrupts * @dir: /proc/irq/ procfs entry * @affinity_entry: /proc/irq/smp_affinity procfs entry on SMP * @name: flow handler name for /proc/interrupts output */struct irq_desc { irq_flow_handler_t handle_irq; struct irq_chip *chip; struct msi_desc *msi_desc; void *handler_data; void *chip_data; struct irqaction *action; /* IRQ action list */ unsigned int status; /* IRQ status */ unsigned int depth; /* nested irq disables */ unsigned int wake_depth; /* nested wake enables */ unsigned int irq_count; /* For detecting broken IRQs */ unsigned int irqs_unhandled; spinlock_t lock; #ifdef CONFIG_SMP cpumask_t affinity; unsigned int cpu;#endif#if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE) cpumask_t pending_mask;#endif#ifdef CONFIG_PROC_FS struct proc_dir_entry *dir;#endif const char *name; } ____cacheline_internodealigned_in_smp;
irq_desc
Beberapa struktur berkaitan adalah seperti berikut:
Struktur tindakan sampukan yang ditakrifkan dalam include/linux/interrupt.h: struct irqaction
struct irqaction { irq_handler_t handler; unsigned long flags; cpumask_t mask; const char *name; void *dev_id; struct irqaction *next; int irq; struct proc_dir_entry *dir; };
Ditakrifkan dalam include/linux: koleksi fungsi pemprosesan berkaitan cip irq_chip
/** * struct irq_chip - hardware interrupt chip descriptor * * @name: name for /proc/interrupts * @startup: start up the interrupt (defaults to ->enable if NULL) * @shutdown: shut down the interrupt (defaults to ->disable if NULL) * @enable: enable the interrupt (defaults to chip->unmask if NULL) * @disable: disable the interrupt (defaults to chip->mask if NULL) * @ack: start of a new interrupt * @mask: mask an interrupt source * @mask_ack: ack and mask an interrupt source * @unmask: unmask an interrupt source * @eoi: end of interrupt - chip level * @end: end of interrupt - flow level * @set_affinity: set the CPU affinity on SMP machines * @retrigger: resend an IRQ to the CPU * @set_type: set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ * @set_wake: enable/disable power-management wake-on of an IRQ * * @release: release function solely used by UML * @typename: obsoleted by name, kept as migration helper */struct irq_chip { const char *name; unsigned int (*startup)(unsigned int irq); //中断开始 void (*shutdown)(unsigned int irq); //中断关闭 void (*enable)(unsigned int irq); //中断使能 void (*disable)(unsigned int irq); //中断禁用 void (*ack)(unsigned int irq); void (*mask)(unsigned int irq); void (*mask_ack)(unsigned int irq); void (*unmask)(unsigned int irq); void (*eoi)(unsigned int irq); void (*end)(unsigned int irq); void (*set_affinity)(unsigned int irq, cpumask_t dest); int (*retrigger)(unsigned int irq); int (*set_type)(unsigned int irq, unsigned int flow_type); int (*set_wake)(unsigned int irq, unsigned int on); /* Currently used only by UML, might disappear one day.*/#ifdef CONFIG_IRQ_RELEASE_METHOD void (*release)(unsigned int irq, void *dev_id);#endif /* * For compatibility, ->typename is copied into ->name. * Will disappear. */ const char *typename; };
2.2.3 Pelaksanaan permintaan gangguan
Kami menjangkakan untuk membuat pengendali gangguan berjalan pantas dan mahu ia menyelesaikan banyak kerja Ini Kedua-dua matlamat menyekat satu sama lain, bagaimana untuk menyelesaikannya ——mekanisme bahagian atas dan bawah.
Kami memotong pengendali gangguan kepada separuh. Pengendali gangguan ialah bahagian atas - menerima gangguan , dan ia memulakan pelaksanaan serta-merta, tetapi ia hanya boleh melakukan kerja dengan had masa yang ketat. Kerja yang boleh dibenarkan untuk disiapkan kemudian akan ditangguhkan ke separuh masa kedua, dan kemudian, pada masa yang sesuai, separuh kedua akan dilaksanakan oleh terminal. Separuh masa pertama adalah mudah dan pantas, melumpuhkan beberapa atau semua gangguan semasa pelaksanaan .
Separuh masa kedua akan dilaksanakan kemudian, dan semua gangguan boleh dijawab semasa pelaksanaan. Reka bentuk ini boleh menjadikan sistem dalam keadaan perisai gangguan sesingkat mungkin, sekali gus meningkatkan tindak balas sistem. Separuh bahagian atas hanya mempunyai mekanisme pengendali gangguan, manakala separuh bawah mempunyai pelaksanaan gangguan lembut, pelaksanaan tasklet dan pelaksanaan baris gilir kerja.
Kami menggunakan kad rangkaian untuk menerangkan dua bahagian. Apabila kad rangkaian menerima paket data, ia memberitahu kernel dan mencetuskan gangguan Separuh pertama yang dipanggil adalah untuk membaca paket data ke dalam memori tepat pada masanya untuk mengelakkan kehilangan akibat kelewatan. Selepas membaca memori, pemprosesan data ini tidak lagi mendesak Pada masa ini, kernel boleh melaksanakan program yang dijalankan sebelum gangguan, dan pemprosesan paket data rangkaian dibiarkan kepada bahagian bawah.
1) Jika sesuatu tugasan sangat sensitif terhadap masa, letakkannya di dalam pengendali sampukan Laksanakan; 2) Jika tugasan berkaitan dengan perkakasan, letakkan ia dalam pengendali gangguan untuk pelaksanaan; Tugasan mesti memastikan bahawa ia tidak diganggu oleh gangguan lain dan dilaksanakan dalam pengendali gangguan; separuh bawah untuk pelaksanaan. Gangguan lembut mekanisme pelaksanaan separuh bawah (share memory processor) wujud, dan ia juga menjadi asas kepada pelaksanaan tasklet ( , kadangkala termasuk tasklet (pembaca diminta membuat kesimpulan sama ada ia mengandungi berdasarkan konteks apabila menghadapinya) 🎜>tasklet). Ia muncul kerana ia perlu memenuhi perbezaan antara bahagian atas dan bahagian bawah yang dicadangkan di atas, supaya tugasan yang tidak sensitif masa boleh ditangguhkan. 🎜>CPU menjadikan kecekapan sistem keseluruhan lebih tinggi. Ciri-cirinya termasuk: a) tidak boleh dilaksanakan serta-merta selepas ia dijana, dan mesti menunggu penjadualan kernel sebelum pelaksanaan. Gangguan lembut tidak boleh diganggu dengan sendirinya, tetapi hanya boleh diganggu oleh gangguan perkakasan (bahagian atas). b) boleh dijalankan serentak pada berbilang CPU (walaupun jenis yang sama). Oleh itu, gangguan lembut mesti direka bentuk sebagai fungsi masuk semula (membolehkan berbilang CPU beroperasi serentak), jadi kunci putaran juga perlu digunakan untuk melindungi struktur datanya.
Tasklet untuk mekanisme pelaksanaan separuh bawah Tasklet dilaksanakan melalui gangguan lembut, jadi ia sendiri juga merupakan gangguan lembut. Untuk meningkatkan bilangan pemprosesan gangguan dan meningkatkan kecekapan pemprosesan, mekanisme tasklet telah dicipta. Tasklet mengamalkan mekanisme baris gilir yang tidak dibezakan dan dilaksanakan hanya apabila terdapat gangguan, menghapuskan kesakitan carian jadual kitaran. TaskletSebagai mekanisme baharu, ia jelas boleh membawa lebih banyak kelebihan. Pada masa ini, SMP semakin popular, jadi mekanisme SMP telah ditambahkan pada tasklet untuk memastikan gangguan yang sama hanya boleh diproses oleh satu cpu Jalankan pada . Dalam era gangguan lembut, jelas tiada pertimbangan sedemikian. Oleh itu, gangguan lembut yang sama boleh dilaksanakan pada dua cpu pada masa yang sama, yang mungkin menyebabkan konflik. Ringkaskan kelebihan tasklet: (1) Tiada had pada bilangan jenis; > (2) Kecekapan tinggi, tidak perlu membuat carian jadual (3) menyokong mekanisme SMP Ciri-cirinya ialah seperti berikut: 1) Jenis khusus tasklet hanya boleh dijalankan pada satu CPU dan tidak boleh dilaksanakan secara selari, tetapi hanya boleh dilaksanakan secara bersiri. 2) Pelbagai jenis tasklet boleh dijalankan secara selari pada berbilang CPU dihidupkan. 3) Gangguan lembut diperuntukkan secara statik dan tidak boleh ditukar selepas kernel disusun. Tetapi tasklet jauh lebih fleksibel dan boleh ditukar semasa masa jalan (seperti semasa menambah modul). Fungsi tertunda yang kami perkenalkan di atas berjalan dalam konteks gangguan (satu pusat pemeriksaan gangguan lembut ialah apabila do_IRQ keluar), yang membawa kepada beberapa masalah: gangguan lembut tidak boleh tidur atau menyekat. Memandangkan konteks sampukan berada dalam keadaan kernel dan tiada proses pensuisan, jika sampukan lembut diletakkan atau disekat, ia tidak akan dapat keluar dari keadaan ini, menyebabkan keseluruhan kernel menjadi beku. Walau bagaimanapun, fungsi menyekat tidak boleh dilaksanakan dalam konteks gangguan dan mesti dijalankan dalam konteks proses, seperti fungsi yang mengakses blok data cakera. Oleh itu, fungsi menyekat tidak boleh dilaksanakan menggunakan softirqs. Tetapi mereka selalunya mempunyai sifat tertunda. Fungsi tertunda yang kami perkenalkan di atas dijalankan dalam konteks gangguan, yang menyebabkan beberapa masalah, menunjukkan bahawa ia tidak boleh digantung, yang bermaksud gangguan lembut tidak boleh tidur , tidak boleh menyekat. Sebabnya ialah konteks gangguan berada dalam keadaan kernel dan tiada penukaran proses Oleh itu, apabila gangguan lembut tidur atau disekat, ia tidak akan dapat keluar dari keadaan ini, menyebabkan keseluruhan kernel menjadi beku. Oleh itu, fungsi menyekat tidak boleh dilaksanakan menggunakan softirqs. Tetapi mereka selalunya mempunyai sifat tertunda. Dan oleh kerana ia dilaksanakan secara bersiri, selagi satu masa pemprosesan adalah panjang, ia akan menyebabkan kelewatan dalam tindak balas gangguan lain. Untuk menyelesaikan tugas yang mustahil ini, baris gilir kerja muncul, yang boleh bertukar antara proses yang berbeza untuk menyelesaikan tugas yang berbeza. Jika tugas yang ditangguhkan memerlukan tidur, kemudian pilih baris gilir kerja Jika tidur tidak diperlukan, kemudian pilih gangguan lembut atau tasklet. Baris gilir kerja boleh dijalankan dalam konteks proses dan mewakilkan kerja kepada utas kernel. Ringkasnya, baris gilir kerja ialah sekumpulan benang kernel, digunakan sebagai benang daemon sampukan. Berbilang sampukan boleh diletakkan dalam satu utas, atau setiap sampukan boleh diberikan satu utas. Kami menggunakan struktur workqueue_struct untuk mewakili benang pekerja, yang dilaksanakan menggunakan benang kernel. Cara urutan pekerja melaksanakan kerja tertunda —— mempunyai senarai terpaut sedemikian, yang terdiri daripada struktur work_struct dan ini work_struct menerangkan A job, setelah kerja dilaksanakan, objek work_struct yang sepadan dialih keluar daripada senarai terpaut Apabila tiada lagi objek pada senarai terpaut, utas pekerja akan terus tidur. Oleh kerana baris gilir kerja adalah utas, kita boleh menggunakan semua kaedah yang boleh digunakan dalam utas. Peranan gangguan lembut dan baris gilir kerja dalam Linux adalah untuk melaksanakan pemprosesan gangguan; mekanisme gangguan atas dan bawah Bahagian bawah mekanisme pelaksanaan. 1.gangguan lembut secara amnya ialah nama umum "Fungsi tertunda" . , ia berada dalam konteks gangguan dan tidak boleh bertukar antara proses tidak boleh diganggu dengan sendirinya, tetapi hanya boleh diganggu oleh gangguan perkakasan (bahagian atas) ia boleh dijalankan serentak pada berbilang CPU. Oleh itu, gangguan lembut mesti direka bentuk sebagai fungsi masuk semula, jadi kunci putaran juga diperlukan untuk melindungi struktur datanya. 2.Fungsi dalam baris gilir kerja adalah dalam konteks proses, ia Ia boleh tidur atau disekat, dan boleh bertukar antara proses yang berbeza untuk menyelesaikan tugasan yang berbeza. Baik fungsi tertunda mahupun baris gilir kerja tidak boleh mengakses ruang proses pengguna Fungsi tertunda tidak boleh mempunyai sebarang proses yang sedang dijalankan semasa menjalankan fungsi sementara proses kernel sedang dilaksanakan, ia tidak boleh mengakses alamat ruang pengguna. Cadangan berkaitan: "Tutorial Video Linux" is sebenarnya hanya gangguan perisian Mekanisme tertentu telah ditambah berdasarkan ini). Softirq secara amnya ialah istilah umum untuk "Fungsi tertunda
"32.
Separuh bawah mekanisme pelaksanaan ialah baris gilir kerja (baris kerja)
Apakah peranan gangguan lembut dan baris gilir kerja dalam Linux
Atas ialah kandungan terperinci Apakah peranan linux softirqs dan baris gilir kerja. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!