Linux内核编程《一》
1、首先選擇Linux系統(tǒng)這里以Centos7.4系統(tǒng)為例:
2、安裝好編譯環(huán)境:yum, make,gcc,vim;
3、新建一個(gè)文件夾
注意:
- Makefile 文件的命名注意M需要大寫,否則會(huì)報(bào)錯(cuò)。
- 在Makefile文件中make命令前應(yīng)為tab制表符。
hello.c文件內(nèi)容為:
//必要的頭文件 #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> //模塊許可證聲明(必須) MODULE_LICENSE("Dual BSD/GPL"); //模塊加載函數(shù)(必須) static int hello_init(void) {printk(KERN_ALERT "Hello World enter/n");return 0; } //模塊卸載函數(shù)(必須) static void hello_exit(void) {printk(KERN_ALERT "Hello World exit/n"); } //模塊的注冊(cè) module_init(hello_init); module_exit(hello_exit); //聲明模塊的作者(可選) MODULE_AUTHOR("XXX"); //聲明模塊的描述(可選) MODULE_DESCRIPTION("This is a simple example!/n"); //聲明模塊的別名(可選) MODULE_ALIAS("A simplest example");Makefile文件內(nèi)容為:
obj-m := hello.o #generate the path PWD:=$(shell pwd) #the absolute path KDIR:=/lib/modules/$(shell uname -r)/build #complie object all:make -C $(KDIR) M=$(PWD) modules #clean clean:make -C $(KDIR) M=$(PWD) clean4、執(zhí)行make命令,如果出現(xiàn)以下報(bào)錯(cuò)情況,先去/usr/src/kernels下查看是否有文件
執(zhí)行:ls /usr/src/kernels 命令查看,可以看到系統(tǒng)沒有安裝內(nèi)核開發(fā)包
1、執(zhí)行命令:
UNAME=$(uname -r)
yum install gcc kernel-devel-${UNAME}
或者直接安裝最新的包:yum install kernel-devel ;
成功之后;/usr/src/kernels文件夾下如下:
進(jìn)入cd /lib/modules/目錄下,該文件夾下有兩個(gè),cd 3.10.0目錄下;
查看鏈接情況:ls -l
可以看到鏈接錯(cuò)誤:
執(zhí)行:rm -rfv build;刪除鏈接;
重新執(zhí)行鏈接:重新創(chuàng)建Build文件夾的軟鏈接,目標(biāo)地址從3.10.0版本的內(nèi)核目錄改為到3.10.0-1062.18.1.el7.x86_64版本的內(nèi)核
?ln -s /usr/src/kernels/3.10.0-1062.18.1.el7.x86_64? /lib/modules/3.10.0/build
進(jìn)入:cd /haha重新編譯:
執(zhí)行:make命令之后;
lsmod:
modinfo [options] filename args
編譯模塊
#make
清除
#make clean
2,Makefile文件中的核心是
$(MAKE) -C $(KDIR) M=$(PWD) modules
1),-C $(KDIR)
表示在$(KERNELDIR)目錄下執(zhí)行make命令。
2),M=$(PWD)
表示包含$(PWD)下的Makefile文件。
3),modules
表示模塊編譯。
4), 用到了ifneq...else...endif語句
由于開始還沒定義KERNELRELEASE,所以只能執(zhí)行else分支。
而在執(zhí)行
$(MAKE) -C $(KDIR) M=$(PWD) modules
后,會(huì)在內(nèi)核的Makefile中定義KERNELRELEASE,當(dāng)進(jìn)入本Makefile時(shí),
則只會(huì)執(zhí)行ifneq的第一個(gè)分支,即
obj-m := hello.o
這一句話是非常重要的。事實(shí)上,這個(gè)Makefile做的本份工作就是它。
我們也可以用命令行的方式來編譯:
在Makefile中的內(nèi)容寫為:
obj-m := hello.o
然后在終端敲入:
#make -C /lib/modules/2.6.10/build M=/home/tmp modules
參考文章:
https://blog.csdn.net/bingqing07/article/details/5888875
https://blog.csdn.net/weixin_38391755/article/details/80380786
https://blog.csdn.net/jiankangshiye/article/details/6665179
https://www.sibida.net/p/2828
?
總結(jié)
以上是生活随笔為你收集整理的Linux内核编程《一》的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 子网掩码相关教学 子网掩码快速算法 沉
- 下一篇: linux内核编程-内核态文件操作