linux中添加内核模块

1.  内核模块简介

Linux 内核的 整 体结构 非 常 庞 大 ,其 包 含 的 组 件也 非 常多 , 如 何使用 需 要 的 组 件 呢?

方 法 一 : 把 所有的 组 件都 编译 进 内核 文 件, 即 :zImage 或bzImage , 但 这样会 导 致 两 个 问 题 : 一是 生 成的 内核 文 件 过大 ;二 是 如果 要 添 加 或 删 除某 个 组 件, 需 要重 新 编译 整 个内核

方法二:使用内核模块, 内核 文 件(zImage 或bzImage) 本 身 并不 包 含 某 组 件 , 而 是 在该 组 件 需要 被 使用的 时 候 ,以模块的方式动 态地 添 加 到 正 在 运行 的内核中

2. 内核 模块 具 有 如下特 点 :

? 模块 本 身 并 不 被编译 进 内核 文 件( zImage 或者bzImage )

? 可以 根 据 需 求 , 在内核 运行 期 间 动 态 的安 装 或 卸 载

3. 范 例(hello world)

#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void)
{
printk(KERN_WARNING"Hello, world !\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_INFO "Goodbye, world\n");
}
module_init(hello_init);
module_exit(hello_exit);

4. 程序结构说明

模块加载函数(必需):安 装 模块 时 被系统 自 动 调 用的 函 数 , 通 过module_init 宏 来指定,以上例子,指定的加载的函数就是hello_init

模块卸载函数(必须):卸 载 模块 时 被系统 自 动 调 用的 函 数 , 通 过module_exit 宏 来 指定 ,以上例子,指定的加载的函数就是hello_exit

5.pritk函数说明

printk函数和printf的函数实现的功能是一样的,只不过一个运行在内核态,一个运行在用户态。

用printk函数打印时候,内核会根据日志级别,可能把消息打印到当前的控制台上, 这个控制台通常是一个字符模式的终端、一个串口打印机或是一个并口打印机。这些消息正常输出的前提是:日志输出级别小于控制台日志级别(在内核中数字越小优先级越高)。如果没有指定打印级别,默认的基本是<4>,即是KERN_WARNING级别,其定制可以再/kernelprintk.c中找到。

日志级别一共有8个级别,printk的日志级别定义如下(在include/linux/kernel.h中):

#define KERN_EMERG      0

#define KERN_ALERT      1

#define KERN_CRIT       2

#define KERN_ERR        3

#define KERN_WARNING    4

#define KERN_NOTICE     5

#define KERN_INFO       6

#define KERN_DEBUG      7

通过读写/proc/sys/kernel/printk文件可读取和修改控制台的日志级别

#cat /proc/sys/kernel/printk

4
4 1
7

上面显示的4个数据分别对应控制台日志级别、默认的消息日志级别、最低的控制台日志级别和默认的控制台日志级别

可以修改上面的数据修改控制台的打印级别

备注:ubuntu 图形化界面是无法打印到控制台的, printk打印的是控制台,也就是/dev/console,而图形界面中的终端,其实是把stdin,stdout,stderr三个文件重定向了一下。所以printk是无法再图形界面中的终端中显示的,当然可以再/var/log/syslog或者用dmesg查看。

6.  模块makefile编写,makefile名字必须命名为Makefile,否则编译通过不了,下面这个makefile会被编译两次,第一次KERNELRELEASE为空,去运行

KDIR下面的makefile,接着会重新调用自己的Makefile,编译成功,产生hello.o,hello.ko两个文件

ifneq ($(KERNELRELEASE),)

obj-m := hello.o//根据自己的模块修改

else

KDIR := /lib/modules/2.6.32-21-generic/build//根据自己lib/modules/下面自己内核版本库填写
all:
        make -C $(KDIR) M=$(PWD) modules
clean:
        rm -f *.ko *.o *.mod.o *.mod.c *.symvers

endif

7. 加载 模块insmod

insmod hello.ko

可以通过lsmod  | grep hello查看自己刚刚加载的内核模块

8. 卸载模块rmmod

rmmod hello

时间: 2024-07-28 14:23:32

linux中添加内核模块的相关文章

Linux中添加用户、删除用户时新手可能遇到的问题

Linux中添加用户.删除用户时新手可能遇到的问题  1.创建新用户后切换到新用户:No directory, logging in with HOME=/     添加用户     #sudo useradd -m -s /bin/bash -g group loginname     -m 创建home目录 (不加这个要手动添加目录,不然会出现No directory,Logging in with HOME=/ )     -s /bin/bash 使用bash( 默认为 /bin/sh

在linux中添加ftp用户,并设置相应的权限

在linux中添加ftp用户,并设置相应的权限,操作步骤如下: 1.环境:ftp为vsftp.被限制用户名为test.被限制路径为/home/test 2.建用户:在root用户下: useradd -d /home/test test //增加用户test,并制定test用户的主目录为/home/testpasswd test //为test设置密码 3.更改用户相应的权限设置: usermod -s /sbin/nologin test //限定用户test不能telnet,只能ftpuse

如何在 Linux 中添加一块大于 2TB 的新磁盘?

你有没有试过使用 fdisk 对大于 2TB 的硬盘进行分区,并且纳闷为什么会得到需要使用 GPT 的警告? 是的,你看到的没错.我们无法使用 fdisk 对大于 2TB 的硬盘进行分区. 在这种情况下,我们可以使用 parted 命令.它的主要区别在于 fdisk 使用 DOS 分区表格式而 parted 使用 GPT 格式. 提示:你可以使用 gdisk 来代替 parted. 在本文中,我们将介绍如何将大于 2TB 的新磁盘添加到现有的 Linux 服务器中(如 RHEL/CentOS 或

在linux中添加新硬盘并创建LVM组

1.以虚拟机为例,给虚拟机添加一块新硬盘,并创建LVM组,将新硬盘用于存放oracle数据库文件. 2.fdisk -ll查看新添加的硬盘是否被识别,如图已经识别出sdb. 3.# vcreate /dev/sdb    (创建PV,相当于win中将基础磁盘转换为动态磁盘) 4.# vgcreate oracle_vg /dev/sdb (创建VG,创建虚拟卷组,win中无此概念) 5.# lvcreate -l +100%free oracle_vg -n oracle_lv  (创建LV,L

linux中添加新的swap分区

测试场景:VMware 11 测试系统:Red Hat Enterprise Linux 7 我们都知道linux系统中swap分区都要在独立的分区当中,所以我们要新建一个swap分区: [[email protected] ~]# fdisk /dev/sda 欢迎使用 fdisk (util-linux 2.23.2). 更改将停留在内存中,直到您决定将更改写入磁盘. 使用写入命令前请三思. 命令(输入 m 获取帮助):n #创建新分区 Partition type: p primary (

在CentOS(Linux)中添加单个IP和批量添加多个IP地方法

一.添加单个IP地址: 在/etc/sysconfig/network- s/中新建文件ifcfg-eth0:*,*为数字序号,多个IP则依次增大以0为例,建立文件ifcfg-eth0:0 cd /etc/sysconfig/network- s/vi ifcfg-eth0:0 输入内容格式: DEVICE=eth0:0TYPE=EthernetONBOOT=yesBOOTPROTO=staticIPADDR=要添加绑定的IP地址NETMASK=子网掩码GATEWAY=网关地址 二.批量添加多个

Linux中添加快捷

执行操作比较快捷: 1.R3 CGP平台下OMU系统中: Linux 版本:2.6.16.60-0.21-bigsmp vi /etc/profile 2.R2 Linux版本2.6.5-7.244-smp vi /root/.profile alias cdbin="cd /opt/hlr/hdu/bin" alias cdlog="cd /opt/hlr/hdu/log" alias dslog="cd /opt/hlr/hdu/ds/log"

Linux中添加计划任务与Elasticsearch日志自动清理

一.简述 当日志发送到ELK之后,Elasticsearch随着日志的增加,占用磁盘量会越来越大.这时候,需要我们写角本定期DELETE日志.角本写法,也很简单,只是发送HTTP的DELETE方式到:http://<ip>:<port>/*-yyyy.MM.dd*即可. 二.定期删除Elasticsearch中日志的角本:新建一个es-index-clear.sh到/opt目录下,内容如下: #/bin/bash #es-index-clear #只保留15天内的日志索引 LAST

linux中添加用户后命令行改变

描述: [[email protected] /]# mkdir -p /u01/oracle[[email protected] /]# useradd -g oinstall -G dba -d /u01/oracle/ oracleuseradd: warning: the home directory already exists.Not copying any file from skel directory into it. 而且/u01/oracle目录下没有任何文件. 解决方法: