我想通过 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 地址发送一些小数据。我该怎么做?
我正在尝试编写一个 eBPF 程序来记录来自系统上运行的容器的特定系统调用的每次调用。我正在使用bcc并且可以使用bpf_get_current_pid_tgid().
从用户空间我可以检查 proc 文件系统以确定进程的命名空间是否与根命名空间不同,以猜测它是否是一个容器进程,但我不知道你如何从内核空间做到这一点?
我在这里发布了一个类似上下文的问题
在解决了一些问题后,我降低了抖动。
我将描述我的场景。
我的内核启动参数如下所示:
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 毫秒发送一次)。
因此,我执行了以下命令来获取性能统计信息
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) 我正在尝试使用 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) 我有一个层元测试,我在其中创建了一个 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
我正在尝试手动构建主线内核并在 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)
我将 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 启动成功。我在 …
在驱动程序端,pci_register_driver()在加载驱动程序模块时调用,如果模块是内置的,则在启动时调用。(每当添加设备/驱动程序时,驱动程序/设备列表都会循环以查找匹配项,我得到了那部分。)
但是在哪里/何时发现 pci 设备并在总线上注册?我想这是特定于架构的,并且会涉及 x86 上的 BIOS,例如 - BIOS 例程探测 PCI 设备,然后在加载内核之前将结果放在 RAM 中某个位置的列表中,并且每个列表条目都包含单个 pci 的信息设备包括vendorId/deviceId 等。内核然后拿起列表并将它们插入pci_bus_type.p.klist_devices到某个点。但这纯粹是猜测,谁能给一些提示?
我正在使用 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) 在大多数语言中,C 包括堆栈用于函数调用。这就是如果您在递归时不小心会收到“堆栈溢出”错误的原因。(不是双关语)。
如果这是真的,那么asmlinkageGCC 指令有什么特别之处。
它说,来自#kernelnewbies
asmlinkage 标签是我们应该注意的关于这个简单函数的另一件事。这是一些 gcc 魔法的 #define,它告诉编译器该函数不应期望在寄存器中找到它的任何参数(一种常见的优化),而只能在 CPU 的堆栈上。
我的意思是我不认为寄存器用于正常的函数调用。
更奇怪的是,当你了解到它是在 x86 上使用 GCC regparm 函数属性实现的。
regparm的文档如下:
在 x86-32 目标上,如果参数在寄存器 EAX、EDX 和 ECX 中而不是在堆栈中是整数类型,则 regparm 属性会导致编译器将第一个参数传递给 number。
这基本上与asmlinkage正在尝试做的相反。
那么会发生什么?它们是在堆栈上还是在寄存器上。
我哪里错了?
信息不是很清楚。
尝试将 IMX 板升级到最新内核,但正在寻找使用 Legacy 启动的方法。引导加载程序的版本不包括对要传递的单独 DTB 的支持。