如何在内核模块中设置进程的CPU亲和性?在用户模式下有一个系统调用sched_setaffinity,但我正在寻找等效的内核模式.
在Linux内核代码中,还有一个名为的函数sched_setaffinity.它是从sys_sched_setaffinity被调用的函数调用的system_call.从它看来,这是我想要使用的功能.它与系统调用同名的事实让我有点不安.
但众所周知,最好的办法就是尝试一下.所以我做了,我的模块编译完毕.但是,当我尝试加载模块时,它会抱怨名称sched_setaffinity未定义.
我正在使用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) 如何使用linux内核的find_module()功能?文档说"必须持有module_mutex".
上下文
我正在调试一组协同工作的内核模块.
模块A模块B的调用功能.在模块A的功能C中的某一点,模块B的使用计数无效.我已经确定这不是在模块B的功能中发生的.我想从C调试模块B的使用计数.为此,我将使用find_module()来获取指向B的指针.
我有一个内核模块可以捕获传出的 Internet 流量(Netfilter 钩子:LOCAL_OUT)在这个钩子上,仍然没有以太网头。
我构建了以太网标头并且它可以使用了,但是如何将它附加到skb以便我可以将整个 skb 结构发送到dev_queue_xmit()?
是否有任何关于如何操作 sk_buff 数据的指南,您可以提供给我以获取更多信息?
作为示例,我尝试对所有 ECHO ICMP 流量执行我想做的操作;这是我的代码。但是当在另一台机器上使用 Wireshark 进行检查时,我得到了一个有效的以太网报头但一个空的 IP 数据包......怎么会?
Run Code Online (Sandbox Code Playgroud)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 …
我有一个简单的内核对象,我为内核内存探测而构建.
如果我在我的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
我正在编写一个内核模块,它应该从用户空间接收消息并通过套接字发回响应.
当程序和模块在同一台机器上并使用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) 如果在初始化和退出模块中使用__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) 我想访问内核内部的性能计数器。我发现了很多在用户空间中使用性能计数器的方法,但是你能告诉我一些在内核空间中使用这些计数器的方法吗?
请不要指定工具名称,我想编写自己的代码,最好是内核模块。我使用的是内核为 3.18.1 的 Ubuntu。
我想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)吗?
我目前的主机系统运行带有 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)