Linux_kernel移植rootfs10

一、动态更改内核

        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类型的根文件系统是一种掉电丢失的根文件系统

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

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

相关文章

C语言学习笔记 Day16(C10文件管理--下)

Day16 内容梳理&#xff1a; C语言学习笔记 Day14&#xff08;文件管理--上&#xff09;-CSDN博客 C语言学习笔记 Day15&#xff08;文件管理--中&#xff09;-CSDN博客 目录 Chapter 10 文件操作 10.5 文件状态 10.6 文件的随机读写 fseek()、rewind() &#xff08;1&…

【初阶数据结构】详解栈和队列(来自知识星空的一抹流光)

文章目录 前言1. 栈1.1 栈的概念及结构1.2 栈的实现1.2.1 "栈"实现的选择 1.3 栈的代码实现1.3.1 栈的结构体定义&#xff08;用的是顺序表&#xff09;1.3.2 栈的头文件设置1.3.3 栈的各功能的实现 2. 队列2.1 队列的概念及结构2.2 "队列"实现的选择2.3 队…

【即时通讯】轮询方式实现

技术栈 LayUI、jQuery实现前端效果。django4.2、django-ninja实现后端接口。 代码仓 - 后端 代码仓 - 前端 实现功能 首次访问页面并发送消息时需要设置昵称发送内容为空时要提示用户不能发送空消息前端定时获取消息&#xff0c;然后展示在页面上。 效果展示 首次发送需要…

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中&#xff0c; "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时&#xff0c;经常听到第一范式&#xff08;1NF&#xff09;、第二范式&#xff08;2NF&#xff09;、第三范式&#xff08;3NF&#xff09;以及 BCNF&#xff08;Boyce-…

滑动窗口在算法中的应用

滑动窗口是一种经典的算法技巧&#xff0c;就像在处理一系列动态数据时&#xff0c;用一扇可以滑动的“窗口”来捕捉一段连续的子数组或子字符串。通过不断地移动窗口的起点或终点&#xff0c;我们能够以较低的时间复杂度来解决一系列问题。在这篇文章中&#xff0c;我们将通过…

维信小程序禁止截屏/录屏

一、维信小程序禁止截屏/录屏 //录屏截屏,禁用wx.setVisualEffectOnCapture({visualEffect:hidden});wx.setVisualEffectOnCapture(Object object) 测试安卓手机&#xff1a; 用户截屏&#xff0c;被禁用 用户录屏&#xff0c;录制的是空白内容/黑色内容的视频。 二、微信小…

C++ | Leetcode C++题解之第386题字典序排数

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> lexicalOrder(int n) {vector<int> ret(n);int number 1;for (int i 0; i < n; i) {ret[i] number;if (number * 10 < n) {number * 10;} else {while (number % 10 9 || numbe…

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求&#xff0c;要求做一款播放器&#xff0c;发现能力上跟EasyPlayer.js基本一致&#xff0c;满足要求&#xff1a; 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏&#xff08;单屏/全屏&#xff09; 多分屏&#xff08;2*2&#xff09; 多分屏…

【阿一网络安全】如何让你的密码更安全?(二) - 非对称加密

上次《【阿一网络安全】如何让你的密码更安全&#xff1f;(一) - 对称加密》提到加密算法的对称加密&#xff0c;我们这次来聊聊非对称加密。 和对称加密不同&#xff0c;非对称加密的加密密钥和解密密钥不同。 非对称加密 大概过程就是&#xff0c;发送方使用公钥对明文数据…

mac 安装redis

官网下载指定版本的redis https://redis.io/ 目前3.2.0 是最新最稳定的 版本 这里是历史版本下载 下载指定版本 安装 1.放到自定义目录下并解压 2.打开终端&#xff0c;执行命令 cd redis的安装目录下 make test -- 此命令的作用是将redis源代码编译成可执行文件&#xff0c…

SPI驱动学习五(如何编写SPI设备驱动程序)

目录 一、SPI驱动程序框架二、怎么编写SPI设备驱动程序1. 编写设备树2. 注册spi_driver3. 怎么发起SPI传输3.1 接口函数3.2 函数解析 三、示例1&#xff1a;编写SPI_DAC模块驱动程序1. 要做什么事情2. 硬件2.1 原理图2.2 连接 3. 编写设备树4. 编写驱动程序5. 编写app层操作程序…

C++语法知识点合集:11.模板

文章目录 一、非类型模板参数1.非类型模板参数的基本形式2.指针作为非类型模板参数3.引用作为非类型模板参数4.非类型模板参数的限制和陷阱&#xff1a;5.几个问题 二、模板的特化1.概念2.函数模板特化3.类模板特化(1)全特化(2)偏特化(3)类模板特化应用示例 三、模板分离编译1.…

微带结环行器仿真分析+HFSS工程文件

微带结环行器仿真分析HFSS工程文件 工程下载&#xff1a;微带结环行器仿真分析HFSS工程文件 我使用HFSS版本的是HFSS 2024 R2 参考书籍《微波铁氧体器件HFSS设计原理》和视频微带结环行器HFSS仿真 1、环形器简介 环行器是一个有单向传输特性的三端口器件&#xff0c;它表明…

使用Qt编程QtNetwork无法使用

使用 VS 构建 Qt 项目时 QtNetwork 无法使用的问题 - 摘叶飞镖 - 博客园 (cnblogs.com) 另外,强烈建议在使用QNetworkAccessManager之前看看这篇文章: Qt 之 QNetworkAccessManager踏坑记录-CSDN博客 C Qt开发&#xff1a;QNetworkAccessManager网络接口组件 阅读目录 1.1 …

在Ubuntu上运行QtCreator相关程序

背景&#xff1a;希望尝试在Linux系统上跑一下使用QtCreator相关的程序&#xff0c;因为有一些工作岗位要求有Linux上使用Qt的经验。 (1)我是把Windows上的程序移过来的&#xff0c;Windows上文件名称是不区分大小写的。 而Ubuntu上是区分的 所以一部分头文件需要进行修改&am…

idea创建SpringBoot项目

目录 1. 新建一个SpringBoot项目 2. 使用Springboot官网创建项目 3. 使用阿里云地址创建SpringBoot项目 4. 使用maven创建SpringBoot项目 5. 在Idea中隐藏指定文件/文件夹 1. 新建一个SpringBoot项目 Springboot2 要求jdk版本: 1.8 maven: 3.3 内嵌的tomcat: tomcat9 我们…

深度学习(一)-感知机+神经网络+激活函数

深度学习概述 深度学习的特点 优点 性能更好 不需要特征工程 在大数据样本下有更好的性能 能解决某些传统机器学习无法解决的问题 缺点 小数据样本下性能不如机器学习 模型复杂 可解释性弱 深度学习与传统机器学习相同点 深度学习、机器学习是同一问题不同的解决方法 …

11.5.软件系统分析与设计-面向对象的程序设计与实现

面向对象的程序设计与实现 设计模式 Java代码 C代码

SQL进阶技巧:每年在校人数统计 | 区间重叠问题

目录 0 问题分析 1 数据准备 2 问题分析 3 小结 区间重叠问题 0 问题分析 有一个录取学生人数表 in_school_stu,记录的是每年录取学生的人数及录取学生的学制,计算每年在校学生人数。 1 数据准备 create table in_school_stu as ( select stack(5,1,2001,2,1200,2,2000…

UML的图及其他图补充

一、UML图 1.类图 ‌类图‌是统一建模语言&#xff08;UML&#xff09;中的一种静态结构图&#xff0c;主要用于描述软件系统的静态结构。它显示了模型中的类、类的内部结构以及它们与其他类的关系。类图是面向对象建模的主要组成部分&#xff0c;用于对系统的词汇进行建模、对…