做linux核心驅動,最重要的一種裝置驅動就是字元裝置驅動,也是最基本的最需要徹底掌握的。
字元裝置幾個重要的結構體和介面函式:
字元裝置結構體
struct cdev
初始化字元裝置
cdev_init(struct cdev*,struct file_operations*);
註冊或者說新增乙個字元裝置到核心
cdev_add(struct cdev*,int,int);
刪除某個字元裝置
cdev_del(struct cdev*);
我們可以自己定義乙個字元裝置結構體,在這個結構體中包含struct cdev。事實上很多其他的驅動裝置,也是這樣做的,比方i2c裝置、usb裝置等。
第一步、
初始化cdev_init這個cdev,這樣就可以將cdev和file_operations結構體繫結在一起,使用者空間才能夠通過read、write等函式來操作這個cdev裝置。
第二步、
註冊這個cdev到核心中,使用cdev_add介面。這樣乙個簡易的cdev字元算是存在於核心中了。
解除安裝這人cdev可以通過cdev_del介面函式來做,一般在__exit函式中呼叫。
這裡來實現乙個簡單的秒字元裝置。
1. second_dev.c
#include #include #include #include #include #include #include #include #include #include #include #include #define second_major 255
static struct class *firstdrv_class;//auto create a device node need a class
static int second_major = second_major;// major 255
//struct second device, contians struct cdev
struct second_dev ;
struct second_dev *second_devp;//a pointer of struct device
//timer handle func
static void second_timer_handle(unsigned long arg)
int second_open(struct inode *inode,struct file *filp)//open
//close file
int second_release(struct inode *inode,struct file *filp)
static ssize_t second_read(struct file *filp,char __user *buf,size_t count,loff_t *ppos)
static ssize_t second_write(struct file* filp,const char __user * buf, size_t count, loff_t* ppos)
static const struct file_operations second_fops = ;
//init cdev
static void second_setup_cdev(struct second_dev *dev,int index)
int __init second_init(void)
if(ret < 0)
return ret;
firstdrv_class = class_create(this_module, "second_major");//create the firstdrv class --> /sys/class/second_major
device_create(firstdrv_class,null,devno,null,"second");//auto create device node /dev/led
second_devp = kmalloc(sizeof(struct second_dev),gfp_kernel);
if(!second_devp)
memset(second_devp,0,sizeof(struct second_dev));
second_setup_cdev(second_devp,0);
return 0;
fail_malloc:
unregister_chrdev_region(devno, 1);
return ret;
}void __exit second_exit(void)
module_license("gpl");
module_init(second_init);
module_exit(second_exit);
2. makefile
#
# made from makefile.org by [email protected]
#obj-m += second-device.o
second-device-y := second-dev.o
3. make.sh
#/bin/sh
ver=`uname -r`
config_usbip_core=m \
config_usbip_vhci_hcd=m \
config_usbip_host=m \
make -c /lib/modules/$ver/build m=$pwd "$@"
直接執行make.sh就這可編譯出乙個ko檔案second-device.ko,然後insmod到核心中,這樣乙個秒字元裝置就做好了。
編寫乙個測試demo,看看效果如何。
second-dev-test.c
#include #include #include #include #include int main()
}} else
}
編譯然後執行一下。
成功。
如何寫乙個Stack?
1.棧是陣列 2.先進後出 3.出棧 4.入棧 手寫乙個雙向鍊錶 棧 public class stackpopandpush public stackpopandpush int lens 返回元素個數 public intsize 返回陣列長度,容量,棧資料長 private intcapaci...
如何寫乙個鍊錶
有的時候,處於記憶體中的資料並不是連續的。那麼這時候,我們就需要在 資料結構中新增乙個屬性,這個屬性會記錄下面乙個資料的位址。有了這個位址之後,所有的資料就像一條鍊子一樣串起來了,那麼這個位址屬性就起到了穿線鏈結的作用。相比較普通的線性結構,鍊錶結構的優勢是什麼呢?我們可以總結一下 1 單個節點建立...
如何寫乙個Vue元件
寫的是以.vue結尾的單檔案元件的寫法,是基於webpack構建的專案。template 模板 js 邏輯 css 樣式 每個元件都有屬於自己的模板,js和樣式。如果將乙個頁面比喻成一間房子的話,元件就是房子裡的客廳 臥室 廚房 廁所。如果把廚房單獨拿出來的話,元件又可以是刀 油煙機.等等。就是說頁...