日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux内核编程《一》

發布時間:2023/12/10 linux 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux内核编程《一》 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、首先選擇Linux系統這里以Centos7.4系統為例:

2、安裝好編譯環境:yum, make,gcc,vim;

3、新建一個文件夾

注意:

  • Makefile 文件的命名注意M需要大寫,否則會報錯。
  • 在Makefile文件中make命令前應為tab制表符。

hello.c文件內容為:

//必要的頭文件 #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> //模塊許可證聲明(必須) MODULE_LICENSE("Dual BSD/GPL"); //模塊加載函數(必須) static int hello_init(void) {printk(KERN_ALERT "Hello World enter/n");return 0; } //模塊卸載函數(必須) static void hello_exit(void) {printk(KERN_ALERT "Hello World exit/n"); } //模塊的注冊 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文件內容為:

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) clean

4、執行make命令,如果出現以下報錯情況,先去/usr/src/kernels下查看是否有文件

執行:ls /usr/src/kernels 命令查看,可以看到系統沒有安裝內核開發包

1、執行命令:

UNAME=$(uname -r)

yum install gcc kernel-devel-${UNAME}

或者直接安裝最新的包:yum install kernel-devel ;

成功之后;/usr/src/kernels文件夾下如下:

進入cd /lib/modules/目錄下,該文件夾下有兩個,cd 3.10.0目錄下;

查看鏈接情況:ls -l

可以看到鏈接錯誤:

執行:rm -rfv build;刪除鏈接;

重新執行鏈接:重新創建Build文件夾的軟鏈接,目標地址從3.10.0版本的內核目錄改為到3.10.0-1062.18.1.el7.x86_64版本的內核

?ln -s /usr/src/kernels/3.10.0-1062.18.1.el7.x86_64? /lib/modules/3.10.0/build

進入:cd /haha重新編譯:

執行:make命令之后;

lsmod:

modinfo [options] filename args

編譯模塊

#make

清除

#make clean

2,Makefile文件中的核心是
$(MAKE) -C $(KDIR) M=$(PWD) modules
1),-C $(KDIR)
表示在$(KERNELDIR)目錄下執行make命令。
2),M=$(PWD)
表示包含$(PWD)下的Makefile文件。
3),modules
表示模塊編譯。
4), 用到了ifneq...else...endif語句
由于開始還沒定義KERNELRELEASE,所以只能執行else分支。
而在執行
$(MAKE) -C $(KDIR) M=$(PWD) modules
后,會在內核的Makefile中定義KERNELRELEASE,當進入本Makefile時,
則只會執行ifneq的第一個分支,即
obj-m := hello.o
這一句話是非常重要的。事實上,這個Makefile做的本份工作就是它。
我們也可以用命令行的方式來編譯:

在Makefile中的內容寫為:
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

?

總結

以上是生活随笔為你收集整理的Linux内核编程《一》的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。