前言
今天在复习linux进程间通信的shared memory 共享内存时,在PC端的VMare Workstation虚拟机的Ubuntu上测试我写的shared_memory_CREAT.c 和shared_memory_CONSUME.c 时正常在PC端运行,就想着把程序用交叉编译器编译成arm格式放到linux开发板上运行试试,结果运行的时候给我报了下列错误:
$ ./shared_memory_CREAT
shmget:Function not implemented
我一看人懵了,在虚拟机上运行根本就没有这个错误啊
紧接着我敲了一行查看共享内存的命令
$ ipcs
kernel not configured for shared memory
kernel not configured for semaphore
kernel not configured for message queues
我真的人傻了,内核没配置共享内存、信号量、消息队列???
一上百度一搜,这个问题竟然没有好的什么解决方法,匹配关键字百度第一条竟然是老外论坛上的
点进去看老外也没说什么玩意儿,就是有一群人在那说,“啊呀呀我也遇到了相同的问题bro。”
折腾了很久,在各式各样的搜索引擎上找不到解决办法就只能自己动手了,终于折腾出来解决方法!!!
解决方法
进入linux内核的make menuconfig界面,</>键,搜索shm
你将会看到最下面一行出现一个描述为: Use full shmem filesystem(使用完整的shmem文件系统)
没错就是它!!!
进入 ->General setup
在<>System V IPC和<>POSIX Message Queues前输入<Y> ,勾选编译这两个模块
回车<Yes>保存配置
编译内核:
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
经过(喝一杯奶茶的时间)漫长的编译后,成功生成zImage,
把生成的zImage拷贝到TF卡对应的zImage应该处于的位置,给开发板上电,跑程序
大功告成!
这里在我运行程序后ipcs命令里什么都没有是因为我的第二个程序执行完后把创建的共享内存删除了,当执行第一个creat程序时:
硬件:荔枝派zero
内核版本:linux4.10.15
以上