Tag: linux kernel

读取内核空间中的符号链接

我正在写一个LKM,需要找出特定符号链接指向的位置。 基本上我需要syscall readlinkat (或readlink )的function,但在内核空间。 是否有捷径可寻? 直接使用readlinkat对我来说不起作用,我总是得到EFAULT(我想这是因为我的缓冲区显然是在内核内存空间而不是用户空间)。

在ARM Linux中,每个线程在内核堆栈“底部”保留​​的少数字节的目的是什么

问题 : 为什么在创建内核堆栈的“底部”时保留8个字节? 背景 : 我们知道struct pt_regs和thread_info共享相同的2个连续页面(8192个字节),其中pt_reg位于较高端, thread_info位于较低端。 但是,我注意到这两个页面的最高地址保留了8个字节: 在arch / arm / include / asm / threadinfo.h中 #define THREAD_START_SP (THREAD_SIZE – 8)

为什么kfifo.h充满#define语句

kfifo.h几乎完全由#define 。 这是为什么? 为什么他们没有在h文件中声明函数,就像它“正常”完成一样。 [编辑] 似乎我的问题很容易被解释为对实施的质疑,而不是我要问的问题,从学习的角度来看,为什么这种实施更好。 无论如何,因为我不知道我在看“函数式宏”我投票结束,因为它显然是重复的。

检查是否错误!= EINTR:这是什么意思?

我发现这段代码多次使用(也是一个类似的代码,它使用的是open()而不是write() )。 int c = write(fd, &v, sizeof(v)); if (c == -1 && errno != EINTR) { perror(“Write to output file”); exit(EXIT_FAILURE); } 为什么检查&& errno != EINTR在这里? 寻找男人的 errno我发现了关于EINTR的以下文字,但即使我访问了man 7 signal ,也没有启发我。 EINTR中断函数调用(POSIX.1); 见信号(7)。

对于在预处理器阶段展开的循环宏?

我想使用gcc预处理器编写几乎相同的代码声明500次。 让我们说出于演示目的,我想使用宏FOR_MACRO : #define FOR_MACRO(x) \ #for i in {1 … x}: \ const int arr_len_##x[i] = {i}; 并调用FOR_MACRO(100)将转换为: const int arr_len_1[1] = {1}; const int arr_len_2[2] = {2}; … const int arr_len_100[100] = {100};

如何使用该目录的文件描述符在内核级别打开目录?

我正在开发一个项目,我必须打开一个目录并读取内核级别的文​​件/目录。 我基本上试图找出如何在内核级别实现ls 。 现在我已经弄清楚如何使用sys_open()和O_DIRECTORY flag获取目录的文件描述符,但我不知道如何读取我收到的fd。 如果有人有任何提示或其他建议,我会很感激。 (请记住,这必须在内核级别完成)。 编辑:长话短说,对于学校项目,我正在实现文件/目录属性。 我在storring属性的位置是具有给定属性的文件的同一级别的隐藏文件夹。 (因此Desktop / MyFolder中的文件有一个名为Desktop / MyFolder / .filename_attr的属性文件夹)。 相信我,我不在乎内核中的乱码。 但我需要在内核级别读取目录的原因是因为它是项目规范的一部分。

编译内核模块,头文件问题,makefile问题

好吧,我正在尝试编译一个简单的内核模块,当我指向包含包含的任何下面的内容时,它会抱怨各种各样的东西。 linux-headers-2.6.31-21 linux-headers-2.6.31-22 linux-headers-2.6.31-21-generic linux-headers-2.6.31-22-generic linux-headers-2.6.31-21-generic-pae linux-headers-2.6.31-22-generic-pae 我正在尝试按照以下网站上的说明操作: http : //www.faqs.org/docs/kernel/x145.html 我更新了make文件,如下所示: TARGET := hello_world WARN := -W -Wall -Wstrict-prototypes -Wmissing-prototypes INCLUDE := -isystem /usr/src/linux-headers-2.6.31-22-generic/include CFLAGS := -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE} CC := gcc ${TARGET}.o: ${TARGET}.c .PHONY: clean clean: rm -rf ${TARGET}.o 例如,当我输入make时,我得到以下错误以及更多,调查文件夹,我看到处理器和缓存文件是asm-generic,如果它不指向,我应该如何编译它文件的正确位置? /usr/src/linux-headers-2.6.31-22-generic/include/linux/prefetch.h:14:27: error: asm/processor.h: No such file or directory /usr/src/linux-headers-2.6.31-22-generic/include/linux/prefetch.h:15:23: error: asm/cache.h: […]

如何限制用户或应用程序使用大页面支持?

我们部署和使用(内部本地应用程序)所有实际使用hugepage并使用mmap()系统调用。 但我宁愿限制一些应用程序实际使用大页面支持。 这可以通过代码中的任何更改或可以实现的任何系统范围的配置选项来实现吗? 如果需要,我将很快更新系统调用上的一些代码示例。

正确的方式加入两个双链表

在Linux内核源代码中, list_splice使用__list_splice实现: static inline void __list_splice(const struct list_head *list, struct list_head *prev, struct list_head *next) { struct list_head *first = list->next; // Why? struct list_head *last = list->prev; first->prev = prev; prev->next = first; last->next = next; next->prev = last; } list已经指向链表的头部? 为什么我们需要取下list->next ?

如何等待linux内核线程(kthread)退出?

我刚刚开始编写Linux内核线程。 我有一个问题,我想与你们分享。 我的代码是: void do_big_things(void *data) { // do some really big things } struct task_struct *t1; struct task_struct *t2; void calling_fucntion() { for(j =0; j < 100; j++) { t1 = kthread_run(do_big_things, &data1, "thread1"); t2 = kthread_run(do_big_things, &data2, "thread2"); } } 现在,据我所知,这个问题(我可能错了)是线程t1和t2是由内核创建并运行的,然后程序在循环开始时返回创建并运行另外两个线程。 由于没有条件等待这些线程完成,内核会创建如此多的线程,从而导致堆栈溢出。 我想要的是知道如何使程序等待这两个线程完成然后返回循环开始另外两个线程。 任何帮助,将不胜感激。