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.c与Makefile
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为什么这么编写,作用是什么?需要去学习Makefile与Kconfig的语法知识,然后结合源码里面的Makefile与Kconfig文件进行学习,当然,如果直接就看主目录下面的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来查看模块信息~
注意:insmod、lsmod是怎么来的?这些可以cd/dev;lslsmod; 指令找到这些可执行文件,都在dev下面,至于dev目录是干什么的,这就涉及到linux文件目录知识了