Linux_kernel移植rootfs10

news2024/11/16 1:58:22

一、动态更改内核

        1、low level(静态修改)

                【1】将led_drv.c拷贝到kernel/drivers/char/目录中

                【2】修改当前目录下的Makefile文件

                        obj-y += led_drv.o        #将新添加的驱动文件加入到Makefile文件中

                【3】退回kernel目录,执行make uImage

        2、high level(动态修改)

                【1】通过make menuconfig影响编译

                【2】通过修改Kconfig文件,影响menuconfig选项的更改

        1)打开Kconfig文件

                vim kernel/drivers/char/Kconfig

        2)增加一个选项

        3)打开menuconfig验证

                make menuconfig

        4)修改Makefile文件

                vim kernel/drivers/char/Makefile

        5)验证

                1】禁用LED灯,修改make menuconfig

                Device Drivers --->

                        Character devices --->

                                < > MY LEDS DRIVER

                2】查看.config文件确认是否禁用成功

                        vim kernel/.config

        3】重新编译内核

                make uImage

        4】下位机验证

                cp arch/arm/boot/uImage /tftpboot/

                之前的图:

                现在的图:

        5】总结

二、根文件系统

        1、 文件系统

                存储文件的有效数据 + 索引 + 操作索引的代码

        有效数据:文件的内容

        索引:文件的路径+ 文件名

        操作索引的代码:命令

        2、根文件系统

                文件的有效数据 + 索引 + 操作索引的代码

        根文件系统是Linux内核启动后挂载的第一个真实的文件系统

        /proc:虚拟的文件系统,存储进程号等相关信息

        /sys:虚拟的文件系统,存储系统相关的信息

        3、特殊需求

                根文件系统中存放的文件是有特殊需求的

        1号进程对应的程序

        etc:配置文件和初始化执行的文件

        bin:可执行程序

        sbin:基本的系统管理程序

        lib:基本的库文件

        opt:附加的软件包

        。。。

        4、制作根文件系统

                1)busybox工具

                        官网:https://busybox.net/

                busybox被称为嵌入式领域的瑞士军刀,体积小、功能强悍,它是一个集成了很多最常用的Linux命令和工具的软件,包含了常用的命令,如:cd、ls、cp、mv、echo。。。

               简单来说,busybox集成了Linux所需的基本内容。

                2)准备系统所需命令

                ls、cd、touch、du、file、fine。。。编译busybox源码就可以自动生成

                【1】解压busybox源码

                        tar -xvf busybox-1.21.1.tar.bz2 -C ./

                【2】进入busybox-1.21.1

                【3】修改Makefile文件

                        vim Makefile

                【4】配置menuconfig

                        make menuconfig

                【5】编译

                        make

                【6】安装

                        make install        // 安装到busybox源码的_install目录中

                3)准备系统所需的库文件

                【1】上位机与下位机体积差别

                【2】原因

                busybaox生成的命令都是busybox文件的符号链接文件,并且生成的命令并不全,是PC机的精简版。

                【3】分析busybox程序

                【4】查找依赖库文件

                which arm-cortex_a9-linux-gnueabi-gcc

                cd /opt/toolchains/arm-cortex_a9-eabi-4.7-eglibc-2.18/

                find -name libc.so.6

                cd ./arm-cortex_a9-linux-gnueabi/sysroot/lib/

                【5】将链接与源文件一同拷贝到_install/lib目录

                mkdir lib

ld-2.18-2013.10.so

ld-linux.so.3

链接器

libc-2.18-2013.10.so

libc.so.6

C标准库

libm-2.18-2013.10.so

libm.so.6

数学库

                4)准备系统所需的配置文件

                【1】在_install目录中创建etc目录

                mkidr etc

                【2】分析

                在uboot中的bootargs环境变量有过init=/linuxrc,linuxrc就是1号进程对应的程序,我们需要在etc目录中对其进行配置,仿照着busybox的源码。

                vim init.c

                【3】写初始化表(inittab)

                vim etc/inittab

----------------------

初始化表的格式说明:

id:runlevel:action:process

id:空着不写使用默认id

runlevel:内核运行的等级

action:执行的动作

process:执行的操作

----------------------

                【4】创建初始化脚本(rcS)

                mkdir etc/init.d

                touch etc/init.d/rcS

                【5】修改权限

                chmod 777 rcS

                【6】编写脚本

                vim etc/init.d/rcS

                【7】编写分区文件(fstab)

                touch etc/fstab

                vim etc/fstab

----------------------

分区表的格式说明:

fs        mp        type        ops        dump        pass

fs:文件系统(file system),要加载的文件系统

mp:挂载点(mount point),文件系统要挂载的目录

type:类型(type),文件系统的类型

ops:选项(options),加载文件系统时需要使用的特定参数选项

dump:转储(dump),是否对该分区进行备份(0-不备份,1-备份)

pass:通过(pass),是否对该分区进行检查(0-不检查,1-前期检查,2-后期检查)

----------------------

                5)准备其他的必要目录

        mkdir home proc mnt var opt tmp sys dev lib/modules

                6)创建两个必要的设备文件

        sudo mknod dev/console c 5 1        // 控制终端文件(控制台)

        sudo mknod dev/null c 1 3        // 黑洞文件(放进去的文件会泯灭)

------------------------------

mknod命令创建特殊文件

sudo mknod 设备文件名 设备类型 主设备号 次设备号

设备类型:

        1】b 块设备文件(存储类设备-磁盘\U盘\软盘\硬盘)

        2】c字符设备文件(非存储类设备-led灯\蜂鸣器\按键。。。)

        3】p管道文件(命名管道)

注意:命名管道还可以使用mkfifo命令创建

主设备号:

        被系统用来确定驱动程序类型

次设备号:

        被驱动程序用来确定具体的设备

------------------------------

                7)验证根文件系统

                使用nfs挂载根文件系统

                【1】修改上位机nfs服务的配置文件

                sudo vim /etc/exports

                【2】重启nfs服务

                sudo service nfs-kernel-server restart

                【3】关闭防火墙

                sudo service ufw stop

                【4】修改下位机的bootargs环境变量

                setenv bootargs root=/dev/nfs nfsroot=192.168.1.8:/nfs_share/_install ip=192.168.1.6:192.168.1.8:192.168.1.1:255.255.255.0 init=/linuxrc console=ttySAC0,115200 maxcpus=1 lcd=wy070ml tp=gslx680-linux

                【5】保存环境变量并重启

                saveenv

                re

三、各种根文件系统的特性

-----------------------------------

存储类介质的区别

rom、prom、eprom、eeprom

flash、nor-flash、nand-flash

mmc、emmc

-----------------------------------

文件系统

制作工具

说明
jffs2mkfs.jffs2针对nor-flash开发的文件系统,智龙、树莓派、双椒派
yaffsmkfs.yaffs针对nand-flash开发的文件系统
cramfsmkfs.cramfs针对Linux开发,压缩的只读文件系统

        1、cramfs类型的根文件系统

                1)配置linux内核,让内核支持 cramfs 系统

                【1】进入Linux内核源码的根目录

                cd kernel

                【2】进入make menuconfig配置界面

                make menuconfig

                【3】找到支持文件系统选项

                【4】编译内核

                make uImage

                【5】将uImage拷贝至tftp共享目录

                【6】下位机烧写uImage

                tftp 48000000 uImage

                mmc write 48000000 2000 3000

                setenv bootcmd mmc read 48000000 2000 3000 \; bootm 48000000

                saveenv

                re

                2)制作 cramfs 类型的根文件系统

                【1】进入到busybox源码的根目录下

                cd busybox-1.21.1

                【2】制作 cramfs 文件系统镜像

                sudo mkfs.cramfs _install/ rootfs.cramfs

                【3】查看信息

                file rootfs.cramfs

                du -h rootfs.cramfs

                3)验证 cramfs 类型的文件系统是否可用

                【1】上位机把 rootfs.cramfs 拷贝至 tftp 共享目录

                cp rootfs.cramfs /tftpboot

                【2】下位机烧写rootfs.cramfs文件系统

                tftp 48000000 rootfs.cramfs

                mmc write 48000000 22000 1000

                setenv bootargs root=/dev/mmcblk0p2 rootfstype=cramfs init=/linuxrc console=ttySAC0,115200 maxcpus=1 lcd=wy070ml tp=gslx680

                saveenv

                re

                【3】查看结果

                        cramfs类型的根文件系统是只读的

        2、ext4类型的根文件系统

                ext4是我们的手机、电脑、平板会经常使用的文件系统的类型

                除了ext4以外,还有fuse、fat等文件系统

        /mnt:linux系统默认用来挂载的目录

-------------------------

mount:用于挂载的命令,直接录入mount,查看挂载信息

umount:用于卸载的命令

-------------------------

                1)配置linux内核,让内核支持 ext4 系统

    【1】进入Linux内核源码的根目录

                cd kernel

                【2】进入make menuconfig配置界面

                make menuconfig

                【3】编译内核

                make uImage

                【4】将uImage拷贝至tftp共享目录

                【5】下位机烧写uImage

                tftp 48000000 uImage

                mmc write 48000000 2000 3000

                setenv bootcmd mmc read 48000000 2000 3000 \; bootm 48000000

                saveenv

                re

                2)制作 ext4 类型的根文件系统

                【1】进入到busybox源码的根目录下

                cd busybox-1.21.1

                【2】制作空文件

                dd if=/dev/zero of=rootfs.ext4 bs=1k count=8192

-------------------------

if:input file源数据文件

of:output file目标文件

bs:一次读取的字节数

count:连续读写多少次

命令效果:创建了一个8MB的文件,文件里面的都是0

-------------------------

                【3】查看信息

                hexdump -C rootfs.ext4

-------------------------

hexdump:以十六进制查看文件内容

-C:输出规范的十六进制和ASCII的形式

-------------------------

                【4】把空文件格式化为 ext4 类型

                mkfs.ext4 rootfs.ext4

                【5】挂在该分区

                sudo mkdir /mnt/zjd_ext4        // 创建挂载点

                sudo mount -t ext4 rootfs.ext4 /mnt/zjd_ext4        // 挂载文件

                mount        // 查看是否挂载成功

                【6】将根文件系统数据拷贝到该分区

                sudo cp _install/* /mnt/zjd_ext4/ -a

                【7】卸载

                sudo umount /mnt/zjd_ext4

注意:卸载之后一定要用 mount 再查看一下

                3)验证 ext4 类型的文件系统是否可用

                【1】上位机把 rootfs.ext4 拷贝至 tftp 共享目录

                cp rootfs.cramfs /tftpboot

                【2】下位机烧写 rootfs.ext4 文件系统

                tftp 48000000 rootfs.ext4

                mmc write 48000000 22000 4000

                setenv bootargs root=/dev/mmcblk0p2 rootfstype=ext4 init=/linuxrc console=ttySAC0,115200 maxcpus=1 lcd=wy070ml tp=gslx680

                saveenv

                re

                【3】查看结果

                【4】分析原因

        在Ubuntu20.04中使用mkfs.ext4指定文件系统类型时,指定的参数在旧的内核中是不被支持的,报出的错误码为400

        解决方法:去掉旧的内核不支持的特性

        cd /tftpboot

        tune2fs -O ^metadata_csum rootfs.ext4

        e2fsck -f -a -v rootfs.ext4

        tune2fs -l rootfs.ext4

        tune2fs -O ^has_journal rootfs.ext4

        tune2fs -l rootfs.ext4

                【5】下位机重新烧写rootfs.ext4

                tftp 48000000 rootfs.ext4

                mmc write 48000000 22000 4000

                setenv bootargs root=/dev/mmcblk0p2 rootfstype=ext4 init=/linuxrc console=ttySAC0,115200 maxcpus=1 lcd=wy070ml tp=gslx680-linux

                saveenv

                re

             【6】查看结果

                        ext4类型的根文件系统是可读可写的

         3、基于内存的根文件系统

        内存的特点:掉电丢失

        ramdisk:将内存当作硬盘来使用

        优点:提高根文件系统的访问速度

        缺点:掉电丢失,消耗更多的内存空间

                1)配置linux内核,让内核支持 ramdisk 系统

    【1】进入Linux内核源码的根目录

                cd kernel

                【2】进入make menuconfig配置界面

                make menuconfig

                【3】编译内核

                make uImage

                【4】将uImage拷贝至tftp共享目录

                【5】下位机烧写uImage

                tftp 48000000 uImage

                mmc write 48000000 2000 3000

                setenv bootcmd mmc read 48000000 2000 3000 \; bootm 48000000

                saveenv

                re

                2)制作 ext2 类型的ramdisk

                【1】进入到busybox源码的根目录下

                cd busybox-1.21.1

                【2】制作空文件

                dd if=/dev/zero of=rootfs.ramdisk bs=1k count=8192

-------------------------

if:input file源数据文件

of:output file目标文件

bs:一次读取的字节数

count:连续读写多少次

命令效果:创建了一个8MB的文件,文件里面的都是0

-------------------------

                【3】查看信息

                hexdump -C rootfs.ramdisk

-------------------------

hexdump:以十六进制查看文件内容

-C:输出规范的十六进制和ASCII的形式

-------------------------

                【4】把空文件格式化为 ext2 类型

                mkfs.ext2 rootfs.ramdisk

                【5】挂在该分区

                sudo mkdir /mnt/zjd_ext2        // 创建挂载点

                sudo mount -t ext2 rootfs.ramdisk /mnt/zjd_ext2        // 挂载文件

                mount        // 查看是否挂载成功

                【6】将根文件系统数据拷贝到该分区

                sudo cp _install/* /mnt/zjd_ext2/ -a

                【7】卸载

                sudo umount /mnt/zjd_ext2

注意:卸载之后一定要用 mount 再查看一下

                3)验证 ramdisk 类型的文件系统是否可用

                【1】上位机把 rootfs.ramdisk 拷贝至 tftp 共享目录

                cp rootfs.ramdisk /tftpboot

                【2】下位机烧写 rootfs.ramdisk 文件系统

                tftp 48000000 rootfs.ramdisk

                mmc write 48000000 22000 4000

                setenv bootcmd mmc read 48000000 2000 3000\; mmc read 49000000 22000 4000 \; bootm 48000000

                setenv bootargs root=/dev/ram rw initrd=0x49000000,8M init=/linuxrc console=ttySAC0,115200 maxcpus=1 lcd=wy070ml tp=gslx680-linux

                saveenv

                re

                【3】查看结果

        断电之前:

        断电之后:

                【4】总结

        我们发现在 ramdisk 的根文件系统中创建的内容(hello.c),掉电之后消失了

        ramdisk类型的根文件系统是一种掉电丢失的根文件系统

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

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

相关文章

熬夜后补救措施

人体的肝功能问题 直接体现在体态和容颜上 伤肝 三大坏行为 熬夜后补救 *补充养b族、口、、锌、硒 加强代谢 能力 (1)另外熬夜后一定要多喝水 提升身体代谢能力 (2)谷肤甘肽清肝 肝脏排毒&#xff0c;减轻负拒 (3)水飞前含量高点 &#xff08;4)熬夜出更多油 容易长痘 需要清…

标准库标头 <filesystem> (C++17)学习之文件类型

本篇介绍filesystem文件库的文件类型API。 文件类型 is_block_file (C17) 检查给定的路径是否表示块设备 (函数) is_character_file (C17) 检查给定的路径是否表示字符设备 (函数) is_directory (C17) 检查给定的路径是否表示一个目录 (函数) is_empty (C17) 检查给定的路径是…

STM32G474之使用DAC1和DAC2测试模拟比较器

STM32G474使用DAC1和DAC2的输出作为比较器输入&#xff0c;测试模拟比较器&#xff0c;方法如下&#xff1a; PA1的附加功能为COMP1_INP&#xff0c;无需映射&#xff0c;直接将它配置为模拟功能&#xff0c;就可以使用了。 将COMP1_OUT引脚映射到PA0; 采用DAC2_OUT1输出电压给…

【大疆 SDR 图传 P1 】 功能拆解,通信功能剖析

大疆 SDR 图传 P1 拆解视频P1 SoC1、哲酷2、小米3、大疆&#xff08;文章主角&#xff09; 一、为什么说SDR技术1、sdr 软件无线电2、影视博主的测评方法3、第一个说自己SDR的还是这个老登 二、大疆的图传发展历程1、FPGA AD93632、 P1 自研1、2个DSP和一个CPU A72、音频子系统…

SpringMVC;MVC模式;Spring环境搭建;

一&#xff0c;介绍MVC模式&#xff1a; MVC模式&#xff1a; 1.M:model 模型,业务模型和数据模型. 2.C:controller 控制器 3.V:view 视图 优点: 使用控制器C把视图V和业务模型M分离&#xff0c;从而使同一个程序可以使用不同的表现形式 使用场景: 中大型项目 核心: 控制器 二…

828华为云征文 | 基于Docker与Jenkins实现自动化部署

需要了解 本文章主要讲述在 华为云Flexus X 实例上使用docker快速部署持续集成工具 Jenkins&#xff0c;通过插件来自动化CI/CD过程中的各种琐碎功能。选择合适的云服务器&#xff1a; 本文采用的是 华为云服务器 Flexus X 实例&#xff08;推荐使用&#xff09;连接方式&#…

【自动驾驶】决策规划算法 | 数学基础(三)直角坐标与自然坐标转换Ⅰ

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

【有啥问啥】数字孪生(Digital Twin)技术在人工智能中的应用

数字孪生技术在人工智能中的应用 在当今的数字化转型过程中&#xff0c;“数字孪生”技术逐渐成为热门话题&#xff0c;并且在各个行业中展现出巨大的潜力。作为一种新兴技术&#xff0c;数字孪生&#xff08;Digital Twin&#xff09;不仅仅是物理对象的虚拟复制品&#xff0…

MATLAB算法实战应用案例精讲-【人工智能】大数据审计(概念篇)

目录 前言 大数据审计发展历程 1.初级阶段:验证型逻辑占据主导地位 2.发展阶段:挖掘型逻辑突出重围 3.成熟阶段:基于验证和挖掘的预测型逻辑发展 算法原理 什么是大数据审计 特征 事项审计 大数据审计的方法 (一)大数据审计的一般思路 (二)大数据审计的关键技术…

【开发工具】探索IntelliJ IDEA插件——JSON Parser,让JSON处理变得轻松高效

开发过程中&#xff0c;遇到一个字符串&#xff0c;需要判断是否是JSON格式&#xff0c;或者是需要将Json字符串美化展示&#xff0c;是否还在打开百度搜JSON在线格式化(https://www.bejson.com/)&#xff0c;是否还在写个main方法将字符串转成JSON格式并输出。这篇文章&#x…

【Linux】全面讲解 Shell 变量的那些事

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 Linux 专栏 | Docker 专栏 | Kubernetes 专栏 往期精彩文章 【Docker】&#xff08;全网首发&#xff09;Kyl…

python中的循环结构

注意&#xff1a;range&#xff08;&#xff09;函数 累加和&#xff1a; 注意&#xff1a;if 下面如果有好几行&#xff0c;只执行一行 print必须和 for 开头相同格数 例题&#xff1a;水仙花数 注意在print语句中&#xff0c;一句好“ 。。。。。 ”后面必须有逗号然后再写变…

(八) 初入MySQL 【主从复制】

案例概况 在企业应用中&#xff0c;成熟的业务通常数据量都比较大 单台MySQL在安全性、 高可用性和高并发方面都无法满足实际的需求 &#xff0c;所以需要配置多台主从数据库服务器以实现读写分离来满足需求 一、主从复制原理 1.1、 MySQL的复制类型 基于语句的复制(STATEME…

C++11 的继续学习

1.lambda 我们如果想要给一个自定义的元素排序&#xff0c;那么应该怎么排呢 先举个例子&#xff1a; struct Goods {string _name; // 名字double _price; // 价格int _evaluate; // 评价Goods(const char* str, double price, int evaluate):_name(str), _price(price),…

等额本息等额本金

1、贷款计算器 2024年最新版房贷利率计算器_LPR利率计算器 (K JSON) 贷款计算器 2、等额本息 接下来&#xff0c;我们可以用Python编写一个函数来计算每月还款额&#xff1a; import pandas as pddef amortization_schedule(principal, annual_interest_rate, years):"…

MySQL事务执行过程

一、MySQL一个查询语句执行过程如下图&#x1f53d; MySQL客户端查询&#xff0c;经过查询缓存、解析器、查询优化器、查询执行引擎&#xff0c;通过API接口查询&#xff0c;经过存储引擎&#xff0c;获取数据返回给客户端。 二、事务执行过程如下图&#x1f53d; 1、MySQL客户…

【生日视频制作】F900xr宝马摩托车提车交车仪式AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程F900xr宝马摩托车提车交车仪式AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 AE模板套用改图文教程↓↓&#xff1a; 怎么如何做的【生日视频制作】F900xr宝马摩托车提车交车仪式AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&a…

【变化检测】基于IFN建筑物(LEVIR-CD)变化检测实战及ONNX推理

主要内容如下&#xff1a; 1、LEVIR-CD数据集介绍及下载 2、运行环境安装 3、IFN模型训练与预测 4、Onnx运行及可视化 运行环境&#xff1a;Python3.8&#xff0c;torch1.12.0cu113 likyoo变化检测源码&#xff1a;https://github.com/likyoo/open-cd 使用情况&#xff1a;代…

00Mac 安装配置Python3虚拟环境(VirtualEnv、virtualenvwrapper扩展包)

文章目录 前言一、安装二、mac需要配置环境变量三、报错&#xff1a;workon: command not found 前言 本文主要记录&#xff0c;Mac 安装配置Python3虚拟环境&#xff08;VirtualEnv、virtualenvwrapper扩展包&#xff09;&#xff0c;windows直接执行命令即可&#xff0c;mac…

Arch - 演进中的架构

文章目录 Pre原始分布式时代1. 背景与起源2. 分布式系统的初步探索3. 分布式计算环境&#xff08;DCE&#xff09;4. 技术挑战与困境5. 原始分布式时代的失败与教训6. 未来展望 单体时代优势缺陷单体架构与微服务架构的关系总结 SOA时代1. SOA架构及其背景1. 烟囱式架构&#x…