我正在为 Linux 嵌入式平台开发一个多线程应用程序。
目前,我将每个线程的堆栈大小(通过pthread_set_attr)设置为相当大的默认值。我想将每个线程的值微调为较小的值,以减少应用程序的内存使用量。我可以尝试将每个线程的堆栈大小设置为逐渐减小的值,直到程序崩溃,但应用程序使用约 15 个线程,每个线程具有完全不同的功能/属性,因此这种方法将非常耗时。
我更愿意能够直接测量每个线程的堆栈使用情况。人们可以推荐一些实用程序来执行此操作吗?(例如,我来自 vxWorks 背景,并使用 vxWorks shell 中的“ti”命令直接提供有关堆栈使用情况的统计信息以及有关任务状态的其他有用信息。)
在struct device \xef\xbc\x8c的定义中有一个fwnode字段\xef\xbc\x8c
\nstruct device {\n ...\n struct fwnode_handle *fwnode; /* firmware device node */\n ...\n}\nRun Code Online (Sandbox Code Playgroud)\n相应的文件位于include/linux/fwnode.h中:
\nstruct fwnode_reference_args {\n struct fwnode_handle *fwnode;\n unsigned int nargs;\n unsigned int args[NR_FWNODE_REFERENCE_ARGS];\n};\n...\nRun Code Online (Sandbox Code Playgroud)\n然后我在网站上搜索它,但找不到内核这部分(fwnode)的详细解释,那么这是什么意思?它有什么作用?\n你能提供一个文档以供参考吗?
\n我在一个程序中多次调用getpid()(为了测试系统调用的效率),但是当我strace用来获取trace时,只捕获了一个getpid()调用。
代码很简单:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void print_usage(){
printf("Usage: program count\n");
exit(-1);
}
int main(int argc, char** argv){
if(argc != 2)
print_usage();
int cnt = atoi(argv[1]);
int i = 0;
while(i++<cnt)
getpid();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用gdb并得到了这个:
(gdb) disasse
Dump of assembler code for function getpid:
0xb76faac0 <getpid+0>: mov %gs:0x4c,%edx
0xb76faac7 <getpid+7>: cmp $0x0,%edx
0xb76faaca <getpid+10>: mov %edx,%eax
0xb76faacc <getpid+12>: jle 0xb76faad0 <getpid+16>
0xb76faace <getpid+14>: repz ret
0xb76faad0 <getpid+16>: jne 0xb76faadc …Run Code Online (Sandbox Code Playgroud) 我已经看到至少三种不同的方法来设置sigaltstack()的替代堆栈。我想知道哪一种是最好的方法:
\n方法#1
\nstack_t sigstk;\nsigstk.ss_size = 0;\nsigstk.ss_flags = 0;\nsigstk.ss_sp = mmap (NULL, SIGSTKSZ, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);\nif (sigstk.ss_sp != MAP_FAILED) {\n sigstk.ss_size = SIGSTKSZ;\n if (sigaltstack (&sigstk, 0) < 0) {\n sigstk.ss_size = 0;\n printf ("sigaltstack errno=%d\\n", errno);\n }\n} else {\n printf ("malloc (SIGSTKSZ) failed!\\n");\n}\nRun Code Online (Sandbox Code Playgroud)\n方法#2\n(我们已经使用这个有一段时间了,但是这里分配的内存显示在泄漏检测(leaks命令)中)
stack_t sigstk;\nsigstk.ss_size = 0;\nsigstk.ss_flags = 0;\nsigstk.ss_sp = malloc (SIGSTKSZ);\nif (sigstk.ss_sp != NULL) {\n sigstk.ss_size = SIGSTKSZ;\n if (sigaltstack (&sigstk, 0) < 0) {\n …Run Code Online (Sandbox Code Playgroud) 我有一个 yocto recipe 来编译来自 github 的代码。我修改了一些文件,并希望对从 github 获取的代码应用补丁。以下是我构建代码的秘诀。
SUMMARY = "Linux NFC stack for NCI based NXP NFC Controllers"
HOMEPAGE = "https://github.com/NXPNFCLinux/linux_libnfc-nci"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://src/include/linux_nfc_api.h;endline=17;md5=42fdb99b3ff2c12f594b22a774cb7308"
SECTION = "libs"
SRC_URI = "git://github.com/NXPNFCLinux/linux_libnfc-nci.git \
file:///home/pratyush/Desktop/custom_board/drivers/PN7150/linux_libnfc-nci/demoapp-main-patch1.patch"
SRCREV = "7cf539d3d9c0d682c8da5968fbf5615ae9993060"
PV = "2.1+git${SRCPV}"
EXTRA_OECONF =" --enable-pn7150"
S = "${WORKDIR}/git"
inherit autotools
FILES_${PN} += "${libdir}/libnfc_nci_linux-1.so"
FILES_SOLIBSDEV = "${libdir}/libnfc_nci_linux.so"
Run Code Online (Sandbox Code Playgroud)
按照我的补丁应用
--- /home/root/PN7150/linux_libnfc-nci/Makefile.am
+++ Makefile.am
@@ -1,7 +1,7 @@
lib_LTLIBRARIES = libnfc_nci_linux.la
-sbin_PROGRAMS = nfcDemoApp
-nfcDemoApp_DEPENDENCIES = libnfc_nci_linux.la
+sbin_PROGRAMS = readNfc
+readNfc_DEPENDENCIES = libnfc_nci_linux.la …Run Code Online (Sandbox Code Playgroud) 我正在创建一个基于 x86 的非常简单的 Yocto 图像。
我希望 / 文件系统是只读的,所以我设置了
IMAGE_FEATURES_append = " read-only-rootfs "
Run Code Online (Sandbox Code Playgroud)
在原件的自定义副本中core-image-minimal.bb。不过,我确实希望将/home可写的放在一个单独的分区上。
所以,我添加了一行
part /home --ondisk sda --fstype=ext4 --label home --align 1024 --size 600
Run Code Online (Sandbox Code Playgroud)
在 genericx86.wks 中。这会/home在最终 wic 映像中创建实际分区,但它自然不保存任何数据,因为没有对应的数据rootfs。这会导致启动后出现以下非常预期的消息:No directory, logging in with HOME=/.
互联网上关于这方面的信息令人惊讶地很少。有这样的解释:
创建或修改构建配方来为每个分区准备一个 rootfs 目录要简单得多。
我只是希望文档或示例中有任何关于如何实现这一目标的参考。
我可以看到分区由 python 脚本(插件)填充,例如rootfs.py,并且IMAGE_ROOTFS_SIZE在提到的图像配方文件中指定了图像参数,例如genericx86.wks,但这不足以让我将这些部分连接在一起。
我已经阅读了创建分区图像使用 wic和链接的openembedded kickstart手册,那里没有任何线索。
感谢某人的善意帮助。
目前,我正在学习记忆布局C.现在我知道在C程序的内存存在几个部分:text,data,bss,heap和stack。他们还说heap是与程序之外的其他东西共享。
我的问题是这些。
heap共享到底是什么?一个源指出堆必须始终以使其可用于被释放的其它过程而另一个表示堆区由所有线程,共享库,并且动态加载的模块共享的过程。如果它不与其他进程共享,我真的必须在我的程序运行时(不是在程序结束时)释放它吗?编译glibc的时候出错,google了半天没搞懂!这是编译器的输出:
x86_64-pc-linux-gnu-gcc -nostdlib -nostartfiles -shared -o /mnt/g/gcc/build/build-glibc-2.35/elf/ld.so.new \
-Wl,-z,combreloc -Wl,-z,relro -Wl,--hash-style=both -Wl,-z,defs \
/mnt/g/gcc/build/build-glibc-2.35/elf/librtld.os -Wl,--version-script=/mnt/g/gcc/build/build-glibc-2.35/ld.ma\
-Wl,-soname=ld-linux-x86-64.so.2 \
-Wl,-defsym=_begin=0
/usr/sbin/ld: /mnt/g/gcc/build/build-glibc-2.35/elf/librtld.os: in function `_dl_make_stacks_executable':
/mnt/g/gcc/build/glibc-2.35/elf/../sysdeps/unix/sysv/linux/dl-execstack.c:69: undefined reference to `__lll_lock_wait_private'
/usr/sbin/ld: /mnt/g/gcc/build/glibc-2.35/elf/../sysdeps/unix/sysv/linux/dl-execstack.c:91: undefined reference to `__lll_lock_wake_private'
/usr/sbin/ld: /mnt/g/gcc/build/build-glibc-2.35/elf/librtld.os: in function `__thread_gscope_wait':
/mnt/g/gcc/build/glibc-2.35/elf/../sysdeps/nptl/dl-thread_gscope_wait.c:79: undefined reference to `__lll_lock_wake_private'
/usr/sbin/ld: /mnt/g/gcc/build/glibc-2.35/elf/../sysdeps/nptl/dl-thread_gscope_wait.c:28: undefined reference to `__lll_lock_wait_private'
/usr/sbin/ld: /mnt/g/gcc/build/build-glibc-2.35/elf/librtld.os: in function `_dl_init_static_tls':
/mnt/g/gcc/build/glibc-2.35/elf/../elf/dl-tls.c:1092: undefined reference to `__lll_lock_wait_private'
/usr/sbin/ld: /mnt/g/gcc/build/glibc-2.35/elf/../elf/dl-tls.c:1103: undefined reference to `__lll_lock_wake_private'
Run Code Online (Sandbox Code Playgroud) 我正在尝试写入然后从使用打开的文件描述符中读取shm_open。它在 Linux 上按我的预期工作,但在 macOS 上却不行(特别是 macOS Monterey 12.5 21G72)。这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
int main(int argc, const char * argv[]) {
int fd = shm_open("/example", O_CREAT|O_RDWR, S_IRUSR|S_IWUSR);
if (fd < 0) {
printf("shm_open() failed %s (%d)\n", strerror(errno), errno);
return 1;
}
const char *buf = "hello world";
unsigned long len = strlen(buf);
ssize_t ret = write(fd, buf, len);
if (ret < 0) {
printf("write() failed %s (%d)\n", strerror(errno), …Run Code Online (Sandbox Code Playgroud) 这可能是一个相当简单的问题,我遗漏了一些东西。我正在尝试wic用作布局引导分区的自定义脚本的替代品。该设备是一个 IMX6,并在 0x400 处写入了 uboot,以及一个用于加载 /boot 文件夹的 fat32 引导分区,其中包含一些文件
/boot
uImage
root.squashfs
splash.bmp
devicetree.dts
6x_bootscript
Run Code Online (Sandbox Code Playgroud)
我简要地研究了使用 bootimg-partition for 的插件wic。似乎是一种包含文件的简单方法,但对文件名的控制不够。它可以占用整个文件夹,但我不确定如何使用这些特定文件创建目录。复制后文件必须具有正确的名称。
# Copied from https://community.nxp.com/thread/389816
# Image Creator .wks
part u-boot --source rawcopy --sourceparams="file=u-boot.imx" --ondisk mmcblk --no-table --align 1
# Boot partition
part /boot --source bootimg-partition --ondisk mmcblk --fstype=vfat --label boot --active --align 4096 --size 8M --extra-space 0
Run Code Online (Sandbox Code Playgroud) c ×4
yocto ×3
linux-kernel ×2
macos ×2
yocto-wic ×2
acpi ×1
bitbake ×1
device-tree ×1
glibc ×1
heap-memory ×1
libc ×1
linux ×1
openembedded ×1
patch ×1
posix ×1
pthreads ×1
signals ×1
stack ×1
strace ×1
system-calls ×1