是的,我最终会将它用于 DMA,但暂时将一致性放在一边。我有 64 位 BAR 寄存器,因此,AFAIK,所有 RAM(例如高于 4G)都可用于 DMA。
我正在寻找大约 64MB 的连续 RAM。是的,很多。
Ubuntu 16 和 18 具有CONFIG_CMA=y但未CONFIG_DMA_CMA在内核编译时设置。
我注意到,如果两者都设置(在内核构建时),我可以简单地调用dma_alloc_coherent,但是,出于逻辑原因,重新编译内核是不可取的。
这些机器将始终具有至少 32GB 的 RAM,不运行任何占用大量内存的东西,并且内核模块将在启动后不久加载,然后 RAM 变得明显碎片化,而且,AFAIK,没有其他东西使用 CMA。
我已经设置了内核参数 CMA=1G。(并尝试过 256M 和 512M)
# dmesg | grep cma
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.170 root=UUID=2b25933c-e10c-4833-b5b2-92e9d3a33fec ro cma=1G
[ 0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-4.4.170 root=UUID=2b25933c-e10c-4833-b5b2-92e9d3a33fec ro cma=1G
[ 0.000000] Memory: 65612056K/67073924K available (8604K kernel code, 1332K rwdata, 3972K rodata, 1484K init, 1316K bss, 1461868K reserved, 0K cma-reserved)
Run Code Online (Sandbox Code Playgroud)
我试过了 …
简单的示例程序:
#include <stdio.h>
main()
{
bool tim = true;
bool rob = false;
bool mike = true;
printf("%d, %d, %d\n", tim, rob, mike);
}
Run Code Online (Sandbox Code Playgroud)
使用gcc编译器,根据查看程序集输出,它的appearers将每个bool存储为单个字节中的一个位:
0x4004fc <main()+8> movb $0x1,-0x3(%rbp)
0x400500 <main()+12> movb $0x0,-0x2(%rbp)
0x400504 <main()+16> movb $0x1,-0x1(%rbp)
Run Code Online (Sandbox Code Playgroud)
但是,如果一个开启优化,是否有一个优化级别会导致gcc将这些bool存储为一个字节中的位,或者是否必须将bool放在一些bool和short int的并集中?其他编译器?我试过'-Os',但我必须承认我不能做出输出反汇编的正面或反面.
这对8b工作正常但是从8c开始我得到:
rm -f ./libs/armeabi/lib*.so ./libs/armeabi-v7a/lib*.so ./libs/mips/lib*.so ./libs/x86/lib*.so
rm -f ./libs/armeabi/gdbserver ./libs/armeabi-v7a/gdbserver ./libs/mips/gdbserver ./libs/x86/gdbserver
rm -f ./libs/armeabi/gdb.setup ./libs/armeabi-v7a/gdb.setup ./libs/mips/gdb.setup ./libs/x86/gdb.setup
Gdbserver : [arm-linux-androideabi-4.6] libs/armeabi-v7a/gdbserver
install -p /home/tallen/eclipse/android-ndk-r8e/prebuilt/android-arm/gdbserver/gdbserver ./libs/armeabi-v7a/gdbserver
Gdbsetup : libs/armeabi-v7a/gdb.setup
echo "set solib-search-path ./obj/local/armeabi-v7a" > ./libs/armeabi-v7a/gdb.setup
echo "directory /home/tallen/eclipse/android-ndk-r8e/platforms/android-8/arch-arm/usr/include /home/tallen/eclipse/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++ /home/tallen/eclipse/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.6/include /home/tallen/eclipse/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include jni/NG1.4 jni/NG2.4" >> ./libs/armeabi-v7a/gdb.setup
SharedLibrary : libngapi1_4.so
/home/tallen/eclipse/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ -Wl,-soname,libngapi1_4.so -shared --sysroot=/home/tallen/eclipse/android-ndk-r8e/platforms/android-8/arch-arm ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/config.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/ngroute.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/ngreversegeocode.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/ngugeosearch.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/ngpoifinder.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/ngumap.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/NGUDataSource.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/NGUBase.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/NGUCameraBehavior.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/NGUGeocode.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/NGUImageCommon.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/NGULocationHandler.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/NGULocationInfo.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/NGUMapContext.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/NGUMapSettings.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/NGUMapTools.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/NGUNaviInfoManager.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/NGUPoiSearch.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/NGUPoiTypeManager.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/NGUReverseGeocode.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/NGURoute.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/NGUStatusDecoder.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/UnitFormatter.o ./obj/local/armeabi-v7a/objs-debug/ngapi1_4/NGUMapView.o /home/tallen/eclipse/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/libgnustl_static.a -lgcc -no-canonical-prefixes …Run Code Online (Sandbox Code Playgroud) allocation ×1
android ×1
android-ndk ×1
c ×1
contiguous ×1
dma ×1
g++ ×1
gcc ×1
icc ×1
linux-kernel ×1