Articles of linux kernel

在Linux中编译内核代码

好的,我正在阅读关于Linux内核开发的内容,并且有一些使用内核数据结构和内容的代码片断。 比方说,我想尝试一下,例如,有一个非常简单的代码片段: #include <../../linux-2.6.37.1/include/linux/sched.h> struct task_struct *task; for_each_process(task) { printk("%s[%d]\n", task->comm, task->pid); } 看起来很简单,呃? 那么现在我不可能build造这个东西。 我正在使用NetBeans。 sched.h是正确的文件,就像一个人可以按CTRL +点击它,一个被带到正确的文件。 我是否需要包含我的示例文件,并从Makefile构build整个内核? 我只是希望看到它的构build,可能会起作用。 如果我需要构build整个内核,我将如何testing我的东西? 我一定是在做一些非常愚蠢的事情,因为我对内核开发很陌生。 我有点迷路了 多谢你们!

在内核中使用printk

我正试图实现我自己的新schedule() 。 我想debugging我的代码。 我可以在sched.c使用printk函数吗? 我用printk但不起作用。 我错过了什么?

如何获得正确的.config文件来编译特定于我的硬件的Linux内核源代码?

我尝试使用make defconfig编译内核,但正如所料,它启动失败。 我想知道什么.config文件做内核供应商像Canonical Ubuntu的使用,内核是能够开箱即用。 当然,我还是一个初学者,configuration各种参数,目前有点不合我的。 具体来说,我正在寻找加载一个基本的“你好,世界!” 模块到我运行的内核2.6.32.41。 为此,我需要将内核源代码与运行内核所使用的相同的.config文件进行编译。

在Linux上debugging一个简单的字符驱动程序在device_create()上失败

我写了一个简单的字符驱动程序,现在想在udev中使用类自动注册它。 我的代码由驱动程序加载时调用的init函数和驱动程序加载其设备时调用的probe函数组成(当然还有它们的等价的exit和remove )。 问题:一旦添加新设备,执行device_create命令时,我的probefunction失败。 现在我想知道为什么: 我怎么能得到更多的信息,为什么这个命令失败(除了失败)? 缺less任何参数(比如我的全局声明fooClass是否存在问题,是否应该将其移至probe函数,而不是在我眼中做出反应,但在许多示例中显示)? 还是其他监督错误? 我的代码我剥离了大多数返回validation(如IS_ERR() )和清理function的可读性。 这两个variables是全局定义的: static int foo_majNbr; static struct class *fooClass; init函数: static int __init foo_init(void) { int rv; dev_t devNbr; /* Registering driver */ rv = pci_register_driver(&foo_driver); /* —-> see answer below for correct order <—- */ /* Create device class */ fooClass = class_create(THIS_MODULE, CLASS_NAME); /* […]

Linux内核模块编程:makefile

在学习Linux内核模块的同时,我可以看到两种方式来编写Makefile。 第一个是这样的: ifneq ($(KERNELRELEASE),) obj-m := module.o else default: $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules endif 后者不那么复杂: obj-m := module.o all: $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules makefile编译导致成功编译模块 。 我的学习伴随着LDD3书,至今我读到的是下一个: 这个makefile在典型的版本上被读取两次。 当从命令行调用makefile时,会注意到KERNELRELEASEvariables没有被设置。 它通过利用已安装模块目录中的符号链接构build指向内核构build树的事实来定位内核源代码目录。 如果你实际上没有运行正在构build的内核,你可以在命令行提供一个KERNELDIR =选项,设置KERNELDIR环境variables,或者重写在makefile中设置KERNELDIR的行。 一旦find内核源代码树,makefile会调用默认:target,它将运行第二个make命令(在makefile中参数化为$(MAKE))来调用内核构build系统,如前所述。 在第二次阅读时,makefile设置obj-m,内核makefiles负责实际构build模块。 如果makefile被读取两次,那么第二种方法应该导致recursion,不是吗?

无法理解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, […]