Tag: 内核模块

内核空间中PCI内存的地址映射

我正在尝试从可加载的内核模块读取和写入PCI设备。 因此我按照这篇文章 : pci_enable_device(dev); pci_request_regions(dev, “expdev”); bar1 = pci_iomap(dev, 1, 0); // void iowrite32(u32 val, void __iomem *addr) iowrite32( 0xaaaaaaaa, bar1 + 0x060000); /* offset from device spec */ 但最终设备没有按预期完成他的工作。 然后我查看bar1后面的地址,发现了一个非常大的值ffffbaaaaa004500 。 在这一点上,我真的不明白那里发生了什么,什么是正确的。 我可以将bar1解释为内核地址空间内的地址,该地址直接指向基本地址,该地址是PCI芯片选择地址的0x60000偏移量吗? 如何将写入bar1 + offset的值复制到设备中? 该机制如何在iowrite32和pci_iomap后面工作? 感谢致敬 亚历克斯 PS:我成功测试了同一地址的回读。 注册PCI设备的说明: PCIBAR0 PCI基地址0; 用于存储器映射配置寄存器 PCIBAR1 PCI基地址1; 用于I / O映射配置寄存器 PCIBAR2 PCI基地址2; 用于本地地址空间0 PCIBAR3 PCI基地址3; […]

以编程方式检查运行时是否存在Linux内核模块

我正在编写一个C守护进程,它依赖于两个内核模块的存在才能完成它的工作。 该程序不直接使用这些(或任何其他)模块。 它只需要它们存在。 因此,我想以编程方式检查这些模块是否已加载,以便在运行时警告用户。 在我开始执行诸如解析/proc/modules或lsmod输出之类的操作之前,某个实用程序函数是否已经存在? 类似于is_module_loaded(const char* name) ; 我很确定以前曾经问过这件事。 但是,我认为我错过了正确的搜索条件。

如何从debian 64位上的tcphdr(sk_buff)结构访问数据/有效负载?

我正在使用一个小型防火墙,我必须从端口80(http)中的每个tcp数据包中检索数据以进行解析。 这个代码适用于debian 32位虚拟机,我可以打印每个网页的标题,但是当我尝试加载我的内核模块并通过http端口传输一些数据时,它不打印任何数据。 当我编译时,它只在我的64位计算机上显示那些警告: /home/dev3/C/FIREWALL/firewall.c: In function ‘hook_func’: /home/dev3/C/FIREWALL/firewall.c:179: warning: cast from pointer to integer of different size /home/dev3/C/FIREWALL/firewall.c:179: warning: cast to pointer from integer of different size 有人有任何想法吗? 谢谢。 代码: #include #include #include #undef __KERNEL__ #include #define __KERNEL__ #include #include static struct nf_hook_ops nfho; unsigned int hook_func( unsigned int hooknum, struct sk_buff * skb, […]

Netlink多播内核组

我试图实现的任务实际上非常简单(将字符串“TEST”多播到userland守护程序),但内核模块不能编译。 它会因错误而停止: passing argument 4 of ‘genlmsg_multicast_allns’ makes integer from pointer without a cast [enabled by default] 但它不应该只是我定义的组播组吗? 以下是“澄清”的代码: #include #include #include #include #include #include #include struct sock *nl_sk = NULL; static void daemon(void){ struct sk_buff *skb; void* msg_head; unsigned char *msg; struct genl_family my_genl_family = { .id = GENL_ID_GENERATE, .hdrsize = 0, .name = […]

linux-kernel模块中的系统调用拦截(内核3.5)

我需要用自己的实现替换标准系统调用(例如SYS_mkdir)。 正如我在一些来源中读到的,包括Stackoverflow上的这个问题 , sys_call_table不是自内核版本2.6以来的导出符号。 我尝试了以下代码: #include #include #include #include int (*orig_mkdir)(const char *path); …. int init_module(void) { orig_mkdir=sys_call_table[__NR_mkdir]; sys_call_table[__NR_mkdir]=own_mkdir; printk(“sys_mkdir replaced\n”); return(0); } …. 不幸的是我收到编译错误: error: assignment of read-only location ‘sys_call_table[83]’ 如何更换系统调用? 编辑:有没有内核修补的解决方案?

什么是内核线程?

我刚刚开始编写设备驱动程序和新线程,编写了很多文档来了解线程。 我还有一些疑惑。 什么是内核线程? 它与用户线程有何不同? 两个线程之间的关系是什么? 我该如何实现内核线程? 我在哪里可以看到实现的输出? 谁能帮我 ?。 谢谢。

如何在rmmod上停止Linux内核线程?

我编写了以下代码来创建内核线程: #include #include #include #include #include struct task_struct *task; int data; int ret; int thread_function(void *data) { int var; var = 10; return var; } static int kernel_init(void) { data = 20; printk(KERN_INFO”——————————————–“); task = kthread_create(&thread_function,(void *)data,”pradeep”); task = kthread_run(&thread_function,(void *)data,”pradeep”); printk(KERN_INFO”Kernel Thread : %s\n”,task->comm); return 0; } static void kernel_exit(void) { ret = kthread_stop(task); […]

如何使用Linux内核模块中的Linux系统调用

从Linux内核模块内部调用系统调用时遇到一些困难。 系统调用已经过测试,并且可以从标准的c用户空间程序中正常工作,但我似乎无法获得内核模块来编译和运行它们。 在我的用户程序中,我包含以下代码,系统调用有效: #include #define __NR_sys_mycall 343 extern long int _syscall(long int_sysno,…)__THROW; //and then a simple call is done as such long value = syscall(__NR_sys_mycall); printf(“The value is %ld\n”,value); 但是当我在我的Linux内核模块中尝试相同的事情时,我得到了一堆错误,或者说错误:隐式声明函数’syscall’(如果我不包括_syscall定义)或一长串关于语法的错误if我这样做…所以我的假设是我需要内核空间版本来调用系统调用。 我是对还是错? //My LKM code #include #include #define __NR_sys_mycall 343 static int start_init(void) { long value = syscall(__NR_sys_mycall); printk(“The value is %ld\n”,value); return 0; } static […]

如何使用net_dev_add()API过滤和拦截Linux数据包?

我正在为linux编写以太网网络驱动程序。 我想接收数据包,编辑并重新发送它们。 我知道如何在packet_interceptor函数中编辑数据包,但是如何在此函数中丢弃传入的数据包? #include #include #include #include struct packet_type my_proto; int packet_interceptor(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev) { // I dont want certain packets go to upper in net_devices for further processing. // How can I drop sk_buff here?! return 0; } static int hello_init( void ) { printk(KERN_INFO […]

获取内核模块中的当前时间(秒)

在内核模块中以秒(自纪元开始)获取当前时间的标准方法是什么? 我已经看到了涉及获取xtime的技术,这些技术非常冗长且涉及while循环和锁定。 肯定有更好的办法。 [这不是重复的。 我已经查看了以前关于SO的问题。 许多这些的答案要么没有指定使用的函数,要么错误地引用内核中不允许的time.h]