linux驱动学习总结一

来源:互联网 发布:preg_match php.net 编辑:程序博客网 时间:2024/05/24 05:42

      这是我第一次写博客。希望把自己学习的知识进行总结,不断的督促自己多总结多思考,更希望路过的大神进行指正和纠错,共同进步可怜

      刚接触linux驱动开发,自己对u-boot、内核、根文件系统在驱动开发中所起到的作用,还有驱动程序和应用程序两者的关系不是特别清楚,在学习后有如下的总结。

    一. u-boot:是一种boot loader(系统引导)主要用于嵌入式系统中。它的主要作用就是启动内核。

     内核:内核是操作系统中最基本的部分。它主要负责四种功能:系统的内存管理、软件程序管理、硬件设备管理、文件系统管理。在驱动开发中,内核用来启动应用程序。

    根文件系统:根文件系统是内核启动后第一个挂载的文件系统,是用户和内核交互的工具。

   二. 驱动程序和应用程序的关系

     写一个应用程序使用的是标准的接口函数,这些标准的接口函数是由c库提供的。实际上调用SWI异常处理进入内核通过system call interface ,调用驱动程序。实现应用程序---->内核---->驱动程序的过程。

     一个驱动程序就有基本的框架。

    应用程序中有标准的open 、read、write函数,例如:对应于驱动的led_open、led_read、led_write。

   ①写出led_open、led_write 

//first_drv_open(struct inode *inode, struct file *file)   first_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)

   ②通过定义一个文件操作的结构体来告诉内核  static struct file_operations first_drv_fops这个结构体中就包括open和write。

   ③注册字符设备,让设备号和文件操作的结构体相联系 register_chrdev,相当于一个入口函数,写成xxx_Init(),再经过修饰入口函数,让内核确定调用入口函数module_init()

   ④注销字符设备,这里和注册相对应unregister_chrdev,出口函数写成xxx_exit,同样需要修饰module_exit()

   ⑤一个.c的程序需要头文件,加上所必须的头文件。

    这就是一个最简单的驱动程序框架。

三.完成一个驱动程序的过程

   1.编译需要在linux服务器上编译。在每次编译之前都需要对内核进行编译,这里我不是很清楚,如果不编译在编译驱动程序时会报错。

    2.把编译到的.ko文件放在/work/nfs的目录下。然后在开发板上实现挂载

      手动挂载方法:mount   -t  nfs   -o nolock,vers=2    192.168.xxx.xxx:/work/nfs  /mnt

    3.insmod进行加载  insmod xxx.ko 

    4.设备号,可以手动指定设备号,通过使用命令cat  /proc/devices查看驱动程序的设备号后,使用mknod xxx c 主设备号  次设备号 常见设备文件  在/dev目录下可以看到所创建的设备文件。也可以使用程序自动生成设备文件。

    5.应用程序测试,写一个应用程序在服务器上交叉编译,arm-linux-gcc -o 执行文件  .c文件 将执行文件拷到/work/nfs目录下 然后执行程序实现应用程序对驱动程序的测试。

     第一次总结就这么多,有错的地方,请大家指正。

   

0 0