Rumah > Tutorial sistem > LINUX > teks badan

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

PHPz
Lepaskan: 2024-02-09 20:24:14
ke hadapan
1003 orang telah melayarinya

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);
Salin selepas log masuk

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;
};
Salin selepas log masuk
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);   
Salin selepas log masuk
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);
Salin selepas log masuk

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);
    ...
}
Salin selepas log masuk

总之,异步通知技术是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!

sumber:lxlinux.net
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!