- گروه شماره ۲۵
- معین آعلی - ۴۰۱۱۰۵۵۶۱
- ثمین اکبری - ۴۰۱۱۰۵۵۹۴
یک برنامه مینویسیم به نام
interrupts.sh
و دستور زیر را در آن قرار میدهیم:
cat /proc/interruptsسپس به آن دسترسی اجرا میدهیم:
sudo chmod 777 interrupts.shو در نهایت اجرا میکنیم:
./interrupts.sh
نتیجه:
در لینوکس، برنامههای سطح کاربر نمیتوانند مستقیماً وقفه (Interrupt) تولید کنند. وقفهها توسط سختافزار یا کرنل مدیریت میشوند.
تنها راهی که یک برنامه سطح کاربر بتواند یک وقفه را تحریک کند، از طریق syscall است.
ابتدا این را به enum
داخل فایل
/include/linux/interrupt.h
اضافه میکنیم:
حال handler مربوط به آن را به فایل
kernel/softirq.c
اضافه میکنیم:
static void my_softirq_handler(struct softirq_action *a){
printk(KERN_INFO "My custom softirq\n");
}
void __init softirq_init(void)
{
int cpu;
for_each_possible_cpu(cpu) {
per_cpu(tasklet_vec, cpu).tail =
&per_cpu(tasklet_vec, cpu).head;
per_cpu(tasklet_hi_vec, cpu).tail =
&per_cpu(tasklet_hi_vec, cpu).head;
}
open_softirq(TASKLET_SOFTIRQ, tasklet_action);
open_softirq(HI_SOFTIRQ, tasklet_hi_action);
open_softirq(MY_SOFTIRQ, my_softirq_handler);
}حال در ادامه در همان فایل به لیست
softirq_to_name
وقفه جدید را اضافه میکنیم:
در نهایت کرنل را کامپایل و نصب و ریبوت میکنیم:
sudo make -j${nproc}
فرآیند کامپایل:
سپس:
sudo make modules_install
sudo make install
sudo update-grub
در نهایت سیستم را ریبوت میکنیم و مجدد اسکریپت آزمایش ۱ را اجرا میکنیم تا وقفه خود را ببینیم.
ما به دلیل اینکه دم ددلاین آزمایش رو زدیم دیگه فرصت نشد کامپایل کنیم. اما خب در نهایت خروجی چیزی شبیه زیر خواهد شد:




