标签: linux-kernel

从linux内核模块发送数据

我想通过 tcp 从我的 linux 内核模块发送一些数据。我尝试使用来自http://www.avrfreaks.net/sites/default/files/tcp-server-send-recv.c 的一些代码 ,但代码太旧(它使用旧的 linux 内核 api)。另外,我试图了解https://github.com/abysamross/simple-linux-kernel-tcp-client-server/blob/master/network_server.c,但它对我来说太复杂了:)

我只想通过 tcp 向指定的 IP 地址发送一些小数据。我该怎么做?

c sockets linux tcp linux-kernel

0
推荐指数
1
解决办法
2463
查看次数

如何从内核空间确定 PID 所在的命名空间?

我正在尝试编写一个 eBPF 程序来记录来自系统上运行的容器的特定系统调用的每次调用。我正在使用bcc并且可以使用bpf_get_current_pid_tgid().

从用户空间我可以检查 proc 文件系统以确定进程的命名空间是否与根命名空间不同,以猜测它是否是一个容器进程,但我不知道你如何从内核空间做到这一点?

c linux-kernel bpf ebpf bcc-bpf

0
推荐指数
1
解决办法
1134
查看次数

如何从性能统计数据中解释 LLC-Load-Misses

我在这里发布了一个类似上下文的问题

在解决了一些问题后,我降低了抖动。

我将描述我的场景。

我的内核启动参数如下所示:

nmi_watchdog=0 intel_idle.max_cstate=0 processr.max_cstate=0 nohz_full=7-11 isolcpus=7-11 mce=off rcu_nocbs=7-11 nosoftlockup cpuidle.off=1 powersave=off nonmi_ipi nnwatchdog

我有一个内核模块,它负责以给定的时间间隔发送一些数据包(这里我每 1 毫秒发送一次)。

  • 我有一个固定在 CPU 9 上的数据包生成器
  • 我有一个内核模块(或 Kthread)固定到 CPU 8
  • 我已将 rx 队列的 IRQ 关联设置为 CPU 10

因此,我执行了以下命令来获取性能统计信息

sudo ./perf stat -a -d -I 1000 --cpu=8 taskset -c 9 ./test.sh

下面,我发布了我得到的输出的摘录。从上面的命令,我试图分析我的 CPU Core 8 的事件。

因此,通过这种方式,这些组件不应相互干扰。

     5.002780500        1000.296809      cpu-clock (msec)          #    1.000 CPUs utilized
     5.002780500                  0      context-switches          #    0.000 K/sec
     5.002780500                  0      cpu-migrations            #    0.000 K/sec
     5.002780500                  0      page-faults               #    0.000 …
Run Code Online (Sandbox Code Playgroud)

kernel-module linux-kernel perf

0
推荐指数
1
解决办法
4421
查看次数

如何强制禁用 intel_pstate?即使在 grub 中使用 intel_pstate=disable 选项,重启时也会启用 intel_pstate

我正在尝试使用 cpu 频率缩放来设置 cpu 频率。在我的系统中,只支持 powersave 、 performance frequency-scaling-governor 。在其他文档中解释过,默认情况下,intel_pstate 是启用的,它只支持 powersave ,performance frequency-scaling-governor,解决方案是禁用 intel_pstate。所以我尝试禁用如下

sudo nano /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="intel_pstate=disable"
sudo update-grub
Run Code Online (Sandbox Code Playgroud)

重新启动时,启用 intel_pstate。

所以,我再次对 grub 进行了以下更改

sudo nano /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="intel_pstate=disable acpi=force"
sudo update-grub
Run Code Online (Sandbox Code Playgroud)

重新启动时,它仍然显示 intel_pstate 已启用。

当我执行以下命令时,

$ cpupower -c all frequency-info

    analyzing CPU 7:
      driver: intel_pstate
      CPUs which run at the same hardware frequency: 7
      CPUs which need to have their frequency coordinated by software: 7
      maximum transition latency:  Cannot determine or is not supported.
      hardware limits: 1.60 GHz …
Run Code Online (Sandbox Code Playgroud)

linux cpu intel cpu-architecture linux-kernel

0
推荐指数
1
解决办法
2万
查看次数

用 bbappend 替换 mosquitto.conf 文件?

我有一个层元测试,我在其中创建了一个 mosquitto_%.bbappend 用于自定义默认的 mosquitto.conf 文件,该文件由元开放嵌入层的配方创建。我的 bbappend 文件如下所示:

FILESEXTRAPATHS_prepend := "${THISDIR}/files:"  
SRC_URI += "file://mosquitto.conf"
Run Code Online (Sandbox Code Playgroud)

图像构建没有错误,但 mosquitto.conf 没有被替换。我所观察到的是,上述过程仅在存在于任何主层中时才会替换 mosquitto.conf,但由于 mosquitto_1.5.1.bb 文件仅安装此文件,并且由于此文件不存在于任何层中,我该如何覆盖这个文件?该文件在 /etc/mosquitto 目录中生成。这是我想覆盖的 bitbake 文件:http ://cgit.openembedded.org/meta-openembedded/tree/meta-networking/recipes-connectivity/mosquitto/mosquitto_1.5.1.bb?h=thud

embedded linux-kernel embedded-linux openembedded yocto

0
推荐指数
1
解决办法
280
查看次数

Linux 内核在启动时无法从 SD 卡检测到 rootfs

我正在尝试手动构建主线内核并在 Pine64_Plus 板上启动。Linux 内核无法挂载启动分区。奇怪的是,它不会在引导日志中的可用分区下显示任何分区。我做了以下步骤。克隆linux主线git repo

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git --depth=1
Run Code Online (Sandbox Code Playgroud)

安装了交叉编译器工具链。

进而..

ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make defconfig
ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make -j4 Image
Run Code Online (Sandbox Code Playgroud)

生成dtb

ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make -j4 dtbs
Run Code Online (Sandbox Code Playgroud)

生成内核模块

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make -j4 modules
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=ker_mod_temp_dir make modules modules_install
Run Code Online (Sandbox Code Playgroud)

像下面这样对 SD 卡进行分区 在此处输入图片说明

我将 MLO、Uboot 和固件文件保存在引导分区中。

我从这里下载了 ArchLinux rootfs

我将下载的 rootfs 复制到我的 SD 卡的 ROOTFS 分区。

sudo cp -rT <path-to-downloaded-rootfs> /media/user/ROOTFS
Run Code Online (Sandbox Code Playgroud)

我将 linux 映像和 dts 文件夹从 /arch/arm64/boot 复制到 rootfs 中的引导文件夹。

我将内核模块复制到根目录

sudo cp -rT ker_mod_temp_dir /media/user/ROOTFS/lib
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我试图用 SD 卡启动电路板。uboot 启动成功。我在 …

linux boot arm linux-kernel embedded-linux

0
推荐指数
1
解决办法
2738
查看次数

Linux 内核如何发现 PCI 设备?

在驱动程序端,pci_register_driver()在加载驱动程序模块时调用,如果模块是内置的,则在启动时调用。(每当添加设备/驱动程序时,驱动程序/设备列表都会循环以查找匹配项,我得到了那部分。)

但是在哪里/何时发现 pci 设备并在总线上注册?我想这是特定于架构的,并且会涉及 x86 上的 BIOS,例如 - BIOS 例程探测 PCI 设备,然后在加载内核之前将结果放在 RAM 中某个位置的列表中,并且每个列表条目都包含单个 pci 的信息设备包括vendorId/deviceId 等。内核然后拿起列表并将它们插入pci_bus_type.p.klist_devices到某个点。但这纯粹是猜测,谁能给一些提示?

c linux-device-driver linux-kernel pci

0
推荐指数
1
解决办法
861
查看次数

为什么我的内核会立即重置我的机器?

我正在使用 Buildroot 2020.02.1 为安装了 AMD GX-222GC SOC 的 PC 构建自定义内核。

默认的外部工具链是来自 CodeBench 的 amd-2016.11-19。使用该工具链构建的内核正确启动。 相反,如果我使用由 buildroot 自动构建的工具链构建相同的内核、相同的配置,则内核不会启动!甚至没有内核恐慌,机器只是重置。

很明显,问题与工具链有关。

这些是 gcc -v 的结果

代码台:

$ output/host/usr/bin/x86_64-amd-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=/media/AAA/tmp/buildroot_toolchain/output/host/opt/ext-toolchain/bin/x86_64-amd-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/media/AAA/tmp/buildroot_toolchain/output/host/opt/ext-toolchain/bin/../libexec/gcc/x86_64-amd-linux-gnu/6.2.0/lto-wrapper
Target: x86_64-amd-linux-gnu
Configured with: /scratch/jmyers/amd-lite/src/gcc-6-2016.11/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=x86_64-amd-linux-gnu --enable-threads --disable-libmudflap --disable-libstdcxx-pch --enable-extra-sgxxlite-multilibs --with-arch=btver2 --with-cpu=btver2 --with-gnu-as --with-gnu-ld --with-specs='-D__CS_SOURCERYGXX_MAJ__=2016 -D__CS_SOURCERYGXX_MIN__=11 -D__CS_SOURCERYGXX_REV__=19' --enable-languages=c,c++ --enable-shared --enable-lto --enable-symvers=gnu --enable-__cxa_atexit --with-glibc-version=2.24 --with-pkgversion='Sourcery CodeBench Lite 2016.11-19' --with-bugurl=https://sourcery.mentor.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/x86_64-amd-linux-gnu/libc --with-build-sysroot=/scratch/jmyers/amd-lite/install/opt/codesourcery/x86_64-amd-linux-gnu/libc --with-gmp=/scratch/jmyers/amd-lite/obj/pkg-2016.11-19-x86_64-amd-linux-gnu/amd-2016.11-19-x86_64-amd-linux-gnu.extras/host-libs-i686-pc-linux-gnu/usr --with-mpfr=/scratch/jmyers/amd-lite/obj/pkg-2016.11-19-x86_64-amd-linux-gnu/amd-2016.11-19-x86_64-amd-linux-gnu.extras/host-libs-i686-pc-linux-gnu/usr --with-mpc=/scratch/jmyers/amd-lite/obj/pkg-2016.11-19-x86_64-amd-linux-gnu/amd-2016.11-19-x86_64-amd-linux-gnu.extras/host-libs-i686-pc-linux-gnu/usr --with-isl=/scratch/jmyers/amd-lite/obj/pkg-2016.11-19-x86_64-amd-linux-gnu/amd-2016.11-19-x86_64-amd-linux-gnu.extras/host-libs-i686-pc-linux-gnu/usr --enable-libgomp --enable-libitm --enable-libatomic --disable-libssp --disable-libcc1 --enable-poison-system-directories --with-python-dir=x86_64-amd-linux-gnu/share/gdb/python --with-build-time-tools=/scratch/jmyers/amd-lite/install/opt/codesourcery/x86_64-amd-linux-gnu/bin --with-build-time-tools=/scratch/jmyers/amd-lite/install/opt/codesourcery/x86_64-amd-linux-gnu/bin SED=sed …
Run Code Online (Sandbox Code Playgroud)

x86-64 linux-kernel toolchain buildroot

0
推荐指数
1
解决办法
93
查看次数

asmlinkage 是堆栈还是寄存器?

在大多数语言中,C 包括堆栈用于函数调用。这就是如果您在递归时不小心会收到“堆栈溢出”错误的原因。(不是双关语)。

如果这是真的,那么asmlinkageGCC 指令有什么特别之处。

它说,来自#kernelnewbies

asmlinkage 标签是我们应该注意的关于这个简单函数的另一件事。这是一些 gcc 魔法的 #define,它告诉编译器该函数不应期望在寄存器中找到它的任何参数(一种常见的优化),而只能在 CPU 的堆栈上。

我的意思是我不认为寄存器用于正常的函数调用。

更奇怪的是,当你了解到它是在 x86 上使用 GCC regparm 函数属性实现的。

regparm的文档如下:

在 x86-32 目标上,如果参数在寄存器 EAX、EDX 和 ECX 中而不是在堆栈中是整数类型,则 regparm 属性会导致编译器将第一个参数传递给 number。

这基本上与asmlinkage正在尝试做的相反。

那么会发生什么?它们是在堆栈上还是在寄存器上。

我哪里错了?

信息不是很清楚。

linux x86 gcc linux-kernel function-attributes

0
推荐指数
1
解决办法
98
查看次数

我可以在不从引导加载程序传递单独的 DTB 的情况下引导 Linux 内核吗?

尝试将 IMX 板升级到最新内核,但正在寻找使用 Legacy 启动的方法。引导加载程序的版本不包括对要传递的单独 DTB 的支持。

linux-kernel u-boot

0
推荐指数
1
解决办法
160
查看次数