Энциклопедия разработчика модулей ядра Linux | страница 40



>  * file's inode, to enable us to play with

>  * permissions, ownership, etc. */

>};


>/* Initialize the module - register the proc file */

>int init_module() {

> /* Put the task in the tq_timer task queue, so it

> * will be executed at next timer interrupt */

> queue_task(&Task, &tq_timer);

> /* Success if proc_register_dynamic is a success,

> * failure otherwise */

>#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0)

> return proc_register(&proc_root, &Our_Proc_File);

>#else

> return proc_register_dynamic(&proc_root, &Our_Proc_File);

>#endif

>}


>/* Cleanup */

>void cleanup_module() {

> /* Unregister our /proc file */

> proc_unregister(&proc_root, Our_Proc_File.low_ino);

> /* Sleep until intrpt_routine is called one last

> * time. This is necessary, because otherwise we'll

> * deallocate the memory holding intrpt_routine and

> * Task while tq_timer still references them.

> * Notice that here we don't allow signals to

> * interrupt us.

> *

> * Since WaitQ is now not NULL, this automatically

> * tells the interrupt routine it's time to die. */

> sleep_on(&WaitQ);

>}

Обработчики прерываний

Везде, кроме последней главы, все, что мы пока делали в ядре, сводилось к запросам и ответам разным процессам или работали со специальными файлом, посылали ioctl или выдавали системный вызов. Но работа ядра не должна сводится только к обработке запросы. Другая задача, которая является очень важной, сводится к работе с аппаратными средствами, связанными с машиной.

Имеются два типа взаимодействия между CPU и остальной частью аппаратных средств компьютера. Первый тип, когда CPU дает команды аппаратным средствам, другой, когда аппаратные средства должны сообщить что-то CPU. Второй, названный прерываниями, является намного более тяжелым в работе, потому что с ним нужно иметь дело когда удобно аппаратным средствам, а не CPU. Аппаратные устройства обычно имеют очень маленькое количество ОЗУ, и если Вы не читаете их информацию сразу, она теряется.

Под Linux аппаратные прерывания названы IRQ (сокращение от Interrupt Requests)[12]. Имеется два типа IRQ: короткий и длинный. Короткий IRQ тот, который займет очень короткий период времени, в течение которого остальная часть машины будет блокирована, и никакие другие прерывания не будут обработаны. Длинный IRQ тот, который может занять более длительное время, в течение которого другие прерывания могут происходить (но не прерывания из того жесамого устройства). Если возможно, лучше объявить, что программа обработки прерывания будет длинной.