驅動**:使用中斷線號1(x86體系中,該中斷線用於鍵盤)
chardev.c
#include#include#include#include#include#include#include#include#includestruct char_devmy_dev;
irqreturn_t my_interrupt(int irq, void *dev_id, struct pt_regs *regs)
static int char_open(struct inode *inode, struct file *file)else if(ret == -ebusy)
printk(kern_emerg"******open end*****\n");
return 0;
}static int __init chardev_init(void)
//add cdev to kernel
cdev_init(&my_dev.dev_cdev, &my_dev.dev_fops);
cdev_add (&my_dev.dev_cdev, my_dev.dev_number, 1);
printk(kern_emerg"############chardev_init end############\n");
return 0;
}static void __exit chardev_exit(void)
module_init(chardev_init);
module_exit(chardev_exit);
module_license("gpl");
makefile:
ifneq ($(kernelrelease),)
obj-m := chardev.o
else
pwd := $(shell pwd)
kver := $(shell uname -r)
kdir := /lib/modules/$(kver)/build
all:
$(make) -c $(kdir) m=$(pwd) modules
clean:
rm -fr .*.cmd *.o *.mod.c *.ko .tmp_versions modules.* module.*
endif
載入模組的指令碼:其中引數1是主編號,需要通過cat /proc/devices 獲取
#!/bin/sh
insmod chardev.ko
mknod /dev/chardev c $1 0
chmod 777 /dev/chardev
解除安裝模組指令碼
#!/bin/sh
rm -rf /dev/chardev
rmmod chardev.ko
測試**:test.c,執行測試程式後,每次按鍵都都會觸發中斷,列印出資訊,解除安裝模組後,取消列印
#include#include #includeint main(void)
else
}
Linux中斷和中斷處理
眾所周知,處理器的速度跟外圍的硬體裝置的速度往往不在乙個數量級上,因此,如果核心採取讓處理器傳送乙個請求,然後專門等待回應的辦法,顯然差強人意。既然硬體處理的這麼慢,那麼核心就應該在這期間去處理其他事務,等待硬體真正完成了請求的操作後,再回過頭來對它進行處理。輪詢 polling 可能會是一種解決辦...
Linux中斷處理
裝置管理過程中,中斷號的申請是乙個非常重要的操作。當裝置發出中斷之後,硬體裝置根據intel cpu的通用處理過程,跳轉到了該中斷號對應的中斷相應函式處。在linux作業系統中,必定要跳到do irq函式處。在do irq 函式中,進行了一部分公共的中斷響應處理之後,根據已經入棧了的中斷號查詢裝置中...
Linux學習 中斷和中斷處理
2 中斷處理程式 3 上半部和下半部的對比 處理器的速度和外圍裝置的速度相差太遠,為了解決讓核心不做過多的無用功 使用輪詢 這是就需要一種機制在硬體需要時再向核心發出訊號 中斷機制 中斷機制可以更好的協同處理器和外部裝置,並且提高機器的效能 中斷 指的是可以使得硬體得以發出通知給處理器,中斷可以隨時...