Linux内核移植(源码分析、配置与编译)

news2024/11/27 7:26:12

目录

一、Linux内核概述

1.1内核与操作系统

​编辑1.2Linux层次结构

1.3Linux内核特点

二、Linux内核源码结构

2.1Linux内核源码获取

2.2Linux内核源码结构

三、Linux内核源码的配置和编译

3.1Linux内核源码配置

3.2make menuconfig

3.3内核编译(以下命令均在内核源码的顶层目录下执行)

3.4测试内核和设备树


一、Linux内核概述

1.1内核与操作系统

内核

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

操作系统

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

(我们使用的网络协议都是基于TCP/ip或者UDP/IP协议开发的)

(我们使用rm、mv、cp。。。这些命令都不是内核提供的)

这些命令其实都是一个个程序就和a.out一样

那为什么我们开发板上也能执行这些命令呢因为他们被复制一份放到了根文件系统里

shell翻译过来就是贝壳,他把内核很好的保护了起来。Linux内核内有文件管理系统。所以可以操作磁盘。那现在我们要操作一些文件就需要去操作内核让内核再去操作文件。但是内核很复杂,我们学到不透的时候一个误操作可能就会把内核搞坏了。所以我们操作shell让shell再去操作内核就会很安全了。

库这些lib也不是内核包含的。

图形化界面也不属于内核,内核本身只支持大黑框

安卓系统的内核也是Linux。所以学会Linux内核就能直接给手机做驱动,不需要会java。还有麒麟也是Linux内核。加上红旗操作系统也是。


1.2Linux层次结构

1.2.1进程管理

因为Linux是单核的所以不可能真正的并发

Linux基于操作系统时间片轮转调度机制让我们看起来是多进程同时执行。

比如五个进程每个都分别执行一毫秒这个时间非常短调度的很快就像是一起执行一样。

1.2.2内存管理

我们使用的都是虚拟内存其实都是由这块处理的,向下管理硬件,向上提供接口。

1.2.3文件系统

操作磁盘

1.2.4驱动管理

比如寄存器的配置什么的

1.2.5网络协议

管理网卡由linux内部网络协议栈来处理

但是嵌入式不会运行这么庞大的系统就是内核加点简单的东西因为要考虑成本。

我用华为路由器的时候就发现了,他的内存使用一直再75%左右。能省就省降低成本。

1.3Linux内核特点

n 代码结构清晰、模块化设计
由一堆模块组成互相之间没有联系,所以在不需要某些功能时可以对内核进行裁剪
微内核也是这种思想内核做的特别小,外围的一些功能也是可以进行裁剪的。
百度百科-验证
但是这样做也有缺点就是效率变低了。与他对应的就是宏内核,一个特别特别大的内核,各个模块间的耦合度很高。但是这样的话一个模块出现问题可能会全出现问题。不过这样的好处就是效率高。
支持丰富的硬件平台
他和uboot一样把很多架构的东西都放进去了。
较高的稳定性
开很久他都不需要维护。所以一些嵌入式设备比如路由器、基站、充电桩。还有一些大型的服务器都会用Linux。
轻量化及较强的裁剪性
只有2.9MB
开放源代码
更新活跃、用户较多、资料丰富
支持丰富的网络协议
95%服务器都用Linux就是因为他的网络协议非常的丰富。
... ...
linux不是为嵌入式而设计的,但是它的特点真的很适合嵌入式。再有就是这也就是为什么手机电脑用图形化界面好的操作系统的原因。总不能玩个游戏还要ls,cd过去再执行吧。退出的时候还要kill一下?

二、Linux内核源码结构

2.1Linux内核源码获取

Linux内核源码下载

    https://www.kernel.org/

选择http的下载链接

 点击Linux

点击kernel(内核)

 

我们使用的是3.14点击v3.x

这里有很多直接ctr+F搜索我们需要的就行 

 

由于是国外的网站所以特别慢
Linux内核版本命名

 

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

Linux内核版本选择

    支持对应的硬件平台

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

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

内核和uboot是一样的现在很少自己配置了,都是厂家提供了。

2.2Linux内核源码结构

把源码拖到ubuntu里解压

 

平台相关代码

    arch:  与CPU架构相关的源代码

 

 

(内核中没有board目录通过设备树来区分) 

平台无关代码

    block:磁盘设备的支持  crypto:加密相关

    drivers:设备驱动  firmware:固件

 

    fs:文件系统  include:头文件

 

一般格式化磁盘都格式化成ntfs

    init:内核初始化  ipc:进程间通信

 共享内存消息队列什么的都是再ipc目录下实现的

 

    kernel:内核核心调度机制等  lib:库

内核的核心算法。 

    mm:内存管理  net:网络协议

 

    scripts:工具、脚本等  security:安全

    usr:打包与压缩      virt:虚拟

    sound:音频驱动不知道为什么没放到dirver里

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

    COPYING:  版权

gpl版权,GNU开源协议

    CREDITS:  内核贡献者

能被写进这里也不错。 

    README:  说明文档

很详细,从什么是Linux开始讲。

    Documentation:  帮助文档

    Makefile:  编译管理

    samples:  示例

    tools:  工具

    Kconfig:内核自带的图形化界面

    ... ...

三、Linux内核源码的配置和编译

3.1Linux内核源码配置

指定处理器架构及编译工具

    在Linux内核源码顶层目录下的Makefile中指定(ARCH、CROSS_COMPILE)

可以通过make去配置,这里我们直接删了让他等于arm就行

下面那个制定成我们的arm-none-linux-gnueabi- 

 

导入当前处理器的默认配置

    make <soc_name>_defconfig

arm架构下的不一样的架构汇编也不同所以光指定叫arm肯定不行,因为再arc/arm下只有叫exynos的没有exynos4412所以配置这里得按他们有的来

有个警告我看了一下好像是因为定义这个结构体的时候没初值。

def是默认的意思,这个操作是导入默认配置 

上面提示写进了.config

看看这里到底是什么

 最上面告诉我们这个是这个内核的配置文件,你不要去修改它

 

这里有2400多行,全是对一些变量进行赋值。

 

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

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

    执行该命令后就会将对应的配置文件中的信息导入到源码顶层目录下的.config

    文件中CONFIG_xxx=y表示内核选中了该功能,内核编译时就会将该功能对应的

    代码编译,内核的体积也会增大。#CONFIG_xxx is not set表示内核没有选中

    该功能,内核编译时该功能对应的代码不会被编译,内核的体积也会减小。

修改配置

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

    方法1:

  直接修改.config文件(不推荐)

太多了不好找,并且很多功能是有依赖关系的,要很熟,把最上层到最底层所需的全部东西都打开才能实现一共功能。

    方法2:

  make menuconfig

这些就是一些处理器的默认设置。 

3.2make menuconfig

这是一个图形化界面

没配置过会报错,但是我有这个图形化的库

 

sudo apt-get install libncurses5-dev 

执行这个命令安装这个库
这里还有一个坑这个图形化界面对大小有要求。最好是最大化再执行这个命令。
图形化界面可以自动检查并解决这些依赖关系
上面有说明书。按回车选择select
带-------》的说明下面有子菜单。
输入一个?提供帮助
输入/就可以找你需要的

 

修改配置

    [ ] 有两种状态

      输入Y,显示“*”,内核中该功能被选中,相关代码会被编译进内核

  输入N,显示“ ”,内核中该功能不被选中,相关代码不会被编译进内核

    < > 有三种状态

      输入Y,显示“*”,内核中该功能被选中,相关代码会被编译进内核

  输入N,显示“ ”,内核中该功能不被选中,相关代码不会被编译进内核

       输入M,显示“M”,内核中该功能被选为模块(被编译为独立的模块)

    注:使用make mnuconfig配置的本质还是修改.config文件

再第一个选项里

  ()  Cross-compiler tool prefix 选择交叉编译工具链。因为咱们前面把它设置的变量直接写成了我们需要的所以这个功能大概是丧失了。

 

这俩是进程间通信机制和交换文件交换分区做虚拟内存

 

红色mmu是虚拟内存用的,这S3c是指定用哪个串口打印信息

但是其实改不改都行,因为已经通过bootargs传递了使用串口2

按空格会切换状态 

3.3内核编译(以下命令均在内核源码的顶层目录下执行)

    make uImage 

  编译内核(编译选为“*”的选项到内核)

这个编译过程很久因为代码量太大了

cc就是gcc编译会将这些源码生成.o

这些.o会链接成一个vmlinux文件但是这个一个elf文件

然后链接一些自解压代码,因为我们最后装到板子上的其实是个压缩包

 

然后又通过objcopy命令把这个vmlinux做成zImage.bin文件

这个zImage是不被uboot识别的所以在这基础上要添加一些信息形成uImage

这步由mkimage来完成,如果没有这个工具最后会报错,这时候再uboot的tools目录下会出现这个工具,本来是没有的

把这个命令拷贝到usr/bin中

然后把这个文件改成最高权限再次编译成功就欧克了,根据提示信息在这个文件夹下找这个文件。我们看一下大小只有2.7MB

    make modules    

  编译内核模块(编译选为“M”的选项为独立模块)

把dm9000网卡选择成M

 这里就睡dm9000网卡驱动的源码,这里没有.o文件证明刚刚编译的时候没有编译

再来看dm9000的驱动文件

这次有.o文件了。证明被编译了

这个.ko的文件就是内核模块的意思。

    make dtbs       

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

再boot目录下有个dts里面都是设备树文件。

这里面有4412的设备树但是不是我们的

老办法咱们复制一份改一下

cp exynos4412-origen.dts exynos4412-fs4412.dts 

修改makefile

 

 

 我们之前复制了dts现在多了dtb文件

    make clean    

  删除编译过程中产生的中间文件

3.4测试内核和设备树

把内核和设备树复制到tftp目录下

 

切换成emmc启动

 

 

他会卡死再这里

因为内核没有配置nfs,TCP/IP也没打开,网卡也用不了。

有同学可能会好奇这个tftp为什么,因为那时候还在运行uboot。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java学习记录day6

书接上回 类与对象 static关键字 static的作用&#xff1a; 修饰一个属性&#xff1a;声明为static的变量实质上就是一个全局变量,其生命周期为从类被加载开始一直到程序结束&#xff1b;修饰方法&#xff1a;无须本类的对象也可以调用该方法&#xff1b;修饰一个类&#x…

Yii中render和renderPartial的区别

一、Yii项目来源二、配置yiisoft/yii2-app-basic&#xff0c;写个Demo1、默认的首页2、自定义Demo的html内容3、php渲染代码1&#xff09;、render() 渲染2&#xff09;、renderPartial() 渲染三、给出结论一、Yii项目来源 直接composer安装&#xff1a;composer create-proje…

注意力机制(SE,ECA,CBAM) Pytorch代码

注意力机制1 SENet2 ECANet3 CBAM3.1 通道注意力3.2 空间注意力3.3 CBAM4 展示网络层具体信息1 SENet SE注意力机制&#xff08;Squeeze-and-Excitation Networks&#xff09;:是一种通道类型的注意力机制&#xff0c;就是在通道维度上增加注意力机制&#xff0c;主要内容是是…

【光线追踪】光线追踪重投影方法(Ray Tracing Reprojection)

光线追踪重投影方法 重投影这项技术一般用于时间性帧复用技术上&#xff0c;例如TAA(Temporal Anti-Aliasing)反走样或者抗锯齿技术。读这篇文章最好先对TAA这类技术的算法流程有了解。 1.TAA抗锯齿技术简介 先简单介绍下TAA抗锯齿的原理&#xff0c;在游戏中&#xff0c;当前…

解决ThinkPHP5.1出现MISS缓存未命中问题

一淘模板&#xff08;56admin.com&#xff09;给大家带来了关于ThinkPHP5.1的相关知识&#xff0c;其中主要介绍了CDN是什么&#xff1f;为什么使用它&#xff1f;怎么解决ThinkPHP5.1 MISS缓存未命中问题&#xff1f;感兴趣的朋友下面一起来看一下吧&#xff0c;希望对大家有帮…

疑难杂症篇(二十一)--Ubuntu18.04安装usb-cam过程出现的问题

对Ubuntu18.04{\rm Ubuntu 18.04}Ubuntu18.04环境下的ROS{\rm ROS}ROS的melodic{\rm melodic}melodic版本安装usb−cam{\rm usb-cam}usb−cam过程出现的两个常见问题提出解决方案。 1.问题1&#xff1a;usb-cam功能包编译时出现"未定义的引用"的问题 问题描述&#…

@RefreshScope 加在 Quartz 触发器类导致异常问题分析

背景 承接上篇&#xff0c;测试过程中又遇到了 Nacos Config 的动态刷新注解 RefreshScope 与 Quartz 框架结合的问题&#xff0c;Bug 排查路上&#xff0c;顺手记录一下吧。 问题 有个模块使用了Quartz &#xff0c;通过配置控制任务调度的周期和分组名称。 因为引用了动态…

如何解决thinkphp验证码不能显示问题?

thinkPHP做验证码这一块,可以使用自带的验证码扩展,具体步骤如下: 一、安装扩展 composer require topthink/think-captcha 二、模版中使用 将原来静态页面的验证码图片替换为{:captcha_img()},这个会自动生成验证码图片。 <div>{:captcha_img()}</div> 或者 &…

如何理解 K8s 动态伸缩与触发上线?

K8s 版本&#xff1a;1.23.6 目录一、动态伸缩二、触发上线一般地&#xff0c;如果仅修改 Pod 的副本数&#xff08;如新增/缩减&#xff09;&#xff0c;这就属于动态伸缩。如果是修改容器镜像的版本&#xff0c;则会触发上线&#xff0c;具体看下面例子。 一、动态伸缩 1、…

00后整顿职场?公司测试岗却新来了个00后卷王,3个月薪资干到20K...

最近聊到软件测试的行业内卷&#xff0c;越来越多的转行和大学生进入测试行业。想要获得更好的待遇和机会&#xff0c;不断提升自己的技能栈成了测试老人迫在眉睫的问题。 不论是面试哪个级别的测试工程师&#xff0c;面试官都会问一句“会编程吗&#xff1f;有没有自动化测试…

Mybatis框架(全部基础知识)

&#x1f44c; 棒棒有言&#xff1a;也许我一直照着别人的方向飞&#xff0c;可是这次&#xff0c;我想要用我的方式飞翔一次&#xff01;人生&#xff0c;既要淡&#xff0c;又要有味。凡事不必太在意&#xff0c;一切随缘&#xff0c;缘深多聚聚&#xff0c;缘浅随它去。凡事…

2023年了,来试试前端格式化工具

在大前端时代&#xff0c;前端的各种工具链穷出不断&#xff0c;有eslint, prettier, husky, commitlint 等, 东西太多有的时候也是trouble&#x1f602;&#x1f602;&#x1f602;,怎么正确的使用这个是每一个前端开发者都需要掌握的内容&#xff0c;请上车&#x1f697;&…

DHCP Relay中继实验

DHCP Relay实验拓扑图设备配置结果验证拓扑图 要求PC1按照地址池自动分配&#xff0c;而PC要求分配固定的地址&#xff0c;网段信息已经在图中进行标明。 设备配置 AR1&#xff1a; AR1作为DHCP Server基本配置跟DHCP Server没区别&#xff0c;不过要加一条静态路由&#xff…

基础篇:02-SpringCloud概述

1.SpringCloud诞生 基于前面章节&#xff0c;我们深知微服务已成为当前开发的主流技术栈&#xff0c;但是如dubbo、zookeeper、nacos、rocketmq、rabbitmq、springboot、redis、es这般众多技术都只解决了一个或一类问题&#xff0c;微服务并没有一个统一的解决方案。开发人员或…

计算机组成原理(三)

5.掌握定点数的表示和应用&#xff08;主要是无符号数和有符号数的表示、机器数的定点表示、数的机器码表示&#xff09;&#xff1b; 定点数&#xff1a;小数点位置固定不变。   定点小数&#xff1a;小数点固定在数值位与符号位之间&#xff1b;   定点整数&#xff1a;小…

R语言贝叶斯方法在生态环境领域中的高阶技术

贝叶斯统计学即贝叶斯学派是一门基本思想与传统基于频率思想的统计学即频率学派完全不同的统计学方法&#xff0c;它在统计建模中具有灵活性和先进性特点&#xff0c;使其可以轻松应对复杂数据和模型结构。然而&#xff0c;很多初学者在面对思想、技术和方法都与传统统计学有着…

Springcloud----Nacos快速搭建使用

Nacos使用指南 Nacos完整的搭建和项目配置流程&#xff0c;上手简单 一、Nacos安装启动 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; GitHub主…

尚硅谷的尚融宝项目

先建立一个Maven springboot项目 进来先把src删掉&#xff0c;因为是一个父项目&#xff0c;我们删掉src之后&#xff0c;pom里配置的东西&#xff0c;也能给别的模块使用。 改一下springboot的版本号码 加入依赖和依赖管理&#xff1a; <properties><java.versi…

大型智慧校园系统源码 智慧校园源码 Android电子班牌源码

一款针对中小学研发的智慧校园系统源码&#xff0c;智慧学校源码带电子班牌、人脸识别系统。系统有演示&#xff0c;可正常上线运营正版授权。 私信了解更多&#xff01; 技术架构&#xff1a; 后端&#xff1a;Java 框架&#xff1a;springboot 前端页面&#xff1a;vue e…

keepalived+mysql高可用

一.设置mysql同步信息两节点安装msyql略#配置节点11.配置权限允许远程访问mysql -u root -p grant all on *.* to root% identified by Root1212# with grant option; flush privileges;2.修改my.cnf#作为主节点配置(节点1)#作为主节点配置 server-id 1 …