我正在尝试获取 Linux 内核模块中的当前屏幕亮度。但是,我不知道如何访问亮度变量,尽管可以使用 sysfs 接口在用户空间应用程序中轻松获取它。
请让我知道有关此问题的线索。
谢谢。
我想要实现的任务实际上非常简单(将字符串“TEST”多播到用户态守护程序),但内核模块无法编译。它因错误而停止:
\n\npassing argument 4 of \xe2\x80\x98genlmsg_multicast_allns\xe2\x80\x99 makes integer from pointer without a cast [enabled by default]\nRun Code Online (Sandbox Code Playgroud)\n\n但不应该只是我定义的多播组吗?
\n\n这是“澄清”的代码:
\n\n#include <linux/module.h>\n#include <net/sock.h>\n#include <linux/netlink.h>\n#include <linux/skbuff.h>\n#include <linux/string.h>\n#include <net/netlink.h>\n#include <net/genetlink.h>\n\nstruct sock *nl_sk = NULL;\n\nstatic void daemon(void){\n struct sk_buff *skb;\n void* msg_head;\n unsigned char *msg;\n\n struct genl_family my_genl_family = {\n .id = GENL_ID_GENERATE,\n .hdrsize = 0,\n .name = "family_name",\n .version = 1,\n .maxattr = 5\n };\n\n struct genl_multicast_group my_mc_group = {\n .name = "mc_group",\n };\n\n\n msg = "TEST";\n skb = genlmsg_new(NLMSG_GOODSIZE, …Run Code Online (Sandbox Code Playgroud) 我正在尝试处理中断,但由于 ioread32,我收到以下错误。
\n\n正如我在《AM335x SitaraTM 处理器 - 技术参考手册》的“25.3.3 中断特性”一章中看到的
\n\n为了在 GPIO 引脚上发生定义的事件(电平或逻辑转换)时向主机处理器生成中断请求,必须按如下方式对 GPIO 配置寄存器进行编程:
\n\n\xe2\x80\xa2 必须在 GPIO_IRQSTATUS_SET_0 和/或 GPIO_IRQSTATUS_SET_1 寄存器中启用 GPIO 通道的中断。
\n\n\xe2\x80\xa2 必须在 GPIO_LEVELDETECT0、GPIO_LEVELDETECT1、GPIO_RISINGDETECT 和 GPIO_FALLINGDETECT 寄存器中选择输入 GPIO 上触发中断请求的预期事件。
\n\n[ 1737.604270] Loading hello_interrupts module...\n[ 1737.604426] HI: Initialized GPIO #36 to IRQ #164\n[ 1737.604478] Unhandled fault: external abort on non-linefetch (0x1028) at 0xfa1ac02c\n[ 1737.612611] Internal error: : 1028 [#1] SMP THUMB2\n[ 1737.617696] Modules linked in: hello_interrupts(O+) g_multi libcomposite omap_rng mt7601Usta(O) [last unloaded: hello_interrupts]\n[ 1737.630128] CPU: 0 …Run Code Online (Sandbox Code Playgroud) c++ kernel-module embedded-linux beagleboard beagleboneblack
我有几个需要与用户空间交互的内核模块。因此,每个模块都有一个 Netlink 套接字。
我的问题是这些套接字相互干扰。这是因为它们都注册到同一个 Netlink 地址族(因为一开始可用的地址族不多 - 最大值为 32,并且超过一半已经被保留),而且因为它们都将自己绑定到相同的 pid(内核 pid - 零)。
我希望地址家族有更多的空间。或者,更好的是,我希望可以将我的套接字绑定到其他 pid。如果一次只能打开 32 个套接字,为什么 Netlink 是首选的用户内核通道?
netlink 地址(端口)由 32 位整数组成。端口 0(零)是为内核保留的,指的是每个 netlink 协议族的内核端套接字。其他端口号通常指用户空间拥有的套接字,尽管这不是强制的。
最后一个说法现在看来是一个谎言。内核使用常量作为 pid,并且不导出更多通用函数:
if (netlink_insert(sk, 0))
goto out_sock_release;
Run Code Online (Sandbox Code Playgroud)
我想我可以重新编译内核并增加地址族限制。但这些是内核模块;我不应该这样做。
我错过了什么吗?
相当长一段时间以来,我一直在尝试调试我的设备在玩大型游戏时出现的重大滞后/卡顿现象。在对我的 logcat 进行了大量分析之后,我觉得我已经确定了导致难以忍受的延迟峰值的原因。每当出现滞后峰值时,logcat 中就会始终显示以下错误:
E/lowmemorykiller:
Error opening /dev/memcg/apps/uid_99032/pid_5430/memory.soft_limit_in_bytes; errno=2
Run Code Online (Sandbox Code Playgroud)
它反复出现,就好像它一遍又一遍地试图杀死它一样。UID 和 PID 有时会有所不同。据推测,主线程每次试图杀死它但未能成功时都会挂起很短的时间。为什么会发生这种情况?
下面的错误也重复出现,混合在上述错误的出现中。这可能与问题有关:
E/ANDR-PERF-RESOURCEQS: Failed to apply optimization [4,0]
Run Code Online (Sandbox Code Playgroud)
有时它会[2,0]代替[4,0]. 这些消息在我的 logcat 中显示得确实过多。
检查我的活动进程后,提到的 UID 和 PID 始终与Android System Webview. 我通过转到“设置”中的“开发人员选项”中的“运行进程”找到了这些进程的源应用程序。在那里,正在运行的进程被列为com.google.android.webview:sandboxed_process0,并且对于每个可能具有正在运行的 Web 视图的应用程序来说,它有多个实例。通过检查该进程的信息,可以得知哪个包启动了它。因此,它们源自我手机上的各种应用程序,有时甚至是我正在玩的游戏本身。因此,这似乎是内核的 lowmemorykiller (LMK) 模块的问题,比我安装的任何特定应用程序更有可能出现问题。
任何人都知道导致此问题的原因、错误的真正含义、如何修复或解决它、为什么 LMK 无法杀死 webviews,或者到底发生了什么?我至少正在寻找一种方法来控制 LMK 忽略尝试杀死 webview,以防止它在失败时挂起主线程,或者强制它成功杀死它们。
由于某种原因,我在 Kernel Adiutor 中没有修改 LMK 参数的部分。我的手机正试图(大概)杀死这些网页视图,尽管仍然有大量可用的可用 RAM,但min_freeKernel Adiutor 中的参数远不及我当时剩余的可用 RAM 量,所以有些事情正在发生在。
我一度怀疑这可能是由于我的手机上安装的应用程序数量过多(800-900)造成的。我已将其降低到约 600 个应用程序,但问题仍然存在。我认为拥有太多应用程序不再是问题,尽管它肯定可能是。
我正在运行官方 ResurrectionRemix 8.1 ROM,并使用 ROM 的默认内核和固件。这个问题出现在非官方 RR LuisROM 上,甚至在我完全擦除/干净刷新到我当前使用的官方 RR …
背景:我正在使用 Pixel 4,build QQ2A.200501.001.B2,它是 Android 10。当我从官方源构建内核并刷新它时,触摸屏、WLAN 和其他功能不起作用。我追踪到这个事实是内核模块/vendor/lib/modules没有更新,因此新内核无法加载它们中的任何一个。我尝试仅刷新boot.img整个 AOSP,同样的问题,它们没有更新。我可以通过手动将我构建的内核模块推送到设备并按insmod正确的顺序手动加载它们来解决此问题。
所以我的问题是:
当然必须有一种“官方”方式来做到这一点?内核模块通常是如何部署的?
一些注意事项:
我无法将它们推送到/vendor/lib/modules,因为我无法重新/vendor挂载可写:
flame:/ # mount -o rw,remount /vendor
'/dev/block/dm-5' is read-only
Run Code Online (Sandbox Code Playgroud)
禁用dm-verity似乎没有帮助。
我注意到 AOSP 源包含 中的所有模块/vendor/lib/modules,位于它采用内核映像形式的同一位置(在我的例子中是device/google/coral-kernel)。因此,很自然地,我尝试用我构建的模块替换那里的模块,但是在构建和刷新之后,我发现其中/vendor/lib/modules仍然包含旧模块。
AOSP 文档说不再boot.img包含 ramdisk,它现在位于system分区中。另外,OverlayFS如果我没读错的话,应该使用“供应商覆盖”来更新那里的文件。但是,在我的设备上,没有product/vendor_overlay像文档所说的那样的目录,只有product/overlay/. 我也不确定这是否是解决这个问题的正确方法,或者我将如何在我的情况下创建这样的覆盖。
谢谢
android kernel-module linux-kernel android-source android-kernel
我想将linux 内核源代码树中提供的触摸屏驱动程序添加到我的 Yocto 映像中(该链接会将您带到goodix.c)。我基本上需要将其添加为内核模块。
我遵循Yocto Mega 手册的合并树外模块部分。我的基础是他们的示例内核模块配方,称为hello-mod。
goodix-9271_0.1.bb:RPROVIDES_${PN} = "kernel-module-goodix"layer.conf:MACHINE_EXTRA_RDEPENDS += "kernel-module-goodix"我的构建始终失败do_rootfs:
Error:
Problem: package packagegroup-base-1.0-r83.imx6ul_var_dart requires packagegroup-machine-base, but none of the providers can be installed
- package packagegroup-base-extended-1.0-r83.imx6ul_var_dart requires packagegroup-base, but none of the providers can be installed
- package packagegroup-machine-base-1.0-r83.imx6ul_var_dart requires kernel-module-goodix, but none of the providers can be installed
- conflicting requests
- nothing provides kernel-module-goodix-5.4.3-imx6ul+gb40ccfdb73ea …Run Code Online (Sandbox Code Playgroud) 我正在编写一个使用导出符号的linux内核模块 open_exec
struct file *open_exec(const char *name)
Run Code Online (Sandbox Code Playgroud)
它返回一个指针,我可以检查IS_ERR宏的错误:
if (IS_ERR(file))
return file;
Run Code Online (Sandbox Code Playgroud)
在编译期间,我收到此警告:
warning: return makes integer from pointer without a cast
Run Code Online (Sandbox Code Playgroud)
这是因为我的函数返回一个整数.如果我尝试施放它:
return (int) file;
Run Code Online (Sandbox Code Playgroud)
我没有在我的32位机器上收到警告,但我在64位机器上发出警告:
warning: cast from pointer to integer of different size
Run Code Online (Sandbox Code Playgroud)
这是因为sizeofint和指针在32位上是相同的,但它们在64位机器上是不同的.
无论是否投射,代码似乎都有效.我只是想摆脱警告.
如何正确地转换指向整数的指针并获得我期望的值,同时没有得到编译器警告?我期望的值本质include/asm-generic/errno-base.h上是linux内核代码库中列出的整数.
因为我只是看指针就好像它是一个整数,如果IS_ERR()是真的,我可以肯定它实际上只保留一个整数值.
我想修改从机器上的所有数据包outcoming的东西我在这个内核模块指定的源IP,但每次我尝试访问nh.iph-> SADDR我得到一个错误的编译时间,上面写着结构sk_buff中没有成员这个名字叫
什么我在做错了什么?我错过了一些标题还是什么?
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/skbuff.h>
#include <linux/ip.h> /* For IP header */
#include <linux/inet.h> /* For in_aton(); htonl(); and other related Network utility functions */
static struct nf_hook_ops nfho;
unsigned int hook_func(unsigned int hooknum,
struct sk_buff **skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
struct sk_buff *sb = *skb;
struct in_addr masterIP;
masterIP.s_addr = htonl (in_aton("192.168.1.10"));
sb->nh.iph->saddr = masterIP.s_addr; …Run Code Online (Sandbox Code Playgroud)