标签: kernel-module

如何从Linux内核模式设置进程的亲和性?

如何在内核模块中设置进程的CPU亲和性?在用户模式下有一个系统调用sched_setaffinity,但我正在寻找等效的内核模式.

在Linux内核代码中,还有一个名为的函数sched_setaffinity.它是从sys_sched_setaffinity被调用的函数调用的system_call.从它看来,这是我想要使用的功能.它与系统调用同名的事实让我有点不安.

但众所周知,最好的办法就是尝试一下.所以我做了,我的模块编译完毕.但是,当我尝试加载模块时,它会抱怨名称sched_setaffinity未定义.

linux kernel kernel-module affinity linux-kernel

6
推荐指数
1
解决办法
2726
查看次数

更改中断描述符表

我正在使用Linux 2.6.26内核版本,我正在尝试使用内核模块更改中断描述符表.我只想在这里更改页面错误表条目.所以我复制了原始IDT并仅对页面错误表条目进行了更改.ISR的目标是在调用原始页面错误处理程序之前打印出页面错误的信息.但是一旦我用insmod加载它就会崩溃内核,即它特意与"loadIDTR"函数崩溃.通过进一步的调试,我发现如果我加载IDTR没有改变任何条目它工作正常.我没有想法.

我已粘贴下面的代码

#include <linux/module.h>   // for init_module() 
#include <linux/init.h>
#include <linux/mm.h>       // for get_free_page()
#include <linux/sched.h>
#include <linux/spinlock.h>

#define SUCCESS 0
#define PGFAULT_INT 0x0E

static char modname[] = "pgfaults";
static unsigned short oldidtr[3], newidtr[3];
static unsigned long long *oldidt, *newidt;
static unsigned long isr_orig, kpage;
static char *why[]={ "sra", "srp", "swa", "swp", "ura", "urp", "uwa", "uwp" };

unsigned long long gate_desc_orig,gate_desc_orig1;

static void my_intrept( unsigned long *tos )
{
    // stack-layout:
    // es,ds,edi,esi,ebp,esp,ebx,edx,ecx,eax,err,eip,cs,efl
    //  0  1   2   3   4 …
Run Code Online (Sandbox Code Playgroud)

kernel-module linux-device-driver linux-kernel

6
推荐指数
2
解决办法
3637
查看次数

如何使用find_module?

如何使用linux内核的find_module()功能?文档说"必须持有module_mutex".

  1. 这是否意味着我应该在搜索指向另一个的指针之前获取模块代码中的锁?
  2. 当这个互斥锁被非模块内核代码锁定时?

上下文

我正在调试一组协同工作的内核模块.

模块A模块B的调用功能.在模块A的功能C中的某一点,模块B的使用计数无效.我已经确定这不是在模块B的功能中发生的.我想从C调试模块B的使用计数.为此,我将使用find_module()来获取指向B的指针.

kernel-module linux-kernel

6
推荐指数
1
解决办法
1314
查看次数

使用 sk_buff 添加以太网帧头

我有一个内核模块可以捕获传出的 Internet 流量(Netfilter 钩子:LOCAL_OUT)在这个钩子上,仍然没有以太网头。

我构建了以太网标头并且它可以使用了,但是如何将它附加到skb以便我可以将整个 skb 结构发送到dev_queue_xmit()

是否有任何关于如何操作 sk_buff 数据的指南,您可以提供给我以获取更多信息?

作为示例,我尝试对所有 ECHO ICMP 流量执行我想做的操作;这是我的代码。但是当在另一台机器上使用 Wireshark 进行检查时,我得到了一个有效的以太网报头但一个空的 IP 数据包......怎么会?

static unsigned int post_icmp_check(unsigned int hooknum,
                 struct sk_buff *skb,
                 const struct net_device *in,
                 const struct net_device *out,
                 int (*okfn)(struct sk_buff *))
{
  struct iphdr *iph;
  struct icmphdr *icmph;
  struct sk_buff *sb;
  struct ethhdr *ethh;
  unsigned char *frame = NULL; //Used just to copy the skb->data and replace it, that's all
  unsigned char *ptr;

  /* Allocations and initial assignations …
Run Code Online (Sandbox Code Playgroud)

c kernel netfilter kernel-module linux-kernel

6
推荐指数
1
解决办法
1万
查看次数

Linux内核模块(*.ko)内核之间的兼容性

我有一个简单的内核对象,我为内核内存探测而构建.

如果我在我的64位Ubuntu(3.2)机器上构建它,它在该机器上工作正常.但它不会在我的64位Ubuntu(3.9)机器上进行insmod.反之亦然.如果我尝试在内核上运行它而不是我构建它的那个,它会给我一个"-1无效的模块格式"错误.

我认为insmod将动态链接到导出的符号表,导出的符号表在内核修订版之间不会发生变化.(它被附加.)

有人能告诉我如何构建一个与未来(或过去)Linux内核兼容的内核模块(.ko),而无需在该内核上重建吗?

这是我的make文件:

ccflags-y = -g

obj-m + = access_mem.o

all:make -C/lib/modules/$(shell uname -r)/ build M = $(PWD)模块

clean:make -C/lib/modules/$(shell uname -r)/ build M = $(PWD)clean

kernel-module

6
推荐指数
1
解决办法
9025
查看次数

从内核模块发送带有套接字的数据包

我正在编写一个内核模块,它应该从用户空间接收消息并通过套接字发回响应.

当程序和模块在同一台机器上并使用IP时127.0.0.1,一切正常.但是,当我在不同的机器上尝试并使用真实的网络IP时,类似的东西192.168.3.146只能以一种方式工作.

我从用户空间收到消息,但我无法从内核收到消息.我使用sock_sendmsg函数从内核发送消息,它不会返回任何错误.此外,我没有从防火墙收到任何来自内核模块的来自另一台机器的消息.

这里有类似的问题和例子,但它们对我来说不够用,或者使用了太旧的内核版本的示例.对于骨架我使用了这个,来自UDP套接字:http://people.ee.ethz.ch/~arkeller/ linux/multi/kernel_user_space_howto-3.html.有帮助吗?

用于发送的内核模块代码:

void send_data(unsigned char *data)
{
    if(!IS_ERR_OR_NULL(data))
    {
        int ret;
        mm_segment_t oldfs;
        struct msghdr message;
        struct iovec ioVector;
        struct sockaddr_in sendAddr;

        sendAddr.sin_family = AF_INET;
        sendAddr.sin_addr.s_addr = INADDR_ANY;
        //sendAddr.sin_addr.s_addr = in_aton("192.168.1.75");
        //here I get port from sk_buff structure that I received.
        sendAddr.sin_port = *((unsigned short*)skBuffer->data);

        memset(&message, 0, sizeof(message));
        message.msg_name = &sendAddr;
        message.msg_namelen = sizeof(sendAddr);

        /* send the message back */
        ioVector.iov_base = data;
        ioVector.iov_len  = strlen(data); …
Run Code Online (Sandbox Code Playgroud)

sockets kernel udp kernel-module linux-kernel

6
推荐指数
1
解决办法
8260
查看次数

__init和__exit属性的用法

如果在初始化和退出模块中使用__init和__exit属性会发生什么,如果我不使用它们会发生什么.示例如下所示.

使用属性

static __init int myinit(void)
{}
static __exit void myexit(void)
{}
Run Code Online (Sandbox Code Playgroud)

Witout属性

static int myinit(void)
{}
static void myexit(void)
{}
Run Code Online (Sandbox Code Playgroud)

operating-system kernel kernel-module linux-device-driver

6
推荐指数
1
解决办法
1121
查看次数

如何在内核内部使用性能计数器?

我想访问内核内部的性能计数器。我发现了很多在用户空间中使用性能计数器的方法,但是你能告诉我一些在内核空间中使用这些计数器的方法吗?

不要指定工具名称,我想编写自己的代码,最好是内核模块。我使用的是内核为 3.18.1 的 Ubuntu。

linux ubuntu performancecounter kernel-module linux-kernel

6
推荐指数
1
解决办法
1517
查看次数

如何访问内核模块中的任何内核符号?

我想getname在我的内核模块中使用该函数。它没有导出。由于我现在遇到了这个问题,我想知道如何访问和使用任何未导出的内核符号。我认为使用一个符号所需的步骤会有所不同,因此我想看看如何为类型(例如,结构)、变量、指针表(如系统调用表)和一个函数。如何在以下任一情况下完成这些操作:

  • 当我从System.map或 中知道符号的地址时/proc/kallsyms
  • 当我知道符号的名称并想用于kallsyms_lookup_name检索它时。

我目前知道如何劫持系统调用,这需要声明类似

asmlinkage <return_type> (*<name_for_system_call>)(<the types of the its arguments separated by commas>);
Run Code Online (Sandbox Code Playgroud)

会使用这样的东西吗?在这个对另一个问题的回答中,海报展示的例子是

#include <linux/kallsyms.h>

static void (*machine_power_off_p)(void);
machine_power_off = (void*) kallsyms_lookup_name("machine_power_off");
Run Code Online (Sandbox Code Playgroud)

但是如果符号返回一个指针呢?我会在 的左边放一个星号(*machine_power_off_p)吗?

c linux kernel-module linux-kernel

6
推荐指数
1
解决办法
6215
查看次数

在 docker 容器内制作/构建内核模块

我目前的主机系统运行带有 docker 的 Mac OS。我的 Mac OS 主机系统生成了一个 docker 容器。

生成的 docker 容器当前正在运行ubuntu:19.10

我正在尝试在 docker 容器内构建内核模块

当我跑步时

$> make
Run Code Online (Sandbox Code Playgroud)

我明白...

Building coolMod driver...
make -C /lib/modules/`uname -r`/build M=/home/foo/coolMod modules
make[1]: *** /lib/modules/4.19.76-linuxkit/build: No such file or directory.  Stop.
make: *** [Makefile:43: coolMod.ko] Error 2
Run Code Online (Sandbox Code Playgroud)

docker 容器没有内核标头。

当我尝试运行时:

$> apt install linux-headers-$(uname -r)
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package linux-headers-4.19.76-linuxkit
E: Couldn't find any package by glob 'linux-headers-4.19.76-linuxkit'
E: Couldn't …
Run Code Online (Sandbox Code Playgroud)

kernel-module linux-kernel docker

6
推荐指数
1
解决办法
1万
查看次数