我已经google了一下,发现大多数人都主张使用kmalloc,因为你可以保证获得连续的物理内存块.但是,kmalloc如果找不到您想要的连续物理块,它似乎也会失败.
拥有一块连续的内存块有什么好处?具体来说,为什么我需要在系统调用中拥有连续的物理内存块?我有什么理由不能使用吗?
最后,如果我在处理系统调用期间分配内存,我应该指定吗?系统调用是在原子上下文中执行的吗?vmallocGFP_ATOMIC
GFP_ATOMIC
分配是高优先级的,不会睡眠.这是在中断处理程序,下半部分和其他无法睡眠的情况下使用的标志.
GFP_KERNEL这是正常分配,可能会阻止.这是在安全睡眠时在进程上下文代码中使用的标志.
我没有被翻转我真的不明白.我刚读了一大堆关于它们的材料,我无法弄清楚用例.我并不是在谈论如此多的关于API的问题,因为它比signal()这样的优点足够清晰.相反,似乎RT信号是用户空间生成但是到底是什么?唯一的用途似乎是原始的IPC,但一切都指向它们是一种糟糕的IPC形式(例如笨拙,有限的信息,不是特别有效等).
那么他们在哪里以及如何使用?
我可以使用以下命令.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) 如果我输入此命令:
$ 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,你会看到有更多的存储库.
有谁遇到过这个问题?你是如何解决的?
我正在使用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) 根据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的嵌入式设备上创建一个带有大洞的文件,我们将在稍后编写.我们打开文件,获取文件描述符并调用lseek它来寻找某个已知位置.之后,当我们想要在搜索到的位置写入该文件时,我们会调用write它.
但是,在第一次写入时,通过搜索创建的孔变为零填充,如果孔足够大,则此操作可能需要一些时间.在我的应用程序中,不需要这个零初始化,因为这个孔的长度非常精确,我稍后会用我的数据填充它.
有没有办法避免在填零write后进行第一次调用seek(即使它涉及修改文件系统驱动程序)?或者,有没有办法在文件开头之前写入文件(附加到文件的前面)?
我决定参加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)
我无法理解为什么这不能满足这项任务的要求.
我正在尝试控制(打开/关闭)映射到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将从调节器获得电压为某些外部设备供电
在这种情况下,我错过了打开和关闭它的方法
我有一个简单的字符设备驱动程序,允许您从自定义硬件设备读取.它使用DMA将数据从设备的内存复制到内核空间(然后再复制到用户).
该read调用非常简单.它启动DMA写入,然后等待等待队列.当DMA完成时,中断处理程序设置一个标志并唤醒等待队列.需要注意的重要一点是,我可以随时启动DMA,甚至在设备提供数据之前.DMA引擎将等待,直到有数据要复制.这很好用.我可以在用户空间中实现一个简单的阻塞读取调用,它的行为与我期望的一样.
我想实现,poll以便我可以select在用户空间中使用系统调用,允许我同时监视此设备和套接字.
我能找到的大部分资源poll都说:
poll_wait可能表示状态发生变化的每个等待队列第二部分让我感到困惑.我见过的大多数示例都有一种简单的方法(指针比较或状态位)来检查数据是否可用.在我的情况下,除非我启动DMA,否则数据将永远不可用,即使我这样做,数据也不会立即可用(在设备实际拥有数据和DMA完成之前可能需要一些时间).
那怎么实现呢?该poll函数是否应该实际启动DMA以使数据最终可用?我想这会破坏我的read功能.