Tag: linux kernel

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]’ 如何更换系统调用? 编辑:有没有内核修补的解决方案?

在Linux内核中读写primefaces操作实现

最近我看到了primefaces读写的Linux内核实现,并提出了一些问题。 首先是ia64架构的相关代码: typedef struct { int counter; } atomic_t; #define atomic_read(v) (*(volatile int *)&(v)->counter) #define atomic64_read(v) (*(volatile long *)&(v)->counter) #define atomic_set(v,i) (((v)->counter) = (i)) #define atomic64_set(v,i) (((v)->counter) = (i)) 对于读取和写入操作,似乎采用直接方法来读取或写入变量。 除非在某处有另一个技巧,否则我不明白这个操作在汇编域中是否具有primefaces性的保证。 我想一个明显的答案是,这样的操作转换为一个程序集操作码,但即便如此,在考虑不同的内存缓存级别(或其他优化)时,如何保证? 在读取宏上,volatile类型用于转换技巧。 任何人都知道这会如何影响这里的primefaces性? (注意,它不用于写操作)

RDTSCP与RDTSC + CPUID

我正在做一些Linux内核时序,特别是在中断处理路径中。 我一直在使用RDTSC进行计时,但是我最近了解到它并不一定准确,因为指令可能无序发生。 然后我尝试了: RDTSC + CPUID(在这里以相反的顺序)刷新管道,由于超级调用和诸如此类的原因,在虚拟机(我的工作环境)上产生高达60倍的开销(!) 。 无论是否启用了HW Virtualization,都可以使用此function。 最近我遇到了RDTSCP *指令,它看起来像RDTSC + CPUID那样做,但更高效,因为它是一个较新的指令 – 相对而言只有1.5x-2x的开销。 我的问题: RDTSCP作为测量点真的准确吗 ,它是做出时间的“正确”方法吗? 另外要明确一点,我的时间基本上就是这样,内部: 保存当前循环计数器值 执行一种基准测试(即:磁盘,网络) 将当前和上一个周期计数器的增量添加到累加器值,并按单个中断递增计数器 最后,将delta / accumulator除以中断次数,得到每次中断的平均周期成本。 * http://www.intel.de/content/dam/www/public/us/en/documents/white-papers/ia-32-ia-64-benchmark-code-execution-paper.pdf第27页

什么是内核线程?

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

LIST_HEAD_INIT和INIT_LIST_HEAD之间的区别

我正在尝试理解Linux内核链表API。 根据Linux内核链接列表,我应该通过INIT_LIST_HEAD初始化列表头,但是这里(Linux内核程序)建议使用LIST_HEAD_INIT代替。 这是我写的一个工作代码,但我不确定我是否以正确的方式做到了。 有人可以validation它没问题吗? #include #include #include “list.h” typedef struct edge_attr { int d; struct list_head list; } edge_attributes_t; typedef struct edge { int id; edge_attributes_t *attributes; } edge_t; int main () { int i; struct list_head *pos; edge_attributes_t *elem; edge_t *a = (edge_t*)malloc(sizeof(edge_t)); a->id = 12; a->attributes = (edge_attributes_t*) malloc(sizeof(edge_attributes_t)); INIT_LIST_HEAD(&a->attributes->list); for (i=0; id […]

Linux内核与用户空间程序之间的通信

我目前正在编写Linux内核模块,并且在实现与用户空间程序的通信时遇到问题。 此内核模块需要接收用户空间程序发出的任务,并在完成后将结果发送回用户空间程序。 在内核模块执行其工作时,应阻止用户空间程序。 我认为内核用户空间IPC或Unix套接字会很好,但我没有找到谷歌的例子。 目前我丑陋的解决方案是导出chardev并让用户空间程序将请求写入设备文件,并从中读取结果。 但我只能在每次open()调用时发出一个请求,这会导致新问题。 我真的需要一个IPC或类似套接字的东西。 谢谢!

谁在驱动程序代码中调用“probe”函数?

我试图了解mcspi的omap2pandas板的驱动程序代码。 我不明白谁调用probe函数以及此驱动程序代码中的调用链是什么? 连接设备时如何通知驱动程序?

如何理解这个dmesg错误信息?

我编写了这个简单的模块来处理设备并调用它的一些电源管理方法,如.suspend和.resume 。 在初始化时,模块简单地查找特定设备并尝试调用其方法。 #include #include #include #include static int __init mfps_driver_init(void){ struct pci_dev *dev = NULL; struct pci_driver *driver = NULL; struct device *device = NULL; dev = pci_get_device(0x8086, 0x15a2, NULL); if((dev == NULL) || (dev == 0)){ printk(KERN_INFO “LEONZO: NOTHING FOUND SIZE %ld\n”, sizeof(dev)); } else { driver = dev->driver; printk(KERN_INFO “LEONZO: I FOUND […]

为UART启用和测试本地环回

我正在尝试进行UART内部回路测试并提出以下更改 #include #include #include #include #include #include #include #include #include #define CCSR_BASE 0xfe000000 #define UART1_BASE 0x11c000 #define UART1_LEN 0x1000 static volatile unsigned long *uartReg = MAP_FAILED; /* Map in registers. */ static unsigned long *initMapMem(int fd, unsigned long addr, unsigned long len) { return (unsigned long *) mmap(0, len, PROT_READ|PROT_WRITE|PROT_EXEC,MAP_SHARED|MAP_LOCKED, fd, addr); } int uartInitialise(void) […]

Android:杀戮(全部)前景运行App

我正在寻找一种方法从linux内核中杀死前景Dalvik App(主动运行)(使用它的进程ID)? 我怎样才能做到这一点? 有任何想法吗? 内核是否看到正在运行的应用程序的pid? 例如,如何。 Android中的进程管理器/任务管理器实现了这一点 任何线索? 编辑: 我正在看的问题是一种杀死“行为与预期不同”的应用程序的方法。 这种“不同的行为”总是固定的。 可以把它想象成向特定端口发送消息。 如何通过停留在应用程序之外并仍然有权杀死它来杀死它? 这就是为什么我想知道如果不在内核中,我是否必须让这个模块位于框架上。