實驗8,驅動程序的編寫,驅動程序一用戶空間和內核空間的通信_第1頁
實驗8,驅動程序的編寫,驅動程序一用戶空間和內核空間的通信_第2頁
實驗8,驅動程序的編寫,驅動程序一用戶空間和內核空間的通信_第3頁
實驗8,驅動程序的編寫,驅動程序一用戶空間和內核空間的通信_第4頁
實驗8,驅動程序的編寫,驅動程序一用戶空間和內核空間的通信_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、實驗8用戶空間和內核空間的通信一、實驗目的:學習利用編寫驅動程序,完成用戶空間和內核空間的通信,加載驅動模塊、顯示驅動模塊,卸載驅動 模塊。二、實驗內容前面學習了 bootloader kernel filesystem,進行過內核的移植,根文件系統(tǒng)的制作,現在進行驅動 程序的編寫,完成用戶空間和內核空間的通信。#su root切換root權限密碼123456通過第一個hello world驅動程序,我們學會了驅動程序的框架。知道了,如何編譯,如何加載,如何卸載一個驅動程序。接下來我們來做一個完整的驅動程序Demo_Driver.c#i ncludevli nux/kernel.h>#i

2、n clude<li nux/ ini t.h>#i ncludevli nux/fs.h>#i ncludevli nux/module.h>#defi ne Demo_MAJOR 98定義主設備號#defi ne Demo_DEBUG#defi ne VERSION"Demo_Driver" void showvers in( void)prin tk(KERN_EMERG'I*n");pri ntk(KERN_EMERG"tVERSIONtn");prin tk(KERN_EMERG'I*n&quo

3、t;);/static int Demo_temp_cou nt=O;size_t Demo_read(struct file *file,char *buf,size_t cou nt,loff_t *f_ops)#ifdef Demo DEBUGpri ntk(KERN_EMERG"Demo_read-ker nel-n");#en difretur n cou nt;size_t Demo_write(struct file *file,c onst char *buf,size_t cou nt,loff_t * f_ops)#ifdef Demo_DEBUGpri

4、n tk(KERN_EMERG"Demo_write-kernel-n");#en difretur n cou nt;int Demo_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long data)#ifdef Demo_DEBUGprin tk(KERN_EMERG"Demo_ioctl-kern el-n");#en difreturn 0;int Demo_open(struct inode * inode,struct file * file)#i

5、fdef Demo_DEBUGprin tk(KERN_EMERG"Demo_ope n -ker nel-n");#en difMOD_INC_USE_COUNT;return 0;int Demo_release(struct inode *inode,struct file *file)#ifdef Demo_DEBUGpri ntk(KERN_EMERG"Demo_release-kernel-n");#en difMOD_DEC_USE_COUNT;return 0; struct file_operati ons Test_ctl_ops=.

6、ope n=Demo_ope n.read= Demo_read,.write= Demo_write,.ioctl= Demo_ioctl,release: Demo_release,;astatic int HW_Test_CTL_i ni t(void)in t ret = -ENODEV;ret = register_chrdev(Demo_MAJOR,"demo_drv", &Test_ctl_ops);if(retvO)printk(KERN_EMERG"Demo_module failed with %dn-kernel-",ret

7、);return ret;elsepr in tk(KERN_EMERG"Demo_driver register success!-ker nel-n");pri ntk("n.nret=%xn.n",ret);showversi n()訂return ret;static int Demo_Test_CTL_i nit(void)in t ret = -ENODEV;#ifdef Demo_DEBUGprin tk(KERN_EMERG"Demo_Test_CTL_i nit-kerinel-n “);#en difret = HW_Tes

8、t_CTL_i nit();if(ret)return ret;return 0;static void clea nup_Test_ctl(void)#ifdef Demo_DEBUGprin tk(KERN_EMERG"clea nup_INT_CTL-kernel-n");#en difun register_chrdev(Demo_MAJOR,"demo_drv");MODULE_DESCRIPTION("simple int drive module");MODULE_LICENSE("GPL");mod

9、ulenit(Demo_Test_CTL_i nit);module_exit(clea nup_Test_ctl);相比于hello world驅動程序,上面這個程序更加完整。首先要介紹一個重要的結構體structfile_operati ons fops=read: device_read;write: device_write;ope n: device_ope n;release: device_release;它的原型在 <include/linux/fs.h> 中struct file_operati onsstruct module * owner;loff_t (*

10、llseek)();ssize_t(*read)();ssize_t(*aio_read)();ssize_te(*write)();在結構體file_operations門中,每一個成員的名字都對應一個系統(tǒng)調用,對應著設備驅動程序提供的入口位置使用方法如第一個file_operationsread : device_read ;這樣我們在應用程序中調用read ()對設備文件進行操作時,驅動程序就會直接調用 device_read ()來進行讀操作了。現在我們知道了,應用程序中的函數是怎么與驅動程序中的操作函數對應起來了。那么驅動程序中的操作函數是如何連接到設備文件上的呢?靠register

11、_chrdev ()注冊我們的設備如上面代碼:ret = register_chrdev(Demo_MAJOR,"demo_drv", &Test_ctl_ops);第一個參數是我們的主設備號,第二個是我們要注冊的設備的設備名,第三個是我們建立的結構體file_operations 。這三個參數都是有重要作用的。第一個主設備號是內核識別我們設備的標志,內核通過主設備號識別我們的設備文件。第二個是我們要注冊的設備名,這個參數要與我們在/dev目錄下建立的設備文件名一致,這樣我們才可以打開設備文件。第三個是我們的結構體,它建立設備文件到設備操作函數的對應關系。另外一個函

12、數是:un register_chrdev()un register_chrdev(Demo_MAJOR,"demo_drv");用來卸載我們的設備。Makefile代碼如下:KERNELDIR ?= /lib/modules/2.6.25-14.fc9.i686/build/PWD := $(shell pwd)#CC=$(CROSS_COMPILE)gcc obj-m :=Demo_Driver.o modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules modules_i nstall:$(MAKE) -C $(KERNELD

13、IR) M=$(PWD) modules_i nstall然后執(zhí)行命令:make得到我們要加載的模塊 Demo_Driver.ko這時候需要我們建立一個設備節(jié)點,也就是/dev/目錄下的設備文件mknod /dev/demo_drv c 980第二個命令參數是我們注冊的設備名p是fifo文件第三個命令參數是c代表char字符型設備b代表block塊設備 u是unbuff第四個參數是主設備號,第五個參數是次設備號接著我們編寫一個應用程序進行一下測試test_drive.c#in clude<stdlib.h>#i nclude<stdio.h>#in cludevstri

14、 ng.h>#in cludevfc ntl.h>#in clude<u ni std.h>#defi ne DEVICE_NAME "/dev/demo_drv"int mai n()int fd;in t ret;char *i;printf("nstart Demo_driver testnn");fd=ope n(DEVICE_NAME,O_RDWR);pri ntf("fd=%dn",fd);if(fd=-1)printf("open device %s errorn",DEVICE_NAME);elseread(fd,NULL,O);write(fd,NULL,O);ioctl(fd);re

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論