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代表被选为模块

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gitee:远程仓库步骤

第一步&#xff1a;新建仓库 第二步&#xff1a;初始化本地仓库&#xff0c;git init 创建分支 git branch 新分支名 第三步&#xff1a;git add . &#xff1a;添加到暂存区 第四步&#xff1a;git config –global user.email关联邮箱&#xff0c;user.name用户名 第…

C++模板进阶

文章目录 前言反向迭代器反向迭代器和正向迭代器的区别stl反向迭代器源码反向迭代器模拟实现测试 模板进阶非类型模板参数Array 模板的特化模板的分离编译 前言 模板进阶也没有到一些特别的东西&#xff0c;就是讲比较偏的一些特性。 在这里我们先来讲一下反向迭代器。 反向迭…

Linux常用网络指令

网络参数设定使用的指令 手动/自动设定与启动/关闭 IP 参数&#xff1a;ifconfig, ifup, ifdown ifconfig ifconfig常用于修改网络配置以及查看网络参数的指令 [rootwww ~]# ifconfig {interface} {up|down} < 观察与启动接口 [rootwww ~]# ifconfig interface {options…

net6使用StackExchangeRedis实现分布式缓存

上一篇讲解了Redis的搭建及ServiceStack.Redis 与 StackExchange.Reids 的区别https://blog.csdn.net/qq_39569480/article/details/105249607 这篇文章遗我们来说下使用Microsoft.Extensions.Caching.StackExchangeRedis来对redis进行操作及帮助类。 首先在windows上安装red…

产品入门第六讲:Axure中继器

&#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​​​​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Axure》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c…

Unity | Shader基础知识(第七集:案例<让图片和外部颜色叠加显示>)

目录 一、本节介绍 1 上集回顾 2 本节介绍 二、添加图片资源 三、 常用cg数据类型 1 float 2 bool 3 sampler 四、加入图片资源 五、使用图片资源 1 在通道里加入资源 2 使用图片和颜色叠加 2.1 2D纹理采样tex2D 2.2 组合颜色 六、全部代码 七、下集介绍 相关…

git-lfs基本知识讲解

目录 1. 基本知识2. 安装 1. 基本知识 git-lfs 是 Git Large File Storage 的缩写&#xff0c;是 Git 的一个扩展&#xff0c;用于处理大文件的版本控制。 它允许你有效地管理和存储大型二进制文件&#xff0c;而不会使 Git 仓库变得过大和不稳定。以下是一些与 git-lfs 相关…

【微服务】springboot整合minio详解

目录 一、前言 二、Minio 概述 2.1 Minio简介 2.1 Minio特点 三、Minio 环境搭建 3.1 部署过程 3.1.1 拉取镜像 3.1.2 启动容器 3.1.3 访问web页面 四、Minio基本使用 4.1 基本概念 4.2 上传文件演示 4.3 用户管理 4.4 Java操作Minio 4.4.1 导入依赖 4.4.2 上传…

机器学习——支持向量机

目录 一、基于最大间隔分隔数据 二、寻找最大间隔 1. 最大间隔 2. 拉格朗日乘子法 3. 对偶问题 三、SMO高效优化算法 四、软间隔 五、SMO算法实现 1. 简化版SMO算法 2. 完整版SMO算法 3. 可视化决策结果 六、核函数 1. 线性不可分——高维可分 2. 核函数 …

调用第三方http接口 hutool工具类

1、引入依赖 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.0.M2</version> </dependency>2、请求组装 String params"<BSXml>" " <MsgHeader>&…

org.springframework.boot.autoconfigure.AutoConfiguration.imports新版自动配置

文章目录 场景 场景 springboot2.7.0之后的版本 自动配置方式有了变化, 新版兼容旧版 旧版新版META-INF/spring.factoriesMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.importsConfigurationAutoConfiguration

【期末复习向】长江后浪推前浪之ChatGPT概述

参考文章&#xff1a;GPT系列模型技术路径演进-CSDN博客 这篇文章讲了之前称霸NLP领域的预训练模型bert&#xff0c;它是基于预训练理念&#xff0c;采用完形填空和下一句预测任务2个预训练任务完成特征的提取。当时很多的特定领域的NLP任务&#xff08;如情感分类&#xff0c…

STM32-UART-DMA HAL库缓冲收发

文章目录 1、说明1.1、注意事项&#xff1a;1.2、接收部分1.3、发送部分 2、代码2.1、初始化2.2、缓冲接收2.3、缓冲发送2.4、格式化打印 1、说明 1.1、注意事项&#xff1a; HAL库的DMA底层基本都会默认开启中断使能&#xff0c;如果在STM32CubeMx禁用了中断相关的功能&…

基于vue+element-plus+echarts制作动态绘图页面(柱状图,饼图和折线图)

前言 我们知道echarts是一个非常强大的绘图库&#xff0c;基于这个库&#xff0c;我们可以绘制出精美的图表。对于一张图来说&#xff0c;其实比较重要的就是配置项&#xff0c;填入不同的配置内容就可以呈现出不同的效果。 当然配置项中除了样式之外&#xff0c;最重要的就是…

07-抽象工厂

意图 提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们具体的类。 适用性 在以下的情况可以选择使用抽象工厂模式&#xff1a; 一个系统要独立于它的产品的创建、组合和表示。一个系统要由多个产品系列中的一个来配置。要强调一系列相关的产品对象的…

linux驱动的学习 驱动开发初识

1 设备的概念 在学习驱动和其开发之前&#xff0c;首先要知道所谓驱动&#xff0c;其对象就是设备。 1.1 主设备号&次设备号&#xff1a; 在Linux中&#xff0c;各种设备都以文件的形式存在/dev目录下&#xff0c;称为设备文件。最上层的应用程序可以打开&#xff0c;关…

云原生之深入解析减少Docker镜像大小的优化技巧

一、什么是 Docker&#xff1f; Docker 是一种容器引擎&#xff0c;可以在容器内运行一段代码&#xff0c;Docker 镜像是在任何地方运行应用程序而无需担心应用程序依赖性的方式。要构建镜像&#xff0c;docker 使用一个名为 Dockerfile 的文件&#xff0c;Dockerfile 是一个包…

数据分析场景下,企业大模型选型的思路与建议

来源/作者&#xff1a;爱分析 随着大模型带来能力突破&#xff0c;让AI与数据分析相互结合&#xff0c;使分析结果更好支撑业务&#xff0c;促进企业内部数据价值释放&#xff0c;成为了当下企业用户尤为关注的话题。本次分享主要围绕数据分析场景下大模型底座的选型思路&#…

Kafka 安装与部署

目录 Kafka 下载 &#xff08;1&#xff09;将 kafka_2.11-2.4.1.tgz 上传至 /opt/software/ &#xff08;2&#xff09;解压安装包至 /opt/module/ [huweihadoop101 ~]$ cd /opt/software/ [huweihadoop101 software]$ tar -zxvf kafka_2.11-2.4.1.tgz -C ../module/&#…

什么是供应链安全及其工作原理?

6000公里长的丝绸之路将丝绸、谷物和其他货物从中国运送到帕尔米拉。尽管蒙古治下的和平保护丝绸之路免受海盗、强盗和内部盗窃的侵害&#xff0c;但商人仍然装备精良&#xff0c;并依赖于大型商队旅行和战略性放置的小型堡垒所提供的安全。 为什么供应链安全很重要&#xff1…