Rumah  >  Artikel  >  Tutorial sistem  >  Perbincangan mendalam tentang teknologi pemacu Linux (4)_Prinsip pelaksanaan dan teknologi berkaitan teknologi pemberitahuan tak segerak

Perbincangan mendalam tentang teknologi pemacu Linux (4)_Prinsip pelaksanaan dan teknologi berkaitan teknologi pemberitahuan tak segerak

PHPz
PHPzke hadapan
2024-02-09 20:24:141004semak imbas

Dalam proses menulis pemacu Linux, teknologi pemberitahuan tak segerak ialah teknologi yang sangat penting. Ia boleh mencapai pemprosesan acara dan penghantaran data yang cekap, meningkatkan prestasi sistem dan kelajuan tindak balas. Dalam artikel ini, kami akan menyelidiki prinsip pelaksanaan dan teknologi berkaitan teknologi pemacu Linux (4) _teknologi pemberitahuan tak segerak.

Nama penuh pemberitahuan tak segerak ialah "IO tak segerak dipacu isyarat" Melalui kaedah "isyarat", apabila sumber yang dijangka diperoleh tersedia, pemandu akan secara aktif memberitahu aplikasi yang ditentukan, sepadan dengan "isyarat" bagi lapisan aplikasi, digunakan di sini Ia adalah isyarat "SIGIO". Langkahnya ialah

  1. Program lapisan aplikasi mendaftarkan dirinya sebagai proses yang menerima isyarat SIGIO daripada fail peranti
  2. Pemacu melaksanakan antara muka yang sepadan untuk mempunyai keupayaan untuk menghantar isyarat SIGIO kepada semua aplikasi yang didaftarkan untuk menerima isyarat SIGIO daripada pemacu peranti ini.
  3. Pemandu memanggil fungsi penghantaran di lokasi yang sesuai, dan aplikasi boleh menerima isyarat SIGIO.

Rangka kerja keseluruhan mekanisme:

深入探讨Linux驱动技术(四) _异步通知技术的实现原理和相关技术

Lapisan aplikasi menerima SIGIO

Seperti isyarat lain, lapisan aplikasi perlu mendaftarkan fungsi pemprosesan isyarat,
Cara mendaftar masih menggunakan signal() atau sigaction()

Selain itu, lapisan aplikasi juga perlu menambah sendiri pada senarai rantai pemberitahuan pemandu Kod yang ditambah adalah seperti berikut

fcntl(dev_fd,F_SETOWN,getpid());
int oflags = fcntl(dev_fd,F_GETFL);
fcntl(dev_fd,F_SETFL,oflags|FASYNC);
...
while(1);

Setelah selesai kerja di atas, program lapisan aplikasi boleh menunggu ketibaan SIGIO.

Pemandu hantar SIGIO

Selepas lapisan aplikasi didaftarkan, penghantaran terakhir bergantung pada kaedah pemprosesan pemacu peranti Untuk menjadikan peranti menyokong mekanisme pemberitahuan tak segerak, merujuk kepada antara muka lapisan aplikasi, pemandu melibatkan tiga tugas.

  1. Menyokong arahan F_SETOWN Anda boleh menetapkan filp->f_owner sebagai ID proses yang sepadan dalam arahan ini Sokong
  2. F_SETFL
  3. , apabila bendera FASYNC bertukar, **fasync() dalam pemandu akan dilaksanakan, jadi, fasync()** mesti dilaksanakan dalam pemandu. Apabila sumber peranti tersedia,
  4. hantar SIGIO melalui kill_fasync()
  5. Untuk melaksanakan tiga fungsi di atas dalam kernel, pemacu perlu menggunakan
1 struktur + 2 API

, strukturnya ialah struct fasync_struct, dan fungsinya ialah fasync_helper() dan kill_fasync()

struct fasync_struct {                                    
        spinlock_t              fa_lock;
        int                     magic;
        int                     fa_fd;
        struct fasync_struct    *fa_next; /* singly linked list */
        struct file             *fa_file;
        struct rcu_head         fa_rcu;
};
Fungsi

fasync_helper()

adalah untuk mendaftarkan objek fasync_struct ke dalam kernel Apabila lapisan aplikasi melaksanakan **fcntl(dev_fd, F_SETFL, oflags|FASYNC), ia akan memanggil semula fops pemandu. fasync(), jadi Biasanya letakkan fasync_helper() ke dalam pelaksanaan fasync()**.

/**
 *fasync_helper - 将一个fasync_struct对象注册进内核
 *@fd:文件描述符,由fasync传入
 *@filp:file指针,由fasync传入
 *@sig:信号类型,通常使用的就是SIGIO
 *@dev_fasync:事前准备的fasync_struct对象指针的指针
 */
int fasync_helper(int fd, struct file * filp, int sig, struct fasync_struct ** dev_fasync);   
API berikut adalah untuk melepaskan SIGIO dan meletakkannya di lokasi yang berbeza mengikut keperluan yang berbeza.

/**
 *kill_fasync - 释放一个信号
 *@dev_fasync:事前使用fasync_helper注册进内核的fasync_struct对象指针的指针
 *@filp:file指针,由fasync传入
 *@sig:信号类型,通常使用的就是SIGIO
 *@flag:标志,通常,如果资源可读用POLLIN,如果资源可写用POLLOUT
 */
void kill_fasync(struct fasync_struct **dev_fasync, int sig, int flag);

Templat Pemandu

Templat pemacu di bawah direka untuk menghantar isyarat kepada lapisan aplikasi apabila gangguan perkakasan tiba (sumber tersedia Dalam operasi sebenar, terdapat banyak situasi di mana sumber tersedia).
static struct fasync_struct *fasync = NULL;

static irqreturn_t handler(int irq, void *dev)
{
    kill_fasync(&fasync, SIGIO, POLLIN);
    return IRQ_HANDLED;
}
static int demo_fasync(int fd, struct file *filp, int mode)
{
    return fasync_helper(fd, filp, mode, &fasync);
}
struct file_operations fops = {
    ...
    .fasync = demo_fasync,
    ...
}
static int __init demo_init(void)
{
    ...
    request_irq(irq, handler, IRQF_TRIGGER_RISING, "demo", NULL);
    ...
}

总之,异步通知技术是Linux驱动程序编写过程中不可或缺的一部分。它可以实现高效的事件处理和数据传输,提高系统的性能和响应速度。希望本文能够帮助读者更好地理解Linux驱动技术(四) _异步通知技术的实现原理和相关技术。

Atas ialah kandungan terperinci Perbincangan mendalam tentang teknologi pemacu Linux (4)_Prinsip pelaksanaan dan teknologi berkaitan teknologi pemberitahuan tak segerak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:lxlinux.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam