/: 根目录
~: 家目录,即用户的个人目录。root用户的家目录是
/root
,普通用户enso的家目录是/home/enso
/proc: 虚拟文件系统,存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态
$ mkdir Mooc
$ cd Mooc
vim helloworld.c
#include <linux/init.h> //模块的初始化的宏定义 以及一些其他函数的初始化函数
#include <linux/kernel.h> //包含了printk函数
#include <linux/module.h> //动态的将模块加载到内核中去
static int __init lkm_init(void)
{
printk("Hello World\n"); //内核中printf不能使用,此处的k表示kernel
return 0;
}
static void __exit lkm_exit(void)
{
printk("Goodbye\n");
}
module_init(lkm_init); //模块的初始化
module_exit(lkm_exit); //模块初退出
MODULE_LICENSE("GPL"); //GPL许可证
__init
:宏定义,告诉编译器相关函数或变量仅用于初始化并将标有__init
的所有代码放在特殊的内存段中,在初始化结束后就释放这段内存。
vim Makefile #注意M大写
obj-m:=helloworld.o #生成.o文件
CURRENT_PATH:=$(shell pwd) #当前地址
LINUX_KERNEL:=$(shell uname -r) #内核版本号
LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL) #内核地址
# 当make的目标为all时,-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=$(PWD) 表明然后返回到当前目录继续 读入、执行当前的Makefile
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
$ make
$ ls
但是此时没有打印hellowrold。
lsmod
:查看模块
以下两条命令需要在root权限下执行
插入内核模块
sudo insmod helloworld.ko
#此处需要后缀
? 此处有helloworld说明该模块已经插进内核。
dmesg
:打印系统日志信息
删除内核模块
sudo rmmod hellworld
#此时不需要后缀
原文:https://www.cnblogs.com/Ricardio/p/14772461.html