驱动开发之路——1.1

一、什么是模块:

     模块(module)是在内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是可以装载到系统中作为内核的一部分运行,从而可以动态扩充内核的功能。模块最主要的用处就是用来实现设备驱动程序。

使用模块的优点:

1,将来修改内核时,不必全部重新编译整个内核,可节省不少时间

2,系统中如果需要使用新模块,不必重新编译内核,只要插入相应的模块即可。

静态编译,把所需要的功能都编译到linux内核,会导致生成的内核会很大,如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核。

动态编译,linux提供这样一种机制,称为模块(Module)。此机制的特点是,模块本身不被编译入内核映像,从而控制了内核的大小。内核一旦被加载,它就和内核中的其他部分完全一样。

在linux中,使用lsmod命令可以获得系统中加载了的所有模块以及模块间的依赖关系,lsmod命令实际上读取并分析"/proc/modules"文件。内核中已加载模块的信息也存在于/sys/module目录下。

modprobe命令比insmod命令要强大,它在加载某模块时,会同时加载该模块所依赖的其它模块。以modprobe
-r filename的方式加载将同时卸载其依赖的模块。

二、简单的内核实例:

实例一:

#include<linux/kernel.h>

#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
      printk(KERN_ALERT "Hello,world\n");
      return 0;
}
static void hello_exit(void)
{
      printk(KERN_ALERT "Goodbye,Cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);

实例二:

#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#include<linux/kdev_t.h>
#include<linux/cdev.h>
#include<linux/fs.h>

MODULE_LICENSE("GPL");

dev_t devno;   //设备结构体
int major=1000;  //主设备号
int minor=0;   //此设备号
int count=1;   //申请一个设备

int hello_init(void)
{
	int ret;
	devno=MKDEV(major,minor);
	 ret=register_chrdev_region(devno,count,"hello");   //静态申请设备号
	 if(ret)
	 {
		return ret;

	 }
	 printk(KERN_INFO "devno register ok\n");
	 return 0;

}

void hello_exit(void)
{
     unregister_chrdev_region(devno,count);  //释放设备号
}

module_init(hello_init);
module_exit(hello_exit);

实例三:

#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#include<linux/kdev_t.h>
#include<linux/cdev.h>
#include<linux/fs.h>

MODULE_LICENSE("GPL");

dev_t devno;
int major=1000;
int minor=0;
int count=1;

int hello_init(void)
{
	int ret;

	ret=alloc_chrdev_region(&devno,0,count,"helldyn");  //动态申请设备号
	 if(ret)
	 {
		return ret;

	 }
	 printk(KERN_INFO "devno register ok, major = %d ,minor = %d\n",major,minor);

	 return 0;

}

void hello_exit(void)
{
     unregister_chrdev_region(devno,count);
}

module_init(hello_init);
module_exit(hello_exit);

实例四:

#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#include<linux/kdev_t.h>
#include<linux/cdev.h>
#include<linux/fs.h>

MODULE_LICENSE("GPL");

dev_t devno;
int major=1000;
int minor=0;
int count=1;

struct cdev *hello_dev;

struct file_operations hello_ops= {
       .owner = 	THIS_MODULE,
};

int hello_init(void)
{
	int ret;
	devno=MKDEV(major,minor);
	 ret=register_chrdev_region(devno,count,"hello");
	 if(ret)
	 {
		return ret;

	 }
	 printk(KERN_INFO "devno register ok\n");

	 hello_dev=cdev_alloc();   //动态获取描述字符设备的结构体
	 if(hello_dev==NULL)
	      return -ENODEV;

	 cdev_init(hello_dev,&hello_ops);//初始化字符设备的结构体
	 hello_dev->owner=THIS_MODULE;
	 ret=cdev_add(hello_dev,devno,count);

	 if(ret)
	 {
		 unregister_chrdev_region(devno,count);
	 }
	 return 0;

}

void hello_exit(void)
{
  	cdev_del(hello_dev);
     unregister_chrdev_region(devno,count);
}

module_init(hello_init);
module_exit(hello_exit);

驱动开发之路——1.1

时间: 2024-11-08 22:01:13

驱动开发之路——1.1的相关文章

Linux驱动学习之驱动开发准备工作

一.开启驱动开发之路 1.驱动开发的准备工作 (1)正常运行linux系统的开发板.要求开发板中的linux的zImage必须是自己编译的,不能是别人编译的.原因在于在安装模块的时候会进行安全性校验 (2)内核源码树,其实就是一个经过了配置编译之后的内核源码.我们需要内核源码编译自己的模块 (3)nfs挂载的rootfs,主机ubuntu中必须搭建一个nfs服务器.这对于驱动开发前期是不可或缺的,能够提高我们的开发效率. 2.驱动开发的步骤 (1)驱动源码编写.Makefile编写.编译 (2)

【转】linux驱动开发的经典书籍

原文网址:http://www.cnblogs.com/xmphoenix/archive/2012/03/27/2420044.html Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书为<linux_device_driver 3rd Edition>,这是一本很经典的书,无奈Linux的东东还是过于庞大,这本侧重于实战的书籍也只能停留在基本的接口介绍上,更深入的东东只能靠我们自己摸索了.但万事总有一个开头,没有对Linux驱动整体框架的把握是很难做一个优秀的驱动开发者的.除了

在嵌入式学习困惑:做驱动开发还是做应用开发更有前途

在嵌入式学习过程中,很多人都有这样的困惑! 意思就是说,"你告诉我哪个更有前途,我就好好学哪个,另外一个就不用学了".问这种问题的同事往往会同时问另外一些问题:我以后就想做驱动开发,你教我这些应用开发的技术有什么用?C++用得多吗?学了有什么用?我以后不想做GUI,你教我Qt有什么用? 学习最忌讳的就是"有用的就学,没有用的就不学"这种功利的态度.两个问题:第一,在你还没学进去.还不了解这种技术时,要如何判断这种技术学了有没有用?只能是根据道听途说,看各种论坛上都怎

Windows Storage 驱动开发 葵花宝典 - 翻译

Roadmap for Developing Windows Storage Drivers Last Updated: 4/20/2017 To create a storage driver, perform the following steps: 9个步骤 Learn about Windows architecture and drivers. 学习Windows系统架构和驱动知识 You must understand the fundamentals of how drivers

《Linux设备驱动开发具体解释(第3版)》(即《Linux设备驱动开发具体解释:基于最新的Linux 4.0内核》)网购链接

<Linux设备驱动开发具体解释:基于最新的Linux 4.0内核> china-pub   spm=a1z10.3-b.w4011-10017777404.30.kvceXB&id=521111707813&rn=4cf013961288ab7c4dfd2016aeb21fa8&abbucket=5">天猫     dangdang   京东 China-pub 8月新书销售榜 推荐序一 技术日新月异,产业斗转星移,滚滚红尘,消逝的事物太多,新事物的诞

Linux驱动开发学习的一些必要步骤

1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, lsmod, rmmod. 在驱动的init函数里打印hello world, insmod后应该能够通过dmesg看到输出. 5. 写一完整驱动, 加上read, write, ioctl, polling等各种函数的驱动实现. 在ioctl里完成从用户空间向内核空间传递结构体的实现. 6. 写一bl

《Linux设备驱动开发详解:基于最新的Linux 4.0内核》china-pub预售

<Linux设备驱动开发详解:基于最新的Linux 4.0内核>china-pub今日上线进入预售阶段: http://product.china-pub.com/4733972 推荐序一 技术日新月异,产业斗转星移,滚滚红尘,消逝的事物太多,新事物的诞生也更迅猛.众多新生事物如灿烂烟花,转瞬即逝.当我们仰望星空时,在浩如烟海的专业名词中寻找,赫然发现,Linux的生命力之旺盛顽强,斗志之昂扬雄壮,令人称奇.它正以摧枯拉朽之势迅速占领包括服务器.云计算.消费电子.工业控制.仪器仪表.导航娱乐等

《Linux设备驱动开发详解:基于最新的Linux 4.0内核》china-pub 预售

<Linux设备驱动开发详解:基于最新的Linux 4.0内核>china-pub今日上线进入预售阶段: http://product.china-pub.com/4733972 推荐序一 技术日新月异,产业斗转星移,滚滚红尘,消逝的事物太多,新事物的诞生也更迅猛.众多新生事物如灿烂烟花,转瞬即逝.当我们仰望星空时,在浩如烟海的专业名词中寻找,赫然发现,Linux的生命力之旺盛顽强,斗志之昂扬雄壮,令人称奇.它正以摧枯拉朽之势迅速占领包括服务器.云计算.消费电子.工业控制.仪器仪表.导航娱乐等

Linux驱动开发之 六 (那些必须要了解的硬件知识 之 仪器篇)

Linux驱动开发之 六 (那些必须要了解的硬件知识 之 仪器篇) 一.前言 在之前的文章中,老谢已经分享了不少关于嵌入式系统开发过程中必须要了解的硬件知识.作为这一小节的结束(哎呀,终于要结束了),老谢还想和大家聊聊"仪器".本文中老谢不聊仪器的具体使用方法.原理等.只想聊点轻松的,老谢结合自己的实际工作,以图文结合的方式,简单聊聊工作中使用到的仪器. 实话实说,前几篇文章基本无技术含量,包括本文.老谢坚持写这几篇的用意是: Linux驱动开发,必须以此为基础: 通过写博客的方式,让