问题标签 [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 回答
763 浏览

linux-kernel - 针对 Linux 内核 2.6.21.3 运行的 gphoto2 中的 PTP 错误

希望有一个 gphoto 或 Linux 内核专家在那里闲逛,我在这里问这个问题。我正在尝试为 Linux libgphoto2 库构建一个自定义前端。目前我正在使用 gphoto2 调用图书馆。我在 Etch (Debian 4.0) VM 映像上运行它作为我的测试机器。我从 gphoto-suite svn 存储库主干中提取源代码并毫无问题地构建它。我刚刚构建了套件的 libgphoto2 和 gphoto2 部分,因为这就是我所需要的。当我尝试连接到我的相机 (Canon EOS Rebel XTi) 时,我收到一个 PTP 错误,然后出现一条消息,上面写着“i/o 库中发生错误('未指定错误')”。我发现了一些与 libgphoto2 相似的错误的参考,这些错误散布在具有多个不同内核的多个 Linux 发行版中。最近的一个似乎是在 2.6.28 中,被 gphoto-suite 团队明确宣布为内核错误。参考这里这里

我之前在 Ubunut 的 Hardy Heron 上已经让这个库与这台相机一起使用,所以我知道它过去一直有效。由于我的目标平台是运行 2.6.21 内核的单板计算机,我将 Etch VM 的内核更新为 2.6.21.3 并得到了同样的错误。

那么我的问题是,有谁知道这是否真的是 USB 驱动程序中的一个内核错误,它已经存在了一段时间并且正在内核 2.6.28.4 及更高版本中得到解决,或者它实际上是否是 gphoto2 版本的问题? 由于我无法轻松地将嵌入式设计升级到新内核,我希望这是一个 gphoto 错误。同时,我将尝试构建一些旧版本的 gphoto。

0 投票
1 回答
5291 浏览

c - Linux 内核 2.6 中的计时

我已经阅读了“Linux 设备驱动程序” (可以在此处找到)中的第 7 章,时间可以用“jiffies”来衡量。stock jiffies 变量的问题在于它非常频繁地回绕(特别是如果您将 CONFIG_HZ 设置为 1000)。

在我的内核模块中,我保存了一个设置为未来某个时间的 jiffies 值,并在稍后将其与当前的“jiffies”值进行比较。我已经了解到有些函数会考虑 32 位 jiffy 换行,因此要比较我正在使用的两个值:

我的问题来了:所以现在我想将“some_future_jiffies_value”设置为“now + 10ms”。这可以通过执行以下操作轻松完成:

它是否正确?如果当前 jiffies 接近 MAX_JIFFY_OFFSET 并且 msecs_to_jiffies(10) 的结果值使 some_future_jiffies_value 超过该偏移量,会发生什么情况?它会自动环绕还是我应该添加一些代码来检查这个?有没有让我不必处理这个问题的功能?

更新:

为了避免环绕的东西,我重写了我的睡眠循环:

我认为这更便携对吧?

更新 2:

非常感谢 'ctuffli' 抽出时间回到这个问题,并为我的评论提供一些反馈。我的内核驱动程序现在工作正常,与您向我提供所有这些提示之前的情况相比,它的丑陋程度要低得多。谢谢!

0 投票
3 回答
2686 浏览

linux - 为什么我们在 x86 上需要 zone_highmem?

在 linux 内核中,mem_map是包含所有“结构页面”描述符的数组。这些页面包括 lowmem 中的 128MiB 内存,用于动态映射 highmem。

由于lowmem大小为1GiB,所以mem_map数组只有1GiB/4KiB=256KiB条目。如果每个条目大小为 32 字节,则mem_map内存大小 = 8MiB。但是如果我们可以使用mem_map映射所有 4GiB 物理内存(如果我们在 x86-32 上有这么多可用物理内存),那么 mem_map 数组将占用 32MiB,这不是很多内核内存(或者我错了吗?)。

所以我的问题是:为什么我们首先需要将 128MiB 用于间接高端映射?或者换一种说法,为什么不直接在内核空间中映射所有最大 4GiB 物理内存(如果可用)?

注意:如果我对上面内核源码的理解有误,请指正。谢谢!

0 投票
4 回答
2462 浏览

linux - Linux - 识别拥有物理内存中特定地址的进程

在 Linux 下,我如何知道哪个特定进程拥有/正在使用物理内存中的给定地址?

我知道这可能需要编写一个内核模块来访问一些内核数据结构并将结果返回给用户——我需要知道它是如何完成的,不管它有多复杂。

0 投票
6 回答
14599 浏览

c - 来自 sk_buff 的 IP 地址

我正在编写一个注册 netfilter 钩子的内核模块。我正在尝试通过使用sk_buff->saddr成员来获取调用者的 IP 地址。有没有办法以人类可读的 iexxxx 格式获取 IP?

我找到了这个函数inet_ntop(),但它似乎在内核头文件中不可用。如何将 \xC0\xA8\x00\x01 转换为 192.168.0.1 ?

0 投票
3 回答
12541 浏览

linux-kernel - 如何在 /proc/driver 下创建 proc 条目?

我想在目录下创建一个文件/proc/driver。我想使用类似proc_root_driver(或提供的其他东西)的宏,而不是明确使用“驱动程序/模块名称”。我使用create_proc_entry

谷歌搜索后,我发现了使用的建议proc_root_driver,但是当我使用它时,我得到了错误

此函数中未声明 proc_root_driver

而且,proc_root_driver在 linux/proc_fs.h 中不可用。

我试图声明这样的结构:

编译错误消失了,但文件没有出现在/proc/driveror下/proc。我怎样才能在其中创建一个条目/proc

0 投票
3 回答
1092 浏览

linux-kernel - Netfiler 钩子没有被调用

我正在编写一个内核模块,它使用 netfilter 注册一个钩子。如果我 ssh/telnet 进入加载模块的机器,则不会调用处理程序。

处理函数:

正在为协议 8(外部网关协议)调用钩子。第二个 printk 永远不会被打印。我错过了什么吗?

0 投票
3 回答
36091 浏览

linux - 如何清理 Linux 内核使用的缓存

我想在缓存开始占用过多内存后强制 Linux 内核为应用程序分配更多内存(从“free”的输出可以看出)。

我跑了

(释放磁盘目录/索引节点缓存和页面缓存),我看到只有大约一半的已用缓存被释放 - 其余的仍然存在。我怎样才能知道是什么占用了缓存的其余部分并强制释放它?

0 投票
4 回答
173588 浏览

linux - 查找哪个进程被 Linux OOM 杀手杀死

当 Linux 内存不足 (OOM) 时,OOM 杀手会根据一些启发式方法选择一个要杀死的进程(这是一个有趣的阅读: http: //lwn.net/Articles/317814/)。

如何以编程方式确定最近被 OOM 杀手杀死的进程?

0 投票
5 回答
45656 浏览

linux - Linux 中的直接内存访问

我正在尝试直接访问嵌入式 Linux 项目的物理内存,但我不确定如何最好地指定内存供我使用。

如果我定期启动我的设备并访问 /dev/mem,我可以轻松地读写几乎任何我想要的地方。但是,在这里,我正在访问可以轻松分配给任何进程的内存;我不想做

我的 /dev/mem 代码是(所有错误检查等已删除):

这有效。但是,我想使用其他人不会触及的内存。我尝试通过使用 mem=XXXm 启动来限制内核看到的内存量,然后将 BASE_ADDRESS 设置为高于该值(但低于物理内存),但它似乎并没有始终如一地访问相同的内存。

根据我在网上看到的情况,我怀疑我可能需要一个使用 ioremap() 或 remap_pfn_range() (或两者都使用???)的内核模块(没关系),但我完全不知道如何;谁能帮忙?

编辑:我想要的是一种始终访问相同物理内存(例如,价值 1.5MB)的方法,并将该内存放在一边,以便内核不会将其分配给任何其他进程。

我正在尝试重现我们在其他操作系统中拥有的系统(没有内存管理),我可以通过链接器在内存中分配空间,并使用类似的东西访问它

EDIT2:我想我应该提供更多细节。此内存空间将用于 RAM 缓冲区,用于嵌入式应用程序的高性能日志记录解决方案。在我们拥有的系统中,在软重启期间没有任何东西可以清除或扰乱物理内存。因此,如果我向物理地址 X 写入位并重新启动系统,在重新启动后仍会设置相同的位。这已经在运行 VxWorks 的完全相同的硬件上进行了测试(该逻辑在不同平台上的 Nucleus RTOS 和 OS20 中也能很好地工作,FWIW)。我的想法是通过直接寻址物理内存在 Linux 中尝试同样的事情。因此,每次启动时我都必须获得相同的地址。

我可能应该澄清一下,这是针对内核 2.6.12 和更高版本的。

EDIT3:这是我的代码,首先是内核模块,然后是用户空间应用程序。

要使用它,我用 mem=95m 启动,然后是 insmod foo-module.ko,然后是 mknod mknod /dev/foo c 32 0,然后运行 ​​foo-user ,它死了。在 gdb 下运行表明它在分配时死亡,尽管在 gdb 中,我无法取消引用从 mmap 获得的地址(尽管 printf 可以)

foo-module.c

富用户.c