lv12 linux 内核移植 10

目录

1 内核概述

1.1 内核与操作系统

1.2 Linux层次结构

1.3 Linux内核特点

2 Linux内核源码结构

2.1 Linux内核源码获取

2.2 源码结构

3 Linux内核移植

3.1 在 Linux 官网下载 Linux 内核源码(这里我们下载 linux-3.14.tar.xz)

3.2 拷贝内核源码包到 ubuntu 的家目录下,解压并进入其顶层目录

3.3 源码并不知道我们的处理器架构及交叉编译工具是什么,我们自己在 Makefile 中指定

3.4 指定使用的处理器

3.5  进入内核配置界面

3.6 配置内核

3.7 编译内核(该过程可能需要二十分钟左右)

3.8 编译设备树

3.9  测试内核和设备树

4 练习


1 内核概述

1.1 内核与操作系统

内核是一个操作系统的核心,提供了操作系统最基本的功能,是操作系统工作的基础,决定着整个系统的性能和稳定性

操作系统是在内核的基础上添加了各种工具集、桌面管理器、库、shell、应用程序

常用shell命令都在bin目录下,即是可执行文件,属于ubuntu系统不属于内核

开发板虽然没有ubuntu操作系统,但是也可以使用这些命令,都放在根文件系统下面 

1.2 Linux层次结构

linux实现了五大功能:进程管理、内存管理、文件系统、设备控制、网络  

1.3 Linux内核特点

  • xi代码结构清晰、模块化设计  
  • 支持丰富的硬件平台  
  • 较高的稳定性  
  • 轻量化及较强的裁剪性  
  • 开放源代码
  • 更新活跃、用户较多、资料丰富
  • 支持丰富的网络协议  
  • ... ...

2 Linux内核源码结构

2.1 Linux内核源码获取

Linux内核源码下载    

https://www.kernel.org/

单击

Index of /pub/

 找linux、kernel

Linux内核版本命名    

主版本号.次版本号.修订版本  

学习用3.14

Linux内核版本选择    

支持对应的硬件平台    

相对成熟的版本(资料多)    

稳定版本(次版本号为偶数的版本一般都是稳定版)

2.2 源码结构

平台相关代码    

arch:    与CPU架构相关的源代码(有许多cpu架构)

平台无关代码    

block:磁盘设备的支持            

crypto:加密相关    

drivers:设备驱动    (自带了很多驱动如IIC)         

firmware:固件    

fs:文件系统   (很多种文件系统)         

include:头文件    

init:内核初始化  (比较重要的是main.c,其中有一个init_start_kernel)    

ipc:进程间通信    

kernel:内核核心调度机制等        

Kconfig:linux自带图形化相关代码

sounds:音频驱动

lib:库    

mm:内存管理                

net:网络协议    

scripts:工具、脚本等            

security:安全    

usr:打包与压缩                

virt:虚拟

帮助文档、示例程序、工具等    

COPYING:        版权    

CREDITS:        内核贡献者    

README:        说明文档    (大概信息)

Documentation:    帮助文档    (详细说明)

Makefile:        编译管理    (不是所有代码都参与编译,可以让内核更小一些)

samples:        示例    

tools:        工具     ... ...

3 Linux内核移植

                                                   实验七 Linux 内核移植
【实验目的】
掌握 Linux 内核配置和编译的基本方法
【实验环境】
ubuntu 14.04 发行版
FS4412 实验平台
交叉编译工具: arm-none-linux-gnueabi-
【注意事项】
实验步骤中以“ $ ”开头的命令表示在 ubuntu 环境下执行,以“ # ”开头的命令表 示在开发板下执行
【实验步骤】

3.1 Linux 官网下载 Linux 内核源码(这里我们下载 linux-3.14.tar.xz

https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/

3.2 拷贝内核源码包到 ubuntu 的家目录下,解压并进入其顶层目录

$ tar xvf linux-3.14.tar.xz
$ cd linux-3.14

3.3 源码并不知道我们的处理器架构及交叉编译工具是什么,我们自己在 Makefile 中指定

$ vi Makefile

 

ARCH ?= $(SUBARCH)
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)

修改为以下内容(注意后边不要有多余空格),然后保存退出

ARCH ?= arm
CROSS_COMPILE ?= arm-none-linux-gnueabi-

3.4 指定使用的处理器

之前讲到过arm下面有与CPU架构相关的源代码,所以我们编译前需要配置

回到顶层目录下 

$ make exynos_defconfig    //make <soc_name>_defconfig    

显示如下信息表示配置成功

ls-a才能查看到.config文件,文件的格式如下,y代表设置,#注释掉了

注1:soc_name为当前使用的处理器的名字    

注2:内核源码的arch/arm/configs下对各个厂商的soc都有一个默认配置文件    

执行该命令后就会将对应的配置文件中的信息导入到源码顶层目录下的.config文件CONFIG_xxx=y表示内核选中了该功能,内核编译时就会将该功能对应的代码编译,内核的体积也会增大#CONFIG_xxx is not set表示内核没有选中该功能,内核编译时该功能对应的代码不会被编译,内核的体积也会减小。

默认配置只能保证内核拥有最基本的功能,我们需要根据自己的实际需求对内核做进一步的配置

方法1:     

直接修改.config文件(不推荐)    对依赖关系不是很清楚的时候,直接配置是不推荐的。如配置nfs,直接配置nfs不会生效,因为nfs还依赖tcp/ip,tcp/ip还依赖与网卡驱动

方法2:     

make menuconfig

3.5  进入内核配置界面

用得最多的配置命令

$ make menuconfig
弹出如下图形化配置界面,在该界面下我们可以对 linux 进行进一步的修改和配置
方向键可选择不同的选项,‘ Enter ’键进入子菜单,‘ Y’键选中某项功能,‘N’键去除某项功能,‘M’键将该功能编译成内核模块 ,两次‘ Esc ’键退出界面,‘ ? ’键 为帮助选项,‘/ ’键为搜索选项
1 :若显示如下信息,是因为 ubuntu 上没有安装对应的图形库
执行如下命令安装对应的图形库,然后重新执行 make menuconfig 即可
$ sudo apt-get install libncurses5-dev

注 2:若显示如下信息,是因为终端窗口太小,需将终端最大化后再执行

3.6 配置内核

将‘ System Type ’菜单下的‘ S3C UART... ’修改为 2 (即使用 UART2
System Type --->
    (2) S3C UART to use for low-level messages
设置完成后通过方向键选择‘ Save ’保存即可,然后选择‘ Exit ’退出该配置界面

3.7 编译内核(该过程可能需要二十分钟左右)

$ make uImage   //编译内核(编译选为“*”的选项到内核)


// 补充内核编译(以下命令均在内核源码的顶层目录下执行)
//    make uImage	
//	编译内核(编译选为“*”的选项到内核)
//    make modules   	
//	编译内核模块(编译选为“M”的选项为独立模块)
//    make dtbs      	
//	编译设备树(将设备树源文件dts编译为二进制文件dtb)
//    make clean     
//	删除编译过程中产生的中间文件

编译后报错 

看提示最后使用了OBJCOPY工具,把vmlinux.elf转换为了zimage.bin文件。不过我们需要uImage 

注:如图所示,第一次在 ubuntu 上编译 Linux 内核会提示缺少一个 mkimage 命令
该命令可在 uboot 源码中 u-boot-2013.01/tools/ 目录下获取(必须是编译后的 uboot
将该命令拷贝到 ubuntu /usr/bin 目录下即可正确编译内核
$ sudo cp u-boot-2013.01/tools/mkimage /usr/bin/

给该命令添加可执行权限

$ sudo chmod 777 /usr/bin/mkimage

完成后回到内核的顶层目录下重新编译内核即可

再次看一下信息,最后也显示如下信息表示编译成功,即在源码的 arch/arm/boot/ 目录下生成了 uImage 镜像

3.8 编译设备树

设备树概念:通常用于嵌入式系统的引导过程和设备驱动程序的管理。linux采用驱动逻辑和硬件信息相分离的模式。逻辑信息放在uImage里driver目录下(如点哪个灯),硬件信息放在设备树(如灯的寄存器),这样的好处:

  • 灵活性:使用分离的DTB允许在不重新编译内核的情况下更改硬件描述。这使得可以在不同的硬件平台上共享相同的内核镜像,只需加载不同的DTB即可。

  • 精简内核:使用分离的DTB可以使内核镜像更加精简,因为不同的硬件描述可以通过不同的DTB文件加载,而无需将所有硬件描述都编译进内核。

  • 维护性:设备树的独立性意味着可以在不影响内核的情况下对硬件进行更改和维护。

不同开发板都有不同的设备树,把所支持的开发板设备树都写了一遍。

内核源码中并没有 fs4412 平台的设备树文件,这里我们从源码支持的平台中找一个硬件与我们最类似的,在其基础上进行修改,这里我们参考的是 samsung 公司的 origen 拷贝 origen 的设备树并将其重命名
$ cp arch/arm/boot/dts/exynos4412-origen.dts arch/arm/boot/dts/exynos4412-fs4412.dts

因为添加的设备树文件也要编译,所以对应的 Makefile 也要修改

$ vi arch/arm/boot/dts/Makefile

exynos4412-origen.dtb \

后添加如下内容,然后保存退出

exynos4412-fs4412.dtb \

回到源码的顶层目录下编译设备树

$ make dtbs   //编译设备树(将设备树源文件dts编译为二进制文件dtb)

显示如下信息表示编译成功,即在arch/arm/boot/dts/目录下生成了exynos4412-fs4412.dtb

3.9  测试内核和设备树

将编译生成的内核和设备树拷贝到 tftp 的工作目录
$ sudo cp arch/arm/boot/uImage /tftpboot
$ sudo cp arch/arm/boot/dts/exynos4412-fs4412.dtb /tftpboot/
$ sudo chmod 777 /tftpboot/*

设置 uboot 启动参数并保存

# setenv ipaddr ***.***.***.***
# setenv serverip xxx.xxx.xxx.xxx
# setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm
41000000 - 42000000
# setenv bootargs root=/dev/nfs nfsroot=xxx.xxx.xxx.xxx:/opt/4412/rootfs/ rw
console=ttySAC2,115200 init=/linuxrc ip=***.***.***.***
# saveenv

1xxx.xxx.xxx.xxx ubuntu 主机的 ip***.***.***.***为开发板的 ip,必须和 ubuntu 主机的 ip 在同一个网段(根据自己电脑情况进行设置)

2 :以上设置手动输入,命令粘贴可能会有中文符号
回到 ubuntu tftp nfs 服务器
$ sudo service tftpd-hpa restart
$ sudo service nfs-kernel-server restart

重启开发板查看现象,如图所示,内核在启动到一半时会崩溃卡死,原因在于我们在该 实验中只是对 UART 进行了配置,而其他功能都保持默认选项,内核默认配置中没选 配我们使用的网卡驱动、nfs 等功能,所以在挂载根文件系统时导致内核崩溃,所以后 续我们还需要配置网卡驱动、nfs

查看目录

 

DM9000网卡未参与编译,去3.5配置界面选成M再次编译make uImage

编译后

dm9000.ko即内核模块,可以安装到 linux内核也可以单独卸载

4 练习

1.简述内核和操作系统的关系?


2.简述为什么嵌入式开发中一般都使用Linux内核?


3.简述.config文件的作用以及.config文件和make menuconfig的关系?


4.简述make menuconfig界面中[ ]选项和选项的区别? 

答:

1内核是一个操作系统的核心,提供了操作系统最基本的功能,是操作系统工作的基础,决定着整个系统的性能和稳定性

操作系统是在内核的基础上添加了各种工具集、桌面管理器、库、shell、应用程序等
2 linux内核,代码结构清晰、模块化设计、支持丰富的硬件平台、较高的稳定性、轻量化及较强的裁剪性、开放源代码
更新活跃、用户较多、资料丰富、支持丰富的网络协议 
3 .config是内核编译时选择内核模块的配置文件,y代表选中该功能,#CONFIG_xxxis not set 代表没有选中该功能
  .config 时直接使用的配置文件,make menuconfig是可以使用图型化界面修改.config,本质一样,但是menuconfig 可以避免对依赖关系不清楚而导致配置错误或者误操作,更推荐
4 * 代表选中编译到内核中 空代表未选中 M代表被选为模块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/257751.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

centos开机自启动实战小案例

1.编写一个我们需要做事的脚本 #!/bin/bash # 打印 "Hello" echo "Hello,Mr.Phor" # 为了更好的能看到效果 我们把这段文本放置到一个文件中 如果重启能够看到 /a.txt文件 我们实验成功 echo "hahahahahahahaha" > /a.txt #每次开机 执行…

Windows/Linux双系统安装(双系统独立分盘)

一、固态硬盘、机械硬盘及U盘概述 &#xff08;一&#xff09;机械硬盘[1][3] 硬盘驱动器&#xff08;Hard Disk Drive&#xff0c;HDD&#xff09;&#xff0c;又称“机械硬盘”或“传统硬盘”&#xff0c;是电脑上使用刚性的旋转磁性盘片为基础的非依电性存储器&#xff0c;…

Eclipse_03_如何加快index速度

1. ini配置文件 -Xms&#xff1a;是最小堆内存大小&#xff0c;也是初始堆内存大小&#xff0c;因为堆内存大小可以根据使用情况进行扩容&#xff0c;所以初始值最小&#xff0c;随着扩容慢慢变大。 -Xmx&#xff1a;是最大堆内存大小&#xff0c;随着堆内存的使用率越来越高&a…

CentOS 8离线安装telnet

下载telnet rpm安装包&#xff0c;可从https://www.rpmfind.net/linux/rpm2html/search.php?querytelnet&submitSearch…&systemcentos&arch 根据自己的操作系统下载对应的包&#xff0c;这里以CentOS8为例,分别下载如下的rtp包 xinetd-2.3.15-24.el8.x86_64.rpm…

IDEA shorten command line介绍和JAR manifest 导致mybatis找不到接口类处理

如果类路径太长&#xff0c;或者有许多VM参数&#xff0c;程序就无法启动。原因是大多数操作系统都有命令行长度限制。在这种情况下&#xff0c;IntelliJIDEA将试图缩短类路径。最好选中 classpath file模式。 shorten command line 选项提供三种选项缩短类路径。 none&#x…

JMUer-网络新技术课程期末考试复习整理

✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​ &#x1f649;联系作者&#x1f648;by QQ&#xff1a;813942269&#x1f427; &#x1f308;致亲爱的读者&#xff1a;很高兴你…

智能优化算法应用:基于黑寡妇算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于黑寡妇算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于黑寡妇算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.黑寡妇算法4.实验参数设定5.算法结果6.参考文…

单片机应用实例:LED显示电脑电子钟

本例介绍一种用LED制作的电脑电子钟&#xff08;电脑万年历&#xff09;。其制作完成装潢后的照片如下图&#xff1a; 上图中&#xff0c;年、月、日及时间选用的是1.2寸共阳数码管&#xff0c;星期选用的是2.3寸数码管&#xff0c;温度选用的是0.5寸数码管&#xff0c;也可根据…

Vue+ElementUI前端添加展开收起搜索框按钮

1、搜索框添加判断 v-if"advanced" <el-form-item label"创建日期" v-if"advanced"><el-date-pickerv-model"daterangeLedat"size"small"style"width: 240px"value-format"yyyy-MM-dd"type&q…

基于grpc从零开始搭建一个准生产分布式应用(7) - 01 - 附:GRPC拦截器源码

开始前必读&#xff1a;​​基于grpc从零开始搭建一个准生产分布式应用(0) - quickStart​​ 一、源码目录结构 二、GRPC拦截器源码 2.1、com.zd.baseframework.core.core.common.interceptor package com.zd.baseframework.core.core.common.interceptor;import com.zd.ba…

element plus 表格el-table行多选单选

1 行多选-点击checkbox 添加一个 el-table-column&#xff0c;设 type 属性为 selection 即可 <template><div class"box"><el-table :data"tableData" selection-change"handleSelectionChange"><el-table-column type&…

docker小白第六天

docker小白第六天 容器数据卷是什么 首先&#xff0c;容器卷有个坑&#xff1a;容器卷需要加入privilegedtrue&#xff0c;如下图所示&#xff0c;是为了解决permission denied的问题。其中“挂载”的意思是相当于一个硬盘插到主机上。使用该命令。是扩大容器的权限解决挂载目…

路由器设置代理IP教程,http代理怎么固定IP地址?

路由器设置代理IP教程 一、确定代理IP地址 首先&#xff0c;你需要确定你要使用的代理IP地址。你可以从代理服务提供商处获取代理IP地址和端口号。 二、登录路由器管理界面 在浏览器中输入路由器的IP地址&#xff0c;输入账号和密码&#xff0c;进入路由器的管理界面。 三、设置…

高级桌面编程(二)

一、前言 文章的续作前文是&#xff1a; 高级桌面编程&#xff08;一&#xff09;-CSDN博客https://blog.csdn.net/qq_71897293/article/details/135072204?spm1001.2014.3001.5502 二、自定义控件 1创建自定义控件&#xff0c;如下图所示&#xff1a; 2 在创建的页面可以…

架构设计系列之前端架构和后端架构的区别和联系

前端架构和后端架构都是软件系统中最关键的架构层&#xff0c;负责处理不同方面的任务和逻辑&#xff0c;两者之间是存在一些区别和联系的&#xff0c;我会从以下几个方面来阐述&#xff1a; 一、定位和职责 前端架构 主要关注用户界面和用户体验&#xff0c;负责处理用户与…

10000字讲解TCP协议(确认应答,超时重传,三次握手,四次挥手等等众多机制)以及UDP协议(UDP报文,校验和)

文章目录 UDP协议&#xff1f;什么是校验和&#xff1f;基于UDP的应用层协议(了解) TCP协议确认应答(可靠性机制)超时重传(可靠性机制)连接管理(可靠性机制)三次握手(重点)四次挥手(重点) 三次握手和四次挥手时客户端和服务器的状态滑动窗口(效率机制)流量控制(效率机制)窗口探…

大型语言模型:SBERT — Sentence-BERT

slavahead 一、介绍 Transformer 在 NLP 方面取得了进化进步&#xff0c;这已经不是什么秘密了。基于转换器&#xff0c;许多其他机器学习模型已经发展起来。其中之一是BERT&#xff0c;它主要由几个堆叠的变压器编码器组成。除了用于情感分析或问答等一系列不同的问题外&#…

国产ToolLLM的课代表---OpenBMB机构(清华NLP)旗下ToolBench的安装部署与运行(附各种填坑说明)

ToolBench项目可以理解为一个能直接提供训练ToolLLM的平台&#xff0c;该平台同时构建了ToolLLM的一个开源训练指令集。&#xff0c;该项目是OpenBMB机构&#xff08;面壁智能与清华NLP联合成立&#xff09;旗下的一款产品&#xff0c;OpenBMB机构名下还同时拥有另外一款明星产…

一种基于IWR6843雷达的跌倒检测系统的设计和实现(TI文档)

摘要 随着年龄增长&#xff0c;人体各项生理机能退化严重&#xff0c;老年人很容易发生跌倒&#xff0c;导致身体受到严重的伤害。近年来&#xff0c;随着国内人口老龄化越来越严重&#xff0c;主要针对老年人的跌倒检测系统正受到越来越多的关注。和常用的加速度传感器和视觉技…

vue el-date-picker中datetime类型对今天之后的日期包含时分禁用

vue el-date-picker中datetime类型对今天之后的日期包含时分禁用 目前对选择秒那一列未禁用 <template><div><el-date-pickerv-model"deactivateTime"type"datetime"format"yyyy-MM-dd HH:mm:ss"value-format"yyyy-MM-dd HH…