Linux2 6核心下簡單的字元裝置驅動及測試

2021-06-06 12:50:04 字數 3107 閱讀 2732

linux2.6核心下的簡單字元裝置

1.自定裝置符結構體

struct virtualdisk;

2.宣告函式

//裝置驅動模組載入函式

int __init virtualdisk_init(void);

//模組解除安裝函式

void __exit virtualdisk_exit(void);

//初始化並註冊

static void virtualdisk_setup_cdev(struct virtualdisk *, int );

//檔案開啟函式

int virtualdisk_open(struct inode *, struct file *);

//檔案讀函式

static ssize_t virtualdisk_read(struct file *, char __user *, size_t, loff_t *);

//檔案寫函式

static ssize_t virtualdisk_write(struct file *, const char __user *, size_t, loff_t *);

3.初始化檔案操作結構體

static const struct file_operations virtualdisk_fops = ;

4.定義函式

int __init virtualdisk_init(void)

else

if(result < 0)

virtualdisk_devp = kmalloc(sizeof(struct virtualdisk),gfp_kernel);//動態申請裝置結構體內存

if(!virtualdisk_devp)

memset(virtualdisk_devp, 0, sizeof(struct virtualdisk));

virtualdisk_setup_cdev(virtualdisk_devp, 0);

printk("register_chrdev_region success\n");

return 0;

fail_kmalloc:

unregister_chrdev_region(devno, 1);

return result;

}void __exit virtualdisk_exit(void)

static void virtualdisk_setup_cdev(struct virtualdisk *dev, int minor)

}int virtualdisk_open(struct inode *inode, struct file *filp)

static ssize_t virtualdisk_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)

if(count > virtualdisk_size)

if(copy_to_user(buf, (void *)(devp->mem + p), count))//將核心中的內容拷貝到使用者空間

else

*ppos = 0;//將核心指標復位

printk("read:%s\n",buf);

return ret;

} static ssize_t virtualdisk_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)

if(count > virtualdisk_size)

if(copy_from_user(devp->mem + p, buf, count))

else

*ppos = 0;//核心指標復位

printk("write:%s\n",buf);

return ret;

}//模組函式

module_init(virtualdisk_init);

module_exit(virtualdisk_exit);

module_license("dual bsd/gpl");

module_author("zhang san");

5.makefile檔案

obj-m := virtualdisk.o

#核心中makefile檔案的位置

kdir := /lib/modules/2.6.35-22-generic/build

all:

make -c $(kdir) m=$(shell pwd) modules

clean:

rm -f *.ko *.o *.mod *.mod.c *.symvers *.order

6.編譯

make

編譯後的結果:

7.載入模組

sudo insmod virtualdisk.ko

8.在/dev資料夾下建立裝置檔案

sudo /dev/virtualdisk c 200 0

9.測試(簡單的open、write、read)

測試程式

#include

#include

#include

#include

#include

#include

#include

#define bfsize 256

int main()

if((size = write(fd,buff,strlen(buff))) < 0)//寫

if((size = read(fd,temp,bfsize)) < 0)//讀

printf("read from device :%s\n",temp);

close(fd);

return 0;

}測試結果

1.測試程式

2.核心空間

10.解除安裝驅動

sudo rmmod virtualdisk

11.刪除裝置檔案

sudo rm -f /dev/virtualdisk.

結束。

linux2 6核心Makefile簡單語法與應用

2.6的makefile的寫法和應用相對於2.4有了一些變化,可能對於很多人來說,因為找不到相關的文件,都是模仿核心中已有的檔案來寫自己的makefile。其實,在核心的documentation kbuild目錄下面,還是有對核心makefile語法的詳細說明的。在這裡就2.6核心中makefil...

Linux 2 6核心編譯,核心公升級

本文描述了在fc8下公升級linux核心為2.6.25的詳細步驟.1.首先從如下 得到linux 2.6.25.2.然後在 usr src下untar這個包.tar xjfv linux 2.6.25.tar.bz2 3.配置核心 cd usr src linux 2.6.25 make mrpro...

Linux2 6核心啟動分析

我們已知u boot的終極目的是啟動核心,那麼核心啟動的開始必定是u boot傳入的引數。開啟armlinux.c 發現有一行的 為 thekernel 0,bd bi arch number,bd bi boot params 帶入三個引數 第乙個引數是0,第二個引數是機器id,第三個引數是引數所...