Articles of linux kernel

无法理解Linux内核模块中read_proc的工作

我正在阅读此页面上的内核模块示例 程序中使用的read_proc如下所示: int fortune_read( char *page, char **start, off_t off, int count, int *eof, void *data ) { int len; if (off > 0) { *eof = 1; return 0; } /* Wrap-around */ if (next_fortune >= cookie_index) next_fortune = 0; len = sprintf(page, "%s\n", &cookie_pot[next_fortune]); next_fortune += len; return len; } 有人可以解释为什么off被检查为大于0.此外,有人可以解释什么是closures和计数论证的重要性。 到目前为止,我的理解是,我们必须在页面上写入数据,并且在数据结束时必须设置eof。 谢谢。

/ proc / sys / kernel / sched_child_runs_first是否工作?

我知道在/proc/sys/kernel/sched_child_runs_first中设置一个非零值会强制subprocess在父进程之前运行。 不过,我认为这似乎没有奏效。 这是我的代码: #include <stdio.h> #include <sys/types.h> int main(int argc, char **argv) { pid_t child_pid; switch(child_pid = fork()) { case 0: printf("In Child\n"); exit(0); case -1: printf("Could not fork()\n"); default: printf("In parent\n"); } return 0; } 我得到的输出总是: In parent In Child 我在这里期待什么错吗? PS:我只是试着看看它是否有效,所以请不要提出其他的同步机制,或者为什么这是一个坏主意,等等。

如何用QEMU和KGDBdebuggingLinux内核?

我已经能够使用以下方式启动一个基于powerpc的系统(MPC8544DS具体)来调用qemu(v1.7.0) qemu-system-ppc -M mpc8544ds -m 512 -kernel zImage -s -nographic -initrd busyboxfs.img -append "root=/dev/ram rdinit=/bin/sh kgdboc=ttyS0,115200 kgdbwait" 其中zImage是一个自定义交叉编译的Linux Kernel(v2.6.32),它已经启用并编译了KGDB(用于启动代码debugging),而busyboxfs.img是基于busybox的rootfs。 因为我使用-s标志到Qemu,所以我可以使用cross gdb插入到内核中,如下所示: (gdb) target remote localhost:1234 Remote debugging using localhost:1234 mem_serial_in (p=<value optimized out>, offset=5) at drivers/serial/8250.c:405 405 } 但是,如果我删除-s标志并试图通过/dev/ttyS0破解内核,它会给我一个权限被拒绝的错误: (gdb) set remotebaud 115200 (gdb) target remote /dev/ttyS0 permission denied 是因为它被Qemu所控制吗? 另外,在互联网上的例子中,kgdboc已经被设置为ttyAMA0 ,我已经理解了代表AMBA总线,这是基于ARM的系统特有的。 我们有类似的PowerPC吗? 我在这里做错了什么?

符号链接背后是什么?

UNIX / Linux系统如何在内部pipe理符号链接。 已知即使没有实际的目标文件(悬挂链接),也可能存在符号链接。 那么在内部代表一个符号链接是什么呢? 在Windows中,答案是reparse point 。 问题: 在UNIX / Linux中,答案是一个inode吗? 如果是,那么inode号码是否与目标和链接相同? 如果是的话,链接索引节点可以具有不同于目标索引节点(如果存在)的权限?

dynamic添加条目到sysctl

考虑这个代码: int procmon_state = 0; static struct ctl_table_header *procmon_table_header; static ctl_table state_table[] = { { .procname = "state", .mode = 0666, .proc_handler = &proc_dointvec_minmax, .data = &procmon_state, .maxlen = sizeof(int), .extra1 = "\x00\x00\x00\x00" /*0*/, .extra2 = "\x01\x00\x00\x00" /*1*/ }, { 0 } }; static ctl_table procmon_table[] = { { .procname = "procmon", .mode = 0555, […]

只有当它们出现在insmoded Linux Kernel模块中时,如何使用导出的符号?

我正在修改一个Linux内核,将一些function添加到Linux虚拟服务器(LVS)。 我开发了一个模块(我称之为net/netfilter/ipvs/ip_vs_utils.c ),其中包含一些用于负载平衡的function。 这里所有的函数都使用EXPORT_SYMBOL()来导出。 这个模块在逻辑上并不是一直加载。 我的意图是让用户决定是否要使用这个附加function(加载或卸载模块)。 我的问题是,我怎样才能从现有的(当然是修改的)模块( net/netfilter/ipvs/ip_vs_core.c )中OPTIONALLY(取决于模块是否在运行)调用这些函数。 像这样的东西: if(ip_vs_utils_IsLoaded) { function1(arg1, arg2, arg3); // being function1 defined on ip_vs_utils.c }

内核中的malloc

当我尝试在内核模块中使用malloc ,我从编译器中收到一条错误消息。 我的代码: res=(ListNode*)malloc(sizeof(ListNode)); 编译器的错误信息是: /root/ex3/ex3mod.c:491: error: implicit declaration of function 'malloc' 我该怎么办?

ARM汇编“retne”指令

我目前正在理解Linux内核启动的过程。 我正在浏览Linux内核源代码树,特别是ARM架构,直到我偶然发现arch / arm / kernel / hyp-stub.S中的这个汇编指令retne lr 从概念上讲,很容易理解的是,如果Z标志为0,则指令将返回到存储在链接寄存器中的地址。我正在寻找的是这个ARM汇编指令的实际logging。 我在“ ARM体系结构参考手册”ARMv7-A和ARMv7-R版本 A8.8中进行了search,找不到指令说明。 剔除源代码,看看它是否是一个ARM特定的GNU AS扩展,并没有特别的说明。 一个谷歌search与查询“臂大会ret指令”,“arm返回指令”和类似的东西沿线没有什么有用的。 当然,我必须在错误的地方寻找,否则我一定会错过一些东西。 任何澄清将不胜感激。

Linux CFS计划代码在哪里?

我有完整的Linux版本3.13的源代码。 我试图findCFS调度程序的源代码,根据stream行的书籍应该驻留在/kernel/sched.c中的基本调度程序代码和/kernel/sched_fair.c专门为CFS代码。 我只是在我的3.13 linux代码里面的这两个文件做了一个代码全局search,结果没有任何结果。 我还单独search了/linux-3.13/kernel文件夹和/linux-3.13/kernel/sched文件夹。 仍然没有运气。 我想让别人知道CFS在新的linux内核代码域(linux-3.13。*)中的位置。 请原谅,如果我在这里失去了一些东西。 我是一个初学linux内核的人。

未注册端口重组错误的nf_conntrack_helper_register

我有以下代码来注销和注册sip conntrack从内核3.18 static void __nf_conntrack_sip_fini(void) { int i, j; for (i = 0; i < ports_c; i++) { for (j = 0; j < ARRAY_SIZE(sip[i]); j++) { if (sip[i][j].me == NULL) continue; nf_conntrack_helper_unregister(&sip[i][j]); } } memset(sip, 0, sizeof(sip)); } static int __nf_conntrack_sip_init(void) { int i, j, ret; if (ports_c == 0) ports[ports_c++] = SIP_PORT; for […]