我一直在使用伯克利实验室(即 BLCR)的这个过程检查点项目。我注意到他们一直在引用内核中的一些函数,这些函数没有被导出,也没有在任何头文件中声明。他们的代码由内核模块和一些用户空间实用程序组成。因此,他们不需要应用任何内核补丁。
他们的配置脚本生成了一些头文件,将这些函数声明为外部函数,然后为每个被调用的函数分配一些指针值。我不确定他们如何生成这些指向函数的指针或他们如何使用它们。
我的问题是:有没有办法调用内核函数而不导出该函数并且不在头文件中声明它?
我已经为 linux 内核编写了一个测试模块。这个模块需要头文件<linux/config.h>和<asm/system.h>. 当我发布时make,它给了我错误fatal error: linux/config.h: No such file or directory
,如果我评论config.h标题,它会
以同样的方式显示asm/system.h: No such file or directory。我尝试搜索问题并遇到了这些标题属于 tikernel-headers包的解决方案。我安装了这个包(虽然它已经安装在我的系统上)。但是后来找不到这两个标题。我找到了autoconf.h从/usr/src/路径软链接的解决方案,但不幸的是我找不到安装在此路径上的任何 headers 文件夹。谁能告诉我我的代码哪里有问题?我使用的是 F20 操作系统,内核版本是 3.12.9-301.fc20.x86_64。
在学习内核线程时,我遇到了这段代码
while(!kthread_should_stop()){
set_current_state(TASK_RUNNING);
/* Doing some stuff here */
set_current_state(TASK_INTERRUPTIBLE);
msleep(1000);
Run Code Online (Sandbox Code Playgroud)
宏set_current_state用于什么以及正在传递的参数是什么。
所以我正在学习编写设备驱动程序并编写了这个简单的驱动程序:
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
static int __init gotemp_init(void)
{
printk(KERN_DEBUG "Hello world");
return 0;
}
static void __exit gotemp_exit(void)
{
}
module_init(gotemp_init);
module_exit(gotemp_exit);
MODULE_AUTHOR("Abhinav Jain");
MODULE_DESCRIPTION("Simple driver");
MODULE_LICENSE("GPL");
Run Code Online (Sandbox Code Playgroud)
生成文件是这样的:
obj-m := hello.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD)
Run Code Online (Sandbox Code Playgroud)
但是 的输出dmesg不打印"Hello world". 我也尝试过,KERN_INFO但结果仍然相同,尽管lsmod显示hello正在加载模块。
那么为什么没有记录消息呢?
我的集群节点主要绑定到 eth0 和 bond0 接口:
[root@machine]# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP qlen 1000
link/ether 00:25:90:68:79:4a brd ff:ff:ff:ff:ff:ff
3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000
link/ether 00:25:90:68:79:4b brd ff:ff:ff:ff:ff:ff
5: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 00:25:90:68:79:4a brd ff:ff:ff:ff:ff:ff
8: gre0: <NOARP> mtu 1476 qdisc noop state DOWN
link/gre 0.0.0.0 brd 0.0.0.0
9: …Run Code Online (Sandbox Code Playgroud) linux kernel network-programming netfilter linux-device-driver
这是一个模糊的问题,因为我自己的理解也同样模糊。我感兴趣的是网络电缆上的零星电压需要发生什么才能导致计算机上运行的程序执行某些操作。
假设我在我的网络服务器上运行 apache2。有人在自己的联网计算机上触发了正确的事件序列,从而导致网络数据到达服务器。然后呢?
我的猜测是主板上有一些外围组件可以侦听数据,然后在 CPU 中引发中断。不知何故,在中断服务例程中,Linux 必须要求 apache2 代码做一些事情。这样对吗?如果是这样,有人愿意分享一些额外的细节吗?
谢谢
我需要在 USB 内核模块中添加一个短暂的延迟,以避免在小型嵌入式 Linux 设备启动时出现极其罕见的内核恐慌。有问题的代码如下。如果我在代码中添加一个 prink,该设备会成功运行一整夜,而之前它曾经失败过。我想添加一个小的延迟,但 usleep_range 和 msleep 会导致内核回溯“在原子时调度”。如何在不睡觉的情况下在这部分代码中添加延迟?是一个while循环来做到这一点吗?
usb_hub_for_each_child(udev, chix, childdev) {
printk(KERN_ERR "r8a66597: Start USB Discover\n");
//usleep_range(10000, 11000);
//preempt_disable();
//msleep(1);
collect_usb_address_map(childdev, map);
//usleep_range(10000, 11000);
printk(KERN_ERR "r8a66597: Stop USB Discover\n");
//msleep(1);
//preempt_enable();
}
Run Code Online (Sandbox Code Playgroud) linux kernel linux-device-driver linux-kernel embedded-linux
我将 PIC 的固件(阵列)存储在头文件 (pic_firmware.h) 中。
该阵列由我的定制板的两个 USB Linux 驱动程序使用。
#ifndef PIC_FIRMWARE_H
#define PIC_FIRMWARE_H
const unsigned char ucPICAppsectorFirmware[] =
{
0xa5,0xef,0x2b,0xf0, 0x12,0x00,0x12,0x00, // Address 0x3000
0x81,0xef,0x29,0xf0, 0x12,0x00,0x12,0x00, // Address 0x3008
0x00,0x00,0xff,0xff, 0xff,0xff,0xff,0xff, // Address 0x3010
0xab,0xef,0x29,0xf0, 0x12,0x00,0xff,0xff, // Address 0x3018
....
}
#endif
Run Code Online (Sandbox Code Playgroud)
当我将两个驱动程序添加为内置驱动程序并在两个驱动程序代码中包含头文件(#include“pic_firmware.h”)时,我收到多个定义错误
| drivers/usb/misc/pic_dfu.o:(.rodata+0x80): multiple definition of `ucPICAppsectorFirmware'
| drivers/usb/misc/usb_mib.o:(.rodata+0xcc0): first defined here
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个错误。谢谢你的时间..
我对 linux 还很陌生,我目前正在尝试将 gps 模块集成到 linux ARM 控制器中。gps 是 ublox NEO M8N,我将它连接到 UART6。我需要帮助才能开始与 GPS 通信。我搜索了一些文件,但找不到任何相关的文件。我知道我首先需要为它编写内核设备驱动程序,但是我不知道从哪里开始。有人可以指出我正确的方向,或者告诉我如何编写设备驱动程序并开始从 GPS 读取纬度和经度。
问题:大多数宏定义甚至头文件都不会被 IDE 查找,因为 IDE 配置中没有指定包含路径。它禁止自动完成和导航。
这是我的Makefile:
#-Wno-declaration-after-statement
ccflags-y := -std=gnu11 -Wno-declaration-after-statement -Werror
obj-m += pfsw.o
pfsw-objs := src/init.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)
我运行make V=1并注意到编译命令和包含路径实际上非常麻烦(计算 Linux 特定-include的参数):
gcc -Wp,-MD,/home/memyself/lkm/procfs_write/src/.init.o.d -nostdinc
-isystem /usr/lib/gcc/x86_64-linux-gnu/7/include
-I./arch/x86/include -I./arch/x86/include/generated -I./include -I./arch/x86/include/uapi
-I./arch/x86/include/generated/uapi -I./include/uapi -I./include/generated/uapi
-include ./include/linux/kconfig.h -Iubuntu/include -include ./include/linux/compiler_types.h
-D__KERNEL__
//tons of options ommitted...
-c -o /home/memyself/lkm/procfs_write/src/init.o
/home/memyself/lkm/procfs_write/src/init.c
Run Code Online (Sandbox Code Playgroud)
问题:有没有办法生成compile-command.json通知 IDE 有关包含路径的信息?还是唯一的解决办法是手动将include路径一一传递给IDE?