学习正点原子linux开发板过程的坑

   在写这篇博客之前,首先要要感谢群友:小沙,帮我解答疑惑为了今后备忘,所以这里将其中的一些点记录下来,方便今后查看。

根据大牛的对话整理,仅用于参考学习:

1、Linux 内核和文件系统 之间,什么关系?没有文件系统,Linux能运行不能运行?

        可以有也可以没有,Linux这个操作系统,很奇怪!必须要挂一个文件系统!像有些操作系统,比如Vxworks就不需要,uCos也不需要,但是,Linux必须要挂个文件系统!!

2、Linux什么时候挂载文件系统呢?是在一开始就挂载呢,还是最后才挂载?

        Linux是在运行的最后才挂载文件系统!Linux启动到最后,等所有驱动初始化完成以后,最后一步才挂载文件系统,而这个文件系统就是Android系统!QT和Android系统一样,都算是个文件系统,而QT和Android的底层都是 Linux内核。ubuntu也是这样,也只是linux内核起来以后挂载的一个文件系统!几套系统底层全是Linux内核,而这几套系统又都是Linux内核起来以后挂载的文件系统。

3、开发板一开机以后先运行什么?

      uboot,就是bootloader,uboot的运行,大家在串口终端里会看到打印这样的信息:

从打印信息可以看到UBOOT检测内存,存储等设备,并且设置处理器等设备的时钟等等,uboot到最后干什么事情呢?它在等待你敲击任何键,让他停下来,如果你不敲击,就干什么呢,它就开始引导内核,也就是把zImage 那个文件拷贝到内存,并去运行,接着看内核的打印信息:

你会看到内核不断的打印出各种外部设备的信息,说明它在对各种外设进行 驱动初始化,比如SPI、蓝牙、以太网等等,所有的驱动都在里面!最后干什么了呢?是的,就是挂载文件系统。

4、那么什么是文件系统?

文件系统玩过电脑的人都知道,就是类似windows的文件管理器

Linux挂载的文件系统和这个一样吗,是的!!这个时候问题来了,zImage,也就是Linux内核,它执行到最后,挂载一个文件系统,就能变出Android系统?实际上,Linux内核最后挂载那个文件系统,不仅仅是挂载,还要做什么呢,执行文件系统里的应用程序!执行着 。。。执行着。。。。执行了一个又一个应用程序。。。。Android的界面出来了!!实际上,你真的可以把Android看做Linux上面跑的一个应用程序!的确是,Android就是一个在Linux内核上跑的一个巨大应用程序!Android这个应用程序,就放在了Linux内核最后挂载的那个文件系统里面。
 

好了经过上面的介绍,我们就知道了uBoot 、zImage 、文件系统是多么的重要,这对于后面的驱动开始打好基础的。我的的硬件平台是用的原子的imx6ull Emmc开发板,其中的Uboot 和文件系统我是根据教程一点点坐下来的,有空我会把Uboot文件系统的总结,今天只总结linux内核的编译,我之前想想直接用原子的内核的,但是在驱动开发的时候,遇到一个问题,没法加载模块,如图所示:

后来群友小沙告诉我:

扫描二维码关注公众号,回复: 9845515 查看本文章

原来如此,看来一切都是要还 是不能偷懒,不能直接拿原子的直接用,需要自己去编译内核:

下面总结一下编译内核:

进入linux内核目录下:

  •  修改顶层的makefile 定义ARCH与CROSS_COMPILE 这两个变量的值
  •   配置并编译内核 :
  •  
     make clean //第一次编译 Linux 内核之前先清理一下
  •   添加开发板默认的文件:
  •   
    cd arch/arm/configs
    cp imx_v7_mfg_defconfig imx_alientek_emmc_defconfig
    make imx_alientek_emmc_defconfig
    

    编译内核:

  • make -j4

    编译完后:我们就可以看到产生的zImage与设备树了

       在进入到cd dts ,我们就可以看到设备树文件 

cd arch/arm/boot/dts
cp imx6ull-14x14-evk.dts imx6ull-alientek-emmc.dts

         dts 是设备树源码文件,编译 Linux 的时候会将其编译为.dtb 文件。imx6ull-alientek-emmc.dts创 建 好 以 后 我 们 还 需 要 修 改 文 件 arch/arm/boot/dts/Makefile , 找 到 “ dtb-$(CONFIG_SOC_IMX6ULL)”配置项,在此配置项中加入“imx6ull-alientek-emmc.dtb” ,如下所示:
示例代码 37.3.2.1 arch/arm/boot/dts/Makefile 代码段

400 dtb-$(CONFIG_SOC_IMX6ULL) += \
401 imx6ull-14x14-ddr3-arm2.dtb \
402 imx6ull-14x14-ddr3-arm2-adc.dtb \
403 imx6ull-14x14-ddr3-arm2-cs42888.dtb \
404 imx6ull-14x14-ddr3-arm2-ecspi.dtb \
405 imx6ull-14x14-ddr3-arm2-emmc.dtb \
406 imx6ull-14x14-ddr3-arm2-epdc.dtb \
407 imx6ull-14x14-ddr3-arm2-flexcan2.dtb \
408 imx6ull-14x14-ddr3-arm2-gpmi-weim.dtb \
409 imx6ull-14x14-ddr3-arm2-lcdif.dtb \
410 imx6ull-14x14-ddr3-arm2-ldo.dtb \
411 imx6ull-14x14-ddr3-arm2-qspi.dtb \
412 imx6ull-14x14-ddr3-arm2-qspi-all.dtb \
413 imx6ull-14x14-ddr3-arm2-tsc.dtb \
414 imx6ull-14x14-ddr3-arm2-uart2.dtb \
415 imx6ull-14x14-ddr3-arm2-usb.dtb \
416 imx6ull-14x14-ddr3-arm2-wm8958.dtb \
417 imx6ull-14x14-evk.dtb \
418 imx6ull-14x14-evk-btwifi.dtb \
419 imx6ull-14x14-evk-emmc.dtb \
420 imx6ull-14x14-evk-gpmi-weim.dtb \
421 imx6ull-14x14-evk-usb-certi.dtb \
422 imx6ull-alientek-emmc.dtb \:
424 imx6ull-9x9-evk-btwifi.dtb \
425 imx6ull-9x9-evk-ldo.dtb


第 422 行为“imx6ull-alientek-emmc.dtb”,这样编译 Linux 的时候就可以从 imx6ull-alientekemmc.dts 编译出 imx6ull-alientek-emmc.dtb 文件了。

         arch/arm/boot下生成 zImage 镜像文件。在 arch/arm/boot/dts 目录下生成 imx6ull-alientek-emmc.dtb文件。将这两个文件拷贝到 tftp 目录下,然后重启开发板,在 uboot 命令模式中使用 tftp 命令下载这两个文件并启动。具体nfs启动看我的另外一个博客,已经成功一半了,接下来就是挂载模块modules操作。

具体指令:

1-确定安装模块路径:

       sudo make modules_install INSTALL_MOD_PATH=/home/zjl/linux_Imx/nfs/rootfs/

 2-编译内核模块:

      

 好了,下面感觉可以利用nfs挂载模块了:

我这里还是出现了一个问题:使用modprobe 加载模块找不到居然,玄学,明明在该路径下但就是找不到,如果后面的大牛看到这个地方麻烦告诉我下原因,现在我是用insmod加载模块的,加载模块成功的。今晚先写到这。

发布了102 篇原创文章 · 获赞 26 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42145502/article/details/103941234