嵌入式Linux(二十二)Linux内核分析及移植
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工程目录分析
需要关注的文件夹和文件如下:
- arch目录:和架构有关,进行CPU的配置。
arch/arm/configs:默认配置文件。
arch/arm/boot/dts:设备树文件。
arch/arm/boot:保存编译出的Image和zImage文件。
arch/arm/mach-xxx:驱动和初始化文件。 - block目录:Linux的块设备目录,存放管理SD,EMMC等块设备的文件。
- crypto目录:加密文件crc,crc32,md4,hash等。
- Documentation目录:Linux相关文档。
- drivers目录:驱动目录文件。
- firmware目录:存放固件。
- fs目录:存放文件系统如fs/ext4等。
- include;init:头文件目录;linux内核启动时初始化代码。
- ipc;kernel;lib;mm:进程间通信代码;内核代码;库;内存管理代码。
- net;samples;scripts:网络相关代码;示例代码;脚本文件。
- security;sound;tools;usr:安全相关;音频相关;编译工具;initramfs有关。
- virt;.config;Kbuild;Kconfig:虚拟机相关;linux的最终配置信息;Makefile会读取;图形化界面配置文件。
- 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内核分析及移植相关推荐
- 从零开始的linux 第十二章
从零开始的linux 第十二章 (敲门声)咚咚咚... 路人甲:"小..小编大人在家吗?" (睡意朦胧的小编去开门):唉??路...路人甲!? (↑看到小编后的路人甲):" ...
- LINUX学习基础篇(二十二)硬盘结构
LINUX学习基础篇(二十二)文件系统管理 硬盘 磁盘结构 硬盘接口 硬盘 磁盘结构 扇区是磁盘的最小存储单位,每个扇区的大小是固定的,为512Byte.硬盘里有多个磁盘,每个磁盘中,有多个同心圆,这 ...
- OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十
OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...
- JAVA基础知识总结:一到二十二全部总结
>一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...
- 读书二十二载,信念很简单,把书念下去,然后走出去,不枉活一世。
关注+星标公众号,不错过精彩内容 昨天看了一篇关于博士论文的致谢,看的我想哭.改变命运有很多条路,但是对于大多数人而言,读书是改变命运的捷径. 内容是讲述了自己20多年的求学经历:小时候煤油灯 ...
- 2021年大数据Hadoop(二十二):MapReduce的自定义分组
全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 MapReduce的自定义分组 需求 分析 实现 第一步: ...
- 自然语言处理系列二十二》词性标注》词性标注原理》词性介绍
注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书<分布式机器学习实战>(人工智能科学与技术丛书)[陈敬雷编著][清华大学出版社] 文章目录 自然语言处理系列二十二 词性 ...
- (二十二)访问者模式详解(伪动态双分派) - 转
作者:zuoxiaolong8810(左潇龙),转载请注明出处. 本次LZ和各位分享一下访问者模式,从场景.设计初衷以及实现方面来说,访问者模式算是LZ即将写到的24种设计模式当中,最复杂也是最难理解 ...
- 数字符号哥德尔数配置及变元、公式和谓词散议——哥德尔读后之二十二
数字符号哥德尔数配置及变元.公式和谓词散议--哥德尔读后之二十二 这篇博文折腾了我近一个月,广州从8月以来几乎天天都在摄氏35度的酷热之中,满以为在秋凉之前可以完成,可你要从阅读哥德尔原著中找到些感觉 ...
- 读后感: 波、波、波---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十二)
波.波.波---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十二) http://blog.csdn.net/david_lv/archive/2008/06/26/2589809.aspx ...
最新文章
- python基础---元组、字典、函数、文件、异常
- Python进阶7——字典与集合
- CF1096E The Top Scorer
- css中定义超级链接的样式
- PacificA: Replication in Log-Based Distributed Storage Systems 论文理解
- 分布式系统原理 之9 CAP 理论
- postgresql存图片字段类型_C# 使用 PostgreSQL 存储图片二进制数据
- pymysql使用变化的变量,构造SQL语句
- hdu 1861 游船出租 tag:模拟
- 老码农:我为什么建议程序员尽早进入大厂?
- 福昕阅读器最新注册方法
- Android模拟器哪个稳定,哪个安卓模拟器好 什么安卓模拟器稳定流畅速度快不卡顿...
- PCB正片和负片的个人理解
- 步进电机的计算机控制系统设计,步进电机控制系统的设计与实现
- javascript基础常识问答(四)
- Font Awesome html源码,如何将 Font Awesome 转成 PNG 图标 详细教程 含源代码_html/css_WEB-ITnose...
- floor()函数的使用
- 【时序逻辑电路(sequential logic circuit)】
- failed to load steamui.dll怎么解决?
- mysql 时间段分组,MySQL 按时间单位进行分组