1. 编译linux内核

  NXP从linux官网下载内核,然后移植到自己的CPU,我们的移植是基于NXP,再移植到自己的开发板。

制作一个sh:

#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

2. Linux工程目录分析

需要关注的文件夹和文件如下:

  1. arch目录:和架构有关,进行CPU的配置。
     arch/arm/configs:默认配置文件。
     arch/arm/boot/dts:设备树文件。
     arch/arm/boot:保存编译出的Image和zImage文件。
     arch/arm/mach-xxx:驱动和初始化文件。
  2. block目录:Linux的块设备目录,存放管理SD,EMMC等块设备的文件。
  3. crypto目录:加密文件crc,crc32,md4,hash等。
  4. Documentation目录:Linux相关文档。
  5. drivers目录:驱动目录文件。
  6. firmware目录:存放固件。
  7. fs目录:存放文件系统如fs/ext4等。
  8. include;init头文件目录;linux内核启动时初始化代码。
  9. ipc;kernel;lib;mm:进程间通信代码;内核代码;库;内存管理代码。
  10. net;samples;scripts网络相关代码;示例代码;脚本文件。
  11. security;sound;tools;usr:安全相关;音频相关;编译工具;initramfs有关。
  12. virt;.config;Kbuild;Kconfig:虚拟机相关;linux的最终配置信息;Makefile会读取;图形化界面配置文件
  13. Makefile

Linux顶层Makefile主要就是生成vmlinux并压缩成zImage。
关于几个编译出来的文件:
①vmlinux:最原始的内核文件,未压缩的。
②Image:Linux内核镜像文件,仅包含可执行的二进制数据。
③zImage:zImage是gzip压缩后的Image。
④uImage:老版本uboot专用的镜像文件。比zImage多一些头部信息。

3. Linux内核启动流程

查看linux内核的链接脚本文件arch/arm/kernel/vmlinux.lds:

ENTRY(stext)            /*指明Linux内核入口为stext*/

stext在arch/arm/kernel/head.S中,简单概括一下其流程:
①__lookup_processor_type:找到对应处理器的procinfo结构。
②__vet_atags:验证设备树的合法性。
③__create_page_tables:创建页表。
④__mmap_switched:调用start_kernel函数。
⑤__enable_mmu:使能MMU,执行__mmap_switched。

start_kernel函数最终调用了rest_init(init/main.c),简单流程概括为:
①rcu_scheduler_starting:启动RCU锁调度器。
②kernel_thread:创建kernel_init内核进程,PID=1。实现内核态到用户态的转变。
③kernel_thread:创建kthreadd内核进程,PID=2。负责进行所有内核进程的调度管理。
④cpu_startup_entry:进入idle(空闲)进程,PID=0。

ps -A         /*在linux终端输入该命令以查看当前所有进程(不显示内核态进程)*/

  Linux内核构建完成后挂载rootfs根文件系统,执行根文件系统中的init程序进入用户态。

4. Linux内核移植

4.1 根文件系统缺失错误

  根文件系统存放是有uboot的bootargs环境变量指定的。这里bootargs如下,根文件系统存储在/dev/mmcblk1p2也就是EMMC的分区2。

console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw

  实际做产品的话新硬件是没有对应的根文件系统的,在这之前linux内核没有rootfs,启动时会报根文件系统缺失错误。提示内核崩溃,VFS虚拟文件系统不能挂载根文件系统(内核依然是启动的)。

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

4.2 在Linux中添加自己的开发板

  编译了NXP的evk板子对应内核,可以在正点原子EMMC板上启动,所以基于NXP的imx_v7_mfg_config添加自己的开发板。

4.2.1 添加开发板默认配置文件和设备树文件

  复制imx_v7_mfg_config为imx_alientek_emmc_defconfig,做如下修改:注释掉“CONFIG_ARCH_MULTI_V6=y”。6ULL是V7架构,所以要屏蔽掉V6相关选项。
  复制imx6ull-14x14-evk.dts为imx6ull-alientek-emmc.dts,修改对应层级Makefile,在“dtb-
$(CONFIG_SOC_IMX6ULL)”配置项中加入imx6ull-alientek-emmc.dtb,确保dts可以编译为dtb。
  这里编译了一下,成功启动了linux,说明开发板添加上去了,但是还要修改一些配置。

4.2.2 CPU主频和网络驱动修改

4.2.2.1 CPU主频修改

启动linux内核并查看一下cpu信息,如下,MogoMIPS代表处理器性能:

上面看不到主频,进入一下目录中查看,CPU频率为792MHz。

使用如下命令查看CPU在各频率下的工作时长:

查看CPU调频策略,这里performance表示一直运行在最高频,但是实际开发中建议切换为ondemand模式,根据负载自动切换频率。

4.2.2.2 EMMC驱动修改

**1)使能8线EMMC驱动:**将imx6ull-alientek-emmc.dts中“&usdhc2”的内容修改为:

&usdhc2 {pinctrl-names = "default", "state_100mhz", "state_200mhz";pinctrl-0 = <&pinctrl_usdhc2_8bit>;pinctrl-1 = <&pinctrl_usdhc2_8bit_100mhz>;pinctrl-2 = <&pinctrl_usdhc2_8bit_200mhz>;bus-width = <8>;non-removable;no-1-8-v;status = "okay";
};

2)关闭EMMC 1.8V供电选项:
  正点原子emmc板EMMC工作电压为3.3V,所以要关闭1.8V选项避免驱动出现问题。在上面的“&usdhc2”加入“no-1-8-v;”

4.2.2.3 网络驱动修改

  NXP的板子和我们的板子不是一个PHY芯片,它将SR8201F需要的引脚给spi4用了,所以先在dts文件里去除相关配置。然后在dts的“iomuxc_snvs”节点里添加如下网络引脚复位信息。

  然后修改fec1和fec2节点的pinctrl-0属性,在里面加上&pinctrl_enetx_reset。接下来修改SR8201F的PHY地址,在fec1和2节点中添加以下内容:

phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;    /*ENET1为GPIO5_IO07,ENET2为08*/   /*低电平有效*/
phy-reset-duration = <200>;                      /*复位电平信号持续时间200ms*/smsc,disable-energy-detect;           /*表明PHY芯片时SMSC公司的,内核就会找到相应驱动驱动LAN8720A*/

  在fec_main.c文件中的fec_reset_phy函数最后再加一句“msleep(200)”,因为复位结束后至少还要再过150ms才可以继续操作SR8201F。

测试:
linux启动后,输入ifconfig -a查看所有网卡。然后输入ifconfig eth0 up启动ENET2,有ip地址说明开启了。可以使用ifconfig eth0 xxx配置其ip地址。

嵌入式Linux(二十二)Linux内核分析及移植相关推荐

  1. 从零开始的linux 第十二章

    从零开始的linux 第十二章 (敲门声)咚咚咚... 路人甲:"小..小编大人在家吗?" (睡意朦胧的小编去开门):唉??路...路人甲!? (↑看到小编后的路人甲):" ...

  2. LINUX学习基础篇(二十二)硬盘结构

    LINUX学习基础篇(二十二)文件系统管理 硬盘 磁盘结构 硬盘接口 硬盘 磁盘结构 扇区是磁盘的最小存储单位,每个扇区的大小是固定的,为512Byte.硬盘里有多个磁盘,每个磁盘中,有多个同心圆,这 ...

  3. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  4. JAVA基础知识总结:一到二十二全部总结

    >一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...

  5. 读书二十二载,信念很简单,把书念下去,然后走出去,不枉活一世。

    ‍ ‍ 关注+星标公众号,不错过精彩内容 昨天看了一篇关于博士论文的致谢,看的我想哭.改变命运有很多条路,但是对于大多数人而言,读书是改变命运的捷径. 内容是讲述了自己20多年的求学经历:小时候煤油灯 ...

  6. 2021年大数据Hadoop(二十二):MapReduce的自定义分组

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 MapReduce的自定义分组 需求 分析 实现 第一步: ...

  7. 自然语言处理系列二十二》词性标注》词性标注原理》词性介绍

    注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书<分布式机器学习实战>(人工智能科学与技术丛书)[陈敬雷编著][清华大学出版社] 文章目录 自然语言处理系列二十二 词性 ...

  8. (二十二)访问者模式详解(伪动态双分派) - 转

    作者:zuoxiaolong8810(左潇龙),转载请注明出处. 本次LZ和各位分享一下访问者模式,从场景.设计初衷以及实现方面来说,访问者模式算是LZ即将写到的24种设计模式当中,最复杂也是最难理解 ...

  9. 数字符号哥德尔数配置及变元、公式和谓词散议——哥德尔读后之二十二

    数字符号哥德尔数配置及变元.公式和谓词散议--哥德尔读后之二十二 这篇博文折腾了我近一个月,广州从8月以来几乎天天都在摄氏35度的酷热之中,满以为在秋凉之前可以完成,可你要从阅读哥德尔原著中找到些感觉 ...

  10. 读后感: 波、波、波---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十二)

    波.波.波---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十二) http://blog.csdn.net/david_lv/archive/2008/06/26/2589809.aspx ...

最新文章

  1. python基础---元组、字典、函数、文件、异常
  2. Python进阶7——字典与集合
  3. CF1096E The Top Scorer
  4. css中定义超级链接的样式
  5. PacificA: Replication in Log-Based Distributed Storage Systems 论文理解
  6. 分布式系统原理 之9 CAP 理论
  7. postgresql存图片字段类型_C# 使用 PostgreSQL 存储图片二进制数据
  8. pymysql使用变化的变量,构造SQL语句
  9. hdu 1861 游船出租 tag:模拟
  10. 老码农:我为什么建议程序员尽早进入大厂?
  11. 福昕阅读器最新注册方法
  12. Android模拟器哪个稳定,哪个安卓模拟器好 什么安卓模拟器稳定流畅速度快不卡顿...
  13. PCB正片和负片的个人理解
  14. 步进电机的计算机控制系统设计,步进电机控制系统的设计与实现
  15. javascript基础常识问答(四)
  16. Font Awesome html源码,如何将 Font Awesome 转成 PNG 图标 详细教程 含源代码_html/css_WEB-ITnose...
  17. floor()函数的使用
  18. 【时序逻辑电路(sequential logic circuit)】
  19. failed to load steamui.dll怎么解决?
  20. mysql 时间段分组,MySQL 按时间单位进行分组

热门文章

  1. Launchy、FARR、AutoHotKey哪个快速启动软件好?
  2. 初识RDMA技术——RDMA概念,特点,协议,通信流程
  3. 【clickhouse 按时间查询】
  4. 深圳交易所证券交易规则
  5. 行业:微软收购动视暴雪遭遇困难
  6. 电商结合供应链系统项目开发(现成源码)
  7. 为了给手机省电,,LTE 和NR 都做了些啥?--DRX
  8. 液晶拼接屏安装过程有何要求?
  9. modprobe命令详解
  10. 数据库linux安装prm,在Ubuntu 18.04服务器上安装Monica PRM的步骤