設備和模塊的分類
設備分爲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都可能會睡眠,所以在調用這兩個函數的時候不能使用自旋鎖。
.
.