问题标签 [linux-kernel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
130056 浏览

c - 在 Linux 内核模块中读/写文件

我知道所有关于为什么不应该从内核读取/写入文件的讨论,而是如何使用/procnetlink来做到这一点。无论如何,我想读/写。我还阅读了 让我发疯 - 你永远不应该在内核中做的事情

但是,问题是 2.6.30 不导出sys_read(). 而是包裹在SYSCALL_DEFINE3. 因此,如果我在我的模块中使用它,我会收到以下警告:

显然insmod无法加载模块,因为链接没有正确发生。

问题:

  • 如何在 2.6.22 之后在内核中读/写(其中sys_read()/sys_open()未导出)?
  • 一般来说,如何SYSCALL_DEFINEn()在内核中使用封装在宏中的系统调用?
0 投票
4 回答
9928 浏览

c - 我可以用模块替换 Linux 内核功能吗?

我进入内核工作是为了我的一些暑期研究。我们希望在特定的 RTT 计算中对 TCP 进行修改。我想做的是将 tcp_input.c 中的一个函数的分辨率替换为动态加载的内核模块提供的函数。我认为这将提高我们开发和分发修改的速度。

我感兴趣的函数被声明为静态,但是我已经用非静态函数重新编译了内核并由 EXPORT_SYMBOL 导出。这意味着该函数现在可供内核的其他模块/部分访问。我已经通过“cat /proc/kallsyms”验证了这一点。

现在我希望能够加载一个模块,该模块可以将符号地址从初始地址重写为动态加载的函数。同样,当模块要被卸载时,它会恢复原来的地址。这是一种可行的方法吗?大家有没有建议如何更好地实施?

谢谢!

与Linux 内核中的模块覆盖功能相同

编辑:
这是我最终的方法。
给定以下函数(我想覆盖它,而不是导出):

像这样修改:

这将预期的函数标识符重新定义为指向原始实现的函数指针(可以以类似方式调用)。EXPORT_SYMBOL() 使地址全局可访问,因此我们可以从模块(或其他内核位置)修改它。

现在您可以使用以下形式编写内核模块:

此模块用动态加载的版本替换原始实现。卸载后,将恢复原始引用(和实现)。在我的具体情况下,我为 TCP 中的 RTT 提供了一个新的估计器。通过使用一个模块,我可以进行小的调整并重新启动测试,而无需重新编译和重新启动内核。

0 投票
4 回答
2579 浏览

linux - 系统调用实际上是如何在 linux 上发生的?

受这个问题的启发

如何强制 GDB 反汇编?

和这个有关

什么是 INT 21 小时?

在 linux 下实际的系统调用是如何发生的?执行调用时会发生什么,直到调用实际的内核例程?

0 投票
5 回答
4646 浏览

c++ - 关于 fork 系统调用和全局变量

我在 C++ 中有这个程序,它分叉了两个新进程:

两个分叉的进程对共享变量进行增量,父进程也这样做。由于该变量属于每个进程的数据段,所以最终值为10,因为增量是独立的。

不过共享变量的内存地址是一样的,可以尝试编译,观察程序的输出。这怎么解释?我无法理解,我以为我知道 fork() 是如何工作的,但这似乎很奇怪..

我需要解释为什么地址相同,尽管它们是单独的变量。

0 投票
6 回答
1029 浏览

io - 以零长度调用 write() 的后果是什么?

在 Linuxwrite()函数中相当高的级别,它过滤掉写入 0 长度缓冲区的请求。这是有道理的。谁愿意让操作系统浪费时间钻透层层以确定没有工作要做?

嗯……我。

它与Linux Kernel 中的 I2C 写确认轮询有关;并且发现如果握手错误时地址(在数据之前在总线上发送)将给出错误,则位碰撞 I2C 驱动程序将给出一个潜在有用的返回代码。

可以在地址之后发送虚拟数据,但不能使用我正在使用的设备。(也许我会尝试阅读......)。

所以问题是:如果内核允许零 (0) 长度写入,将会释放什么样的地狱?

0 投票
4 回答
3207 浏览

linux - linux netfilter 将数据包内容传递给用户空间套接字应用程序

我想写一个Linux2.6 netfilter module,可以检查传入的IP数据包信息,例如dest-ip,source-ip。之后将这些信息传递给应用程序,一旦数据包到达 HOOK ,user space应用程序(即应用程序)将处理这些信息。Socket

我想尝试两种方法:

1. 在netfilter模块内部,做一个fifostruct line,每次数据包到达时hook,将数据包信息放入fifo。并在/proc/examplefilesystem 的帮助下。每次用户空间应用读取/proc/example文件时,都会从fifo头获取一个数据包信息。

我是kernel程序的新手,这个程序使我的内核崩溃了好几次。-_-!我想知道这种方式可能吗?

2. 在 netfilter 模块内部,制作一个 char 设备,用户空间应用程序从这个 char 设备中读取数据包信息。但是我仍然不知道如何确保尽快得到数据包,有什么办法当数据包到达netfilter钩子时,内核会向info用户空间应用程序发送一些信号,然后用户空间应用程序来选择数据包信息?

非常感谢你。

0 投票
2 回答
653 浏览

memory-management - 当 brk 减少然后再次增加时,Linux 内核是否清除了内存?

我只是想知道用户程序通过 brk 系统调用释放的内存会发生什么,然后又回来了。内核是否将其清除或内容未定义?

我相信内核在通过 brk 新分配页面时会清除它们,但是如果返回该页面,然后再次请求返回,我无法确定是否将它们全部归零。我正在浏览 lxr.linux.no 试图找出答案。我也会看看这篇文章中建议的书。

感谢您的回复。

蒂姆

0 投票
2 回答
549 浏览

git - 外部可加载模块的 git commit 哈希

我正在 Linux 源代码树之外(以标准方式)开发一个 Linux 内核模块,并试图自动将驱动程序的 git commit 哈希包含在模块加载期间打印的版本字符串中。Makefile 使用命令计算 git 哈希

但这会获取 Linux 树的 git 哈希,而不是我的驱动程序。您能否告诉 git 在执行命令时查看特定目录,或者是否有更好的方法来解决此问题?

这是使用 git 1.5.4.5 和 Linux 2.6.28

0 投票
4 回答
14396 浏览

linux - 内核编译期间的“missing-syscalls”错误

这些是我在我的机器上编译 linux 源代码的步骤:
1. 将配置文件从 /boot 复制到 /usr/src/kernels/2.6.29.4-167.fc11.i586/ 目录
2. make oldconfig
3.制作

第 3 步失败,出现以下错误:make[1]: *** No rule to make target `missing-syscalls'。停止。

在 x86 机器上编译。有什么建议么 ?如果它不属于这里,请随时关闭此问题。

0 投票
2 回答
13559 浏览

linux - 使用 gcc 编译 64 位 linux 内核

在尝试使用 gcc 编译 64 位 linux 内核时,我看到以下错误:

内核/bounds.c:1:错误:32 位模式不支持代码模型“内核”
内核/bounds.c:1:抱歉,未实现:未编译 64 位模式

这就是gcc -v报告的内容:
使用内置规范。
目标:i586-redhat-linux
配置:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl= http:// bugzilla.redhat.com/ bugzilla --enable-bootstrap --enable-shared --enable-threads=posix -- enable-checking=release --with-system-zlib --enable-__cxa_atexit -- disable-libunwind-exceptions --enable-languages= c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/ java-1.5.0-gcj-1.5.0.0/jre -- enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar - -disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch=i586 --build=i586-redhat- linux
线程模型:posix
gcc 版本 4.4.1 20090725 (红帽 4.4.1-2) (GCC)

我在内核 make 命令行上遗漏了什么吗?还是系统上的 gcc 不支持 64 位编译?