Tag: linux kernel

知道操作结构的填充位置

我目前正在尝试编写一个Linux驱动程序,为此我有必要了解一些apis以充分利用它们。 我常常遇到一种模式,在这种模式中我开始挖掘function并最终在函数读取的位置: returnType OperationX(args…) { … struct operations_t operations = get_operations(); if(operations->X) return operations->X(args…) } 基本上get_operations()返回一个指向全局结构的指针,该结构包含一个指向运行该操作的实际函数的指针。 我发现使用linux交叉引用挖掘不同的地方然后实际了解实际发生了哪些分配是非常繁琐的。 有更好的更快的方式吗? 一个例子是dma映射 。

如何从Linux framebuffer获取RGB像素值?

我希望使用Linux以最有效的方式获得屏幕像素的RGB值。 所以我决定使用C( fb.h )中的framebuffer库来访问framebuffer设备( / dev / fb0 )并直接读取它。 这是代码: #include #include #include #include #include #include #include #include int main() { int fb_fd; struct fb_fix_screeninfo finfo; struct fb_var_screeninfo vinfo; uint8_t *fb_p; /* Open the frame buffer device */ fb_fd = open(“/dev/fb0”, O_RDWR); if (fb_fd < 0) { perror("Can't open /dev/fb0\n"); exit(EXIT_FAILURE); } /* Get fixed […]

为什么Coredump文件不在这里生成?

我在这里有一个情况,几天前我能够在我的目标板上看到核心笨拙的文件,我通过在我的/etc/profile中添加“ulimit -c unlimited”来提供coredump生成支持。但是有人告诉我 这只会对从登录shell启动的程序产生影响,而不会对systemd启动的进程/服务产生影响,等等/限制将是设置这些默认设置的正确位置。 所以我更改了/ etc / limits文件并添加了“ulimit -c unlimited”行。但是现在我看不到Coredumped文件 我正在运行kill -9 $$来生成分段错误,它反过来会像之前那样生成coredump文件。 我们尝试更改“/ proc / sys / kernel / core_pattern”文件并明确地运行ulimit -c unlimited但它也没有运行 我们在哪里做错了?

将V = s Flage传播到所有子makefile

当我使用make构建内核模块时,我会得到这种日志 CC[M] module1 CC[M] module2 CC[M] module3 CC[M] module4 即只是编译或链接有关当前正在处理的任何模块的信息。 我需要知道哪些命令实际编译模块源代码的完整信息,这些命令中使用的flags是什么等等 gcc -Wall abcd.c 我甚至通过设置V=s , V=1 , -n和-d来检查它,但是无法得到我想要的东西。 请告诉我如何使V=s传播通过每个后续的makefile。 它可以通过如何通过exporting来完成? 谢谢

如何将内核模块中的自定义Linux信号广播到所有正在运行的进程

我编写了一个内核模块,它向用户空间提供有关硬件中断的一些信息。 目前,用户空间应用程序使用IOCTL将其PID x发送到内核模块。 然后内核模块使用此PID查找任务并发送信号: #define CUSTOM_SIGNAL 44 struct siginfo info; memset(&info, 0, sizeof(struct siginfo)); info.si_signo = CUSTOM_SIGNAL; info.si_code = SI_QUEUE; info.si_int = 0; struct task_struct *t = pid_task(find_pid_ns(x, &init_pid_ns), PIDTYPE_PID); send_sig_info(CUSTOM_SIGNAL, &info, t); 这非常有效。 但是,我发现维护单个信号的PID接收器动态列表相当棘手。 出于这个原因,我想广播信号默认为所有正在运行的进程(所以他们不需要注册通知 – 它只是发生)。 我能想到的一个模仿这种行为的例子是系统关闭信号。 是否可以简单地广播我的CUSTOM_SIGNAL,或者我是否需要迭代所有PID,如上所述逐个发送。 或者是否有代表广播的特殊任务?

如何编写从汇编代码调用的C函数

我需要编写一个C函数,它将从linux内核中的汇编代码中调用。 应该考虑哪些特殊问题? 我有一些想法,但任何人都可以提供更多细节: (1)召集会议 确保组件中的呼叫者和c中的被叫者握手良好。 但是我应该使用哪种调用约定? 如何声明c函数并在汇编代码中声明它? (2)保护寄存器 在调用之前,应将某些寄存器保存在程序集中。 我粗略记得他们是eax,ecx和edx。 但我不需要保存它们,除非我需要在调用C函数之前引用旧值,对吧? 还有什么其他问题?

在内核中查找进程的程序计数器

我正在尝试跟踪内核中特定进程的PC值。 为此,我查看了内核源代码并发现pc存储在task_struct->stack ,为了理解堆栈,我需要将其转换为struct thread_info * 。 因此,在gdb中,我设置了一个断点b scheduler_tick (每10ms调用一次)。 但是,当我打印出p/x ((struct thread_info *)curr->stack)->cpu_context.pc ,我收到的值为$4 = 0x804d19d8 。 我预计PC将低于0x80000000因为我的内核中的0x80000000以上的地址被配置为内核空间。 在查看内核的objdump输出时,我看到pc指向__schedule 。 对于我从用户空间开始的进程,PC不应该指向用户空间指令吗? 我的理解是,当一个中断被触发时,寄存器状态被保存,中断被服务,然后寄存器状态被恢复,所以程序继续,就像“没有”发生一样。

在linux中断的上下文中运行用户线程

我正在编写一些自定义应用程序,并允许在linux内核中更改中断处理程序代码。 我有一个等待中断发生的用户线程。 如果发生中断,那么我想要做的第一件事就是执行该用户线程。 有没有办法让它发挥作用。 谢谢

在Linux 3.x上挂钩sys_execve()

我试图通过修改系统调用表来挂钩Linux 3.x内核上的sys_execve()函数。 问题是sys_execve()只应在执行失败时返回错误代码。 使用我正在使用的包装器函数(见下文),当在有效的可执行文件上调用sys_execve()时,它执行正常并且一切正常。 但是,当调用不存在的文件或导致错误情况的其他内容时,调用程序将崩溃: segfault at 3b ip 000000000000003b… 使用strace来检查钩子sys_execve()的返回值,显示-1或ENOSYS而不是正确的错误代码,这让我感到困惑,因为我检查了我的包装器函数的程序集以及sys_execve()的Linux源代码。 有关为什么我的包装器没有正确传递错误代码的任何建议? asmlinkage long new_execve(const char* name, const char const** argv, const char const** envp, struct pt_regs* regs) { return orig_func(name, argv, envp, regs); }

为什么我们需要围绕块宏的括号?

在linux中, container_of宏被包含在看似“额外”的括号中: #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); (type *)( (char *)__mptr – offsetof(type,member) );}) 而不是它,我们可以使用 #define container_of(ptr, type, member) { \ const typeof( ((type *)0)->member ) *__mptr = (ptr); (type *)( (char *)__mptr – offsetof(type,member) );} ? 括号是强制性的还是只是为了预防?