IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux内核模块 -> 正文阅读

[系统运维]Linux内核模块

Linux是一个单内核的结构,单内核的模块的可维护性比较差,当我们想增加一个新的功能,比如说要写一个驱动程序要融入到内核里头,Linux内核现在非常庞大,编译一次内核花费的时间很长。所幸的是Linux提供了一种机制(可加载的Linux内核模块),我们所写的代码不需要完全和内核捆绑在一起。在Linux内核运行的过程中,可以把模块加载进Linux内核,当不需要这个模块的时候,即使Linux内核在运行,也可以进行卸载。

Linux内核模块编程

printk函数包含在linux/kernel.hlinux/module.hlinux/init.h是必须包含的头文件。

  • 模块的初始化函数
    __init是用于初始化的编译修饰符,当通过insmod命令加载内核模块时,模块的初始化函数会自动被内核执行,完成本模块相关初始化工作。
#include <linux/module.h>
#include <linux/kernrl.h>
#include <linux/init.h>

static int __init lkp_init(void)
{
    printk("Hello, World! from the kernel space...\n");
    return 0;
}
  • 模块的退出和清理函数
    当通过rmmod命令卸载模块时,模块的退出函数会自动被内核执行,完成退出清理工作。
static void __exit lkp_exit(void)
{
    printk("Goodbye, World! leaving kernel space...\n");
}
  • module_init和module_exit
    module_init表示要用来调用这个初始化函数的宏,它的参数是一个函数名,这个宏定义它放在linux/module.h
    module_init(lkp_init);
    module_exit(lkp_exit);
  • 模块许可证申明
MODULE_LICENSE("GPL");
  • 模块的参数
    块参数是模块被加载的时候可以被传递给他的值,它本身对应模块内部的全局变量。

  • 模块的导出符号
    内核模块可以导出符号(symbol,对应于函数或变量),这样其他模块可以使用本模块中的变量或函数。

EXPORT_SYMBOL(variable);
EXPORT_SYMBOL(FunctionName);

模块的编译

Linux内核模块不是一个独立的可执行文件,是在内核运行期间可以插入到内核中的,只有超级用户才能加载和卸载模块。
编译内核模块不能用一般的编译方法,必须写一个Makefile文件,下面这个格式是在ubuntu下的格式。
obj-m :=这个赋值语句的含义是说明要使用目标文件module_helloworld.o建立一个模块,最后生成的模块名为module_helloworld.ko。.o文件是经过编译和汇编,而没有经过链接的中间文件。

obj-m:module_helloworld.o # 产生module_helloworld模块的目标文件
CURRENT_PATH := $(shell pwd) # 模块所在的当前路径
LINUX_KERNEL := $(shell uname -r) # linux内核源码的当前版本
LINUX_KERNEL := /usr/src/linux-headers-$(LINUX_KERNEL) # linux内核源码的绝对路径

all:
	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH ) modules # 编译模块
clean:
	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH ) clean # 清理模块

模块插入命令insmod module_helloworld.ko
模块卸载命令rmmod module_helloworld

C应用程序内核模块程序
使用函数Libc库内核函数
运行空间用户空间内核空间
运行权限普通用户超级用户
入口函数main()module_init()
出口函数exit()module_exit()
编译gcc-cmake
链接gccinsmod
运行直接运行insmod
调试gdbkgdb
Linux内核模块与C应用的对比
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-07-03 11:10:24  更:2022-07-03 11:14:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 10:00:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计