Linux設備驅動筆記:基礎雜記

設備和模塊的分類

    設備分爲3種基本類型,字符設備,塊設備及網絡設備,對應的模塊及字符模塊,塊模塊,網絡模塊。

  • 字符設備:串口,鍵盤等。用"c"標識。
  • 塊設備:硬盤。用“b"標識。
  • 網絡設備:網卡。

設備號

    Linux中的每個設備都有唯一的設備號,設備號由主設備號和次設備號組成。主設備號一般代表一類設備,次設備號則代表具體的設備。
    內核中用dev_t表示一個設備號,設備號可以手動申請,也可以動態申請。下面是常用的幾個相關的宏。

#define MAJOR(dev)	((unsigned int) ((dev) >> MINORBITS)) //根據設備號獲取主設備號
#define MINOR(dev)	((unsigned int) ((dev) & MINORMASK))  //獲取次設備號
#define MKDEV(ma,mi)	(((ma) << MINORBITS) | (mi))          //根據指定的主設備和次設備號生成設備號

通過ls -l 可以查看設備號及類型,第一項的’c’代表是字符設備,第5,6表示主設備號和次設備號。由於不是磁盤中真實的文件,都是系統啓動過程中加載的,這些文件的大小都是0。
在這裏插入圖片描述
 

創建設備文件

命令如下:
Usage: mknod [OPTION]… NAME TYPE [MAJOR MINOR]
TYPE may be:

b create a block (buffered) special file
c, u create a character (unbuffered) special file
p create a FIFO

例如:mknod /dev/test c 100 1
 
 

加載模塊和卸載模塊

通過insmod可將模塊test加載入內核中,也可以通過modprobe,不同之處是modprobe加載自動需要依賴的模塊。

$ insmod test.ko

卸載模塊

$ rmmod test

查看已經加載的模塊

$ lsmod

 
 

申請動態內存的幾種方式:kmalloc、kzalloc、vmalloc

void *kmalloc(size_t size, gfp_t flags);
kmalloc申請出來的內存未進行置0,內存在物理內存上是連續的。flags爲標誌(常爲GFP_KERNEL)。
如果系統的空閒內存低於某警戒線,kmalloc()將睡眠,等待對換程序釋放內存。所以在調用這個函數的時候不能使用自旋鎖。

void *kzalloc(size_t size, gfp_t flags);
kzalloc申請的內存已置0,flags爲標誌(常爲GFP_KERNEL)。

void kfree(const void *objp);
kfree回收kmalloc/kzalloc所申請的內存。

void *vmalloc(unsigned long size);
vmalloc是申請大內存空間,但是物理內存不一定是連續的。

void *vfree(const void *addr);
回收vmalloc申請的內存。

 

copy_to_user與copy_from_user

.由於空戶空間不能和內核空間直接進行數據交換,內核需要通過copy_from_user去獲取用戶空間傳下來的數據,copy_to_user傳回給用戶空間。
copy_to_user和copy_from_user都可能會睡眠,所以在調用這兩個函數的時候不能使用自旋鎖。
.
.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章