简单的Linux驱动

Helloworldkernel

内核程序结构分析(前提是已经编译配置好内核)

现在,通过一个最简单的helloworld程序来将内核基础做一下分析~


因为内核在加载之后就一直运行在内存中,为了保证linux内核代码的小而核心,使用模块的方式来开发驱动。模块就是在硬盘上的一段程序,通过内核特定的操作可以被链接到内核中(进入内存)。如此,便能保证我们可以选择自己需要的驱动模块链接入内核,而哪些我们不需要的不链接进去,可以避免不使用的驱动进入内存造成内存浪费。知道这一点很重要~


1、先编写两个文件

下面看代码,如下:


//头文件,不解释

#include<linux/init.h>

#include<linux/module.h>


//加载文件

staticint hello_init(void){

printk("helloenter\n");

return0;

}


//卸载文件

staticvoid hello_exit(void){

printk("helloexit\n");

}


/*关键的地方,所有这样的都是在加载时执行的,加载就是进行上面提到的链接操作

*上面的程序丝毫无用,因为只有链接进入的操作与消除链接离开内核的操作

*那么,下面在链接进去的时候进行了哪些操作呢?

*/

//模块的标题、描述、作者,没有实际操作的使用

MODULE_ALIAS("hello1");

MODULE_DESCRIPTION("fromlinuxdevice driver design");

MODULE_AUTHOR("hehe");


//模块权限,这个很重要,我见到的所有模块都这么写

MODULE_LICENSE("DualBSD/GPL");


//将模块函数导出,具体到了哪里,我暂时也不清楚

module_param(globalmem_major,int,S_IRUGO);


//最关键的两个函数,在我们写好代码,编译好了之后,使用链接指令,就会执行hello_init函数

//在卸载模块时,执行相关指令,就会执行hello_exit函数

module_init(hello_init);

module_exit(hello_exit);


到此,进行下一步,编写一个Makefile文件,这样有了两个文件helloworld.cMakefile

Makefile文件内容如下:

ifeq($(KERNELRELEASE),)

KERNELDIR?= /lib/modules/$(shell uname -r)/build

PWD:= $(shell pwd)

modules:

$(MAKE)-C $(KERNELDIR) M=$(PWD) modules

modules_install:

$(MAKE)-C $(KERNELDIR) M=$(PWD) modules_install

clean:

rm-rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

.PHONY:modules modules_install clean

else

obj-m:= helloworld.o

endif


至于Makefile为什么这么编写,作用是什么?需要去学习MakefileKconfig的语法知识,然后结合源码里面的MakefileKconfig文件进行学习,当然,如果直接就看主目录下面的Makefile,那是很痛苦的一件事,那是最主要的全局的Makefile文件,看其他简单的就好<如果名字不是helloworld,可以把倒数第二行的哪个名字改了,然后这个Makefile就通用了>


2、执行make操作——在helloworld目录下面,执行make

错误:1、可能是缺少工具插件 2、代码写错了

完成之后,发现目录下面多了一堆东西,ok

3、加载模块(如果执行不成功,可能缺少权限,使用sudo——sudoinsmodhello.ko sudo rmmod hello.ko)

加载insmod(insmodhello.ko)

输入tail-f /var/log/kern.log  ——指令可以查看printk的输出

卸载 rmmod(rmmodhello.ko)

加载模块之后:

输入lsmod————查看有哪些模块被加载到内核中,可以看到helloworld


之前代码中类似于MODULE_ALIAS一类的,在哪呢?

modinfohello.ko指令(需要在模块目录下面执行)


总结:

下面来总结一下模块进入内核的过程

1、编写一个hello.c文件,一个Makefile文件(编译hello.c并编译为模块)

2、执行make,生成一个模块(由很多文件组成,模块只是逻辑上这么说)

3、载入/卸载模块

此外可以通过lsmod看看是否加载成功,使用modinfo来查看模块信息~


注意:insmodlsmod是怎么来的?这些可以cd/dev;lslsmod; 指令找到这些可执行文件,都在dev下面,至于dev目录是干什么的,这就涉及到linux文件目录知识了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值