小编Sam*_*nko的帖子

vmalloc和kmalloc有什么区别?

我已经google了一下,发现大多数人都主张使用kmalloc,因为你可以保证获得连续的物理内存块.但是,kmalloc如果找不到您想要的连续物理块,它似乎也会失败.
拥有一块连续的内存块有什么好处?具体来说,为什么我需要在系统调用中拥有连续的物理内存块?我有什么理由不能使用吗? 最后,如果我在处理系统调用期间分配内存,我应该指定吗?系统调用是在原​​子上下文中执行的吗?vmalloc
GFP_ATOMIC

GFP_ATOMIC
分配是高优先级的,不会睡眠.这是在中断处理程序,下半部分和其他无法睡眠的情况下使用的标志.

GFP_KERNEL 这是正常分配,可能会阻止.这是在安全睡眠时在进程上下文代码中使用的标志.

c linux-kernel vmalloc kmalloc

107
推荐指数
5
解决办法
10万
查看次数

谁使用POSIX实时信号?为什么?

我没有被翻转我真的不明白.我刚读了一大堆关于它们的材料,我无法弄清楚用例.我并不是在谈论如此多的关于API的问题,因为它比signal()这样的优点足够清晰.相反,似乎RT信号是用户空间生成但是到底是什么?唯一的用途似乎是原始的IPC,但一切都指向它们是一种糟糕的IPC形式(例如笨拙,有限的信息,不是特别有效等).

那么他们在哪里以及如何使用?

c linux embedded posix signals

25
推荐指数
3
解决办法
9110
查看次数

Linux内核的`make defconfig`究竟做了什么?

我可以使用以下命令.config根据基于ARM的自定义板的指定体系结构默认值创建Linux内核文件:

ARCH=arm make defconfig KBUILD_DEFCONFIG=var_som_mx6_android_defconfig
Run Code Online (Sandbox Code Playgroud)

我以为这个命令或多或少复制./arch/arm/configs/var_som_mx6_android_defconfig到了./.config.但是,生成的.config文件并不完全是副本:

$ diff --unified arch/arm/configs/var_som_mx6_android_defconfig  .config
--- arch/arm/configs/var_som_mx6_android_defconfig  2017-01-20 12:10:51.891515984 -0800
+++ .config 2017-01-26 15:31:29.000000000 -0800
@@ -407,6 +407,7 @@
 CONFIG_ARM_ERRATA_751472=y
 CONFIG_ARM_ERRATA_794072=y
 CONFIG_ARM_ERRATA_761320=y
+CONFIG_ARM_ERRATA_845369=y
 # CONFIG_ARM_ERRATA_753970 is not set
 CONFIG_ARM_ERRATA_754322=y
 # CONFIG_ARM_ERRATA_754327 is not set
@@ -2683,7 +2684,6 @@
 CONFIG_AUTOFS4_FS=y
 CONFIG_FUSE_FS=y
 # CONFIG_CUSE is not set
-CONFIG_AUFS_FS=y

 #
 # Caches
@@ -2759,6 +2759,21 @@
 # CONFIG_PSTORE is not set
 # CONFIG_SYSV_FS is not set
 # CONFIG_UFS_FS is …
Run Code Online (Sandbox Code Playgroud)

linux-kernel kbuild

24
推荐指数
1
解决办法
3万
查看次数

Github API v3不显示所有用户存储库

如果我输入此命令:

$ curl https://api.github.com/users/KiCad/repos | grep full_name
Run Code Online (Sandbox Code Playgroud)

我希望它将返回所有KiCad存储库,但它返回:

"full_name": "KiCad/Air_Coils_SML_NEOSID.pretty",
"full_name": "KiCad/Buzzers_Beepers.pretty",
"full_name": "KiCad/Capacitors_Elko_ThroughHole.pretty",
"full_name": "KiCad/Capacitors_SMD.pretty",
"full_name": "KiCad/Capacitors_Tantalum_SMD.pretty",
"full_name": "KiCad/Capacitors_ThroughHole.pretty",
"full_name": "KiCad/Choke_Axial_ThroughHole.pretty",
"full_name": "KiCad/Choke_Common-Mode_Wurth.pretty",
"full_name": "KiCad/Choke_Radial_ThroughHole.pretty",
"full_name": "KiCad/Choke_SMD.pretty",
"full_name": "KiCad/Choke_Toroid_ThroughHole.pretty",
"full_name": "KiCad/Connect.pretty",
"full_name": "KiCad/Connectors_Molex.pretty",
"full_name": "KiCad/Converters_DCDC_ACDC.pretty",
"full_name": "KiCad/Crystals.pretty",
"full_name": "KiCad/Crystals_Oscillators_SMD.pretty",
"full_name": "KiCad/Diodes_SMD.pretty",
"full_name": "KiCad/Diodes_ThroughHole.pretty",
"full_name": "KiCad/Discret.pretty",
"full_name": "KiCad/Display.pretty",
"full_name": "KiCad/Displays_7-Segment.pretty",
"full_name": "KiCad/Divers.pretty",
"full_name": "KiCad/EuroBoard_Outline.pretty",
"full_name": "KiCad/Fiducials.pretty",
"full_name": "KiCad/Filters_HF_Coils_NEOSID.pretty",
"full_name": "KiCad/Fuse_Holders_and_Fuses.pretty",
"full_name": "KiCad/Hall-Effect_Transducers_LEM.pretty",
"full_name": "KiCad/Heatsinks.pretty",
"full_name": "KiCad/Housings_DFN_QFN.pretty",
"full_name": "KiCad/Housings_QFP.pretty",
Run Code Online (Sandbox Code Playgroud)

如果你看一下https://github.com/KiCad,你会看到有更多的存储库.

有谁遇到过这个问题?你是如何解决的?

curl get repository github-api kicad

19
推荐指数
1
解决办法
3731
查看次数

为什么默认定义_GNU_SOURCE以及如何将其关闭?

我正在使用g ++,它告诉我我_GNU_SOURCE在命令行上定义,但我没有.

我现在_GNU_SOURCE可以使用定义来启用gnu扩展,但现在我不想要这些扩展.我补充说-std=c++0x -pedantic,但_GNU_SOURCE仍然是定义.

输出g++ -v如下:

$ g++ -v
Using built-in specs.
COLLECT_GCC=/usr/bin/g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
Run Code Online (Sandbox Code Playgroud)

当我给它一个空文件并编译时g++ -E -dD -std=c++98 -pedantic empty.cpp,我得到这个:

$ g++ -E -dD -std=c++98 …
Run Code Online (Sandbox Code Playgroud)

gcc

11
推荐指数
1
解决办法
8888
查看次数

如何理解"/ proc/[pid]/stack"?

根据proc手册:

/ proc/[pid]/stack(自Linux 2.6.29起)

此文件提供此进程内核堆栈中函数调用的符号跟踪.仅当内核使用CONFIG_STACKTRACE配置选项构建时,才会提供此文件.

所以我写了一个测试程序:

#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
#include <pthread.h>

void *thread_func(void *p_arg)
{
        pid_t pid = fork();
        if (pid > 0) {
            wait(NULL);
            return 0;
        } else if (pid == 0) {
            sleep(1000);
            return 0;
        }
        return NULL;
}
int main(void)
{
        pthread_t t1, t2;

        pthread_create(&t1, NULL, thread_func, "Thread 1");
        pthread_create(&t2, NULL, thread_func, "Thread 2");

        sleep(1000);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

运行后,用于pstack检查进度的线程:

linux-uibj:~ # pstack 24976
Thread 3 (Thread 0x7fd6e4ed5700 (LWP 24977)):
#0 …
Run Code Online (Sandbox Code Playgroud)

linux multithreading pthreads linux-kernel

11
推荐指数
1
解决办法
6704
查看次数

写入文件而不填写Linux

假设我们的目的是在运行Linux的嵌入式设备上创建一个带有大洞的文件,我们将在稍后编写.我们打开文件,获取文件描述符并调用lseek它来寻找某个已知位置.之后,当我们想要在搜索到的位置写入该文件时,我们会调用write它.

但是,在第一次写入时,通过搜索创建的孔变为零填充,如果孔足够大,则此操作可能需要一些时间.在我的应用程序中,不需要这个零初始化,因为这个孔的长度非常精确,我稍后会用我的数据填充它.

有没有办法避免在填零write后进行第一次调用seek(即使它涉及修改文件系统驱动程序)?或者,有没有办法在文件开头之前写入文件(附加到文件的前面)?

linux file embedded-linux lseek

11
推荐指数
1
解决办法
955
查看次数

Eudyptula挑战和内核路径

我决定参加Eudyptula挑战赛.在我提交了第一个任务之后,就是构建一个简单的"Hello World!" 模块,我收到了以下答案.

请阅读Makefile的要求,并允许根据文件系统上的任何内核源代码树构建模块,而不仅仅是那些/lib/在某个时间点安装的内核.

要求是:

Makefile应该能够针对当前运行的内核的源构建内核模块,并且能够从环境变量接受任意内核源目录.

我正在做的是检查是否KERNELRELEASE设置了环境变量.如果是我构建模块

$(KERNELRELEASE)/build  
Run Code Online (Sandbox Code Playgroud)

如果它不反对

/lib/modules/$(shell uname -r)/build
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么这不能满足这项任务的要求.

makefile linux-kernel eudyptula-challenge

10
推荐指数
1
解决办法
2871
查看次数

解释gpio:在固定调节器设备树入口?

我正在尝试控制(打开/关闭)映射到GPIO引脚的电压调节器并为外部设备供电.调节器的设备树具有以下条目:

    reg_usb1_vbus: usb1_vbus {
        compatible = "regulator-fixed";
        regulator-name = "usb1_vbus";
        regulator-min-microvolt = <5000000>;
        regulator-max-microvolt = <5000000>;
        gpio = <&gpio3 28 0>;
        enable-active-high;
    };
Run Code Online (Sandbox Code Playgroud)

当我阅读文档时,我对此感到困惑:

可选属性:

  • gpio:用于启用控件的gpio

但是,我无法导出该GPIO的sysfs接口,并使用它来控制外部设备的电源(只是打开/关闭).此外,如果我gpio = <&gpio3 28 0>;从设备树中注释掉外部设备,则外部设备不会获得电源(如果没有注释,则设备始终处于通电状态).

监管机构已导出sysfs接口:

80090000.usb-vbus      power                  suspend_standby_state
device                 state                  type
microvolts             subsystem              uevent
name                   suspend_disk_state
num_users              suspend_mem_state
Run Code Online (Sandbox Code Playgroud)

但是我无法写入任何文件.

解释gpio:条目的正确方法是什么?

  • gpio用于启用控制

    在这种情况下,我错过了我想要调节器电压的引脚之间的映射.

  • gpio将从调节器获得电压为某些外部设备供电

    在这种情况下,我错过了打开和关闭它的方法

linux-device-driver linux-kernel embedded-linux device-tree

10
推荐指数
1
解决办法
4086
查看次数

在Linux内核模块中实现轮询

我有一个简单的字符设备驱动程序,允许您从自定义硬件设备读取.它使用DMA将数据从设备的内存复制到内核空间(然后再复制到用户).

read调用非常简单.它启动DMA写入,然后等待等待队列.当DMA完成时,中断处理程序设置一个标志并唤醒等待队列.需要注意的重要一点是,我可以随时启动DMA,甚至在设备提供数据之前.DMA引擎将等待,直到有数据要复制.这很好用.我可以在用户空间中实现一个简单的阻塞读取调用,它的行为与我期望的一样.

我想实现,poll以便我可以select在用户空间中使用系统调用,允许我同时监视此设备和套接字.

我能找到的大部分资源poll都说:

  1. 调用poll_wait可能表示状态发生变化的每个等待队列
  2. 返回一个指示数据是否可用的位掩码

第二部分让我感到困惑.我见过的大多数示例都有一种简单的方法(指针比较或状态位)来检查数据是否可用.在我的情况下,除非我启动DMA,否则数据将永远不可用,即使我这样做,数据也不会立即可用(在设备实际拥有数据和DMA完成之前可能需要一些时间).

那怎么实现呢?该poll函数是否应该实际启动DMA以使数据最终可用?我想这会破坏我的read功能.

linux select driver linux-device-driver linux-kernel

9
推荐指数
1
解决办法
6031
查看次数