eMMC Q&A

Q1:kernel下如何打开eMMC?

在menuconfig中打开如下配置:

Device Drivers

    → <M> MMC/SD/SDIO card support ---> 
    → [*] SStar SoC platform drivers -→
            → <M> EMMC driver
                            → [*] UNIFY EMMC DRIVER
                    < > SStar SD/MMC Card Interface Support

由于SD与eMMC使用同一组GPIO,使能eMMC Driver则需要失能SD Driver。在kernel/modules目录下会生成kdrv_emmc.ko文件,将kdrv_emmc.ko字段追加到project/kbuild/customize/4.9.84/p3/dispcam kernel_mod_list文件中,此时打包image时才会包含kdrv_emmc.ko文件,开机启动时才会insmod kdrv_emmc.ko

Q2:如何使用eMMC或者SD卡作为Linux Swap分区?

  1. 编译kernel时开启swap功能

    1. 在kernel目录中执行命令$ make menuconfig

    2. 进入General setup选项,开启swap功能,然后保存退出

    3. 查看.config文件,确认swap功能已开启

    4. 重新编译kernel,然后烧写至开发板

      $ make clean; make -j8
      
  2. 在eMMC/SD卡上建立swap分区

    1. 在Linux中使用下列命令查看系统分区情况

      # cat /proc/partitions
      

      可以看到我们的系统上有一个120GB,尚未分区的mmcblk0设备。

    2. 使用fdisk命令创建一个新的swap分区

      进入fdisk操作界面:# fdisk /dev/mmcblk0

      执行m指令,可以查看fdisk支持的基本功能:

      执行p指令,查看当前分区情况:

      可以看到当前mmcblk0尚未分区

      依次执行下图中所示指令,创建一个1GB大小的swap分区,最后使用w指令保存并退出fdisk工具:

    3. 查看新创建的swap分区

  3. 使用mkswap设置swap分区

    # mkswap /dev/mmcblk0p1
    

  4. 使用swapon开启swap功能

    # swapon /dev/mmcblk0p1
    

  5. 查看系统内存(包括swap分区)使用情况

    # free 或 free -m
    

    可以看到系统中已开启swap功能,swap分区大小约为1GB。

  6. 让系统开机自动加载swap分区

    使用swapon可以手动开启swap功能,使用swapoff可以手动关闭swap功能。若希望Linux启动后自动开启swap功能,则可以通过修改/etc/fstab文件来进行配置:

    $ vi /etc/fstab
    

    通过增加一行配置,使Linux启动时自动加载/dev/mmcblk0p1分区作为swap分区。

  7. 测试swap功能是否正常

    我们提供了一个测试程序来检测Linux的swap功能是否正常。该测试程序通过不断申请1MB大小的内存,直至超过系统可用物理内存(测试环境系统可用物理内存大约为70MB,而测试程序会累计申请大约255MB内存)。若系统未开启swap功能,则该测试程序会报out of memory错误并退出;若系统开启了swap功能,则系统会使用swap分区作为内存的扩充空间,该测试程序能够正常执行完。

    测试程序的源代码:swap_test.c,交叉编译后可执行swap_test

    交叉编译示例:

    $ arm-linux-gnueabihf-gcc swap_test.c -o swap_test
    

    编译完后,将可执行文件swap_test通过tftp或者其他方式传入开发板中,然后添加可执行权限:

    # chmod +x swap_test
    

    查看当前系统内存使用情况:# free -m

    让swap_test在后台运行:# ./swap_test &

    使用free-m命令不断查看当前系统内存使用情况,能够发现可用物理内存在不断减少。可用物理内存快减少到0时,系统开始使用Swap分区来作为内存的补充:

    最后,测试程序成功运行完成:

    注意事项:由于EMMC与SDIO公用一组pin,如果硬件是参考SDIO电路设计,测试EMMC时需要改为常供电。