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

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

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

相关文章

2024.9.11(k8s环境搭建)

一、k8s环境搭建 编号主机名称ip配置1k8s-master192.168.8.1772k8s-node1192.168.8.1783k8s-node2192.168.8.168 1、免密登录 [rootk8s-master ~]# ssh-keygen [rootk8s-master ~]# ssh-copy-id root192.168.8.178 [rootk8s-master ~]# ssh-copy-id root192.168.8.168 2、3台…

西安近期学术会议,诚邀学者参会投稿!

第十二届信息系统与计算技术国际会议&#xff08;ISCTech 2024&#xff09;由长沙理工大学主办&#xff0c;联合同济大学、西北工业大学、江西农业大学协办&#xff0c;并由IEEE西安分会提供技术支持&#xff0c;会议将于11月8日至11日在中国西安隆重举行。ISCTech系列会议自创…

Golang | Leetcode Golang题解之第392题判断子序列

题目&#xff1a; 题解&#xff1a; func isSubsequence(s string, t string) bool {n, m : len(s), len(t)f : make([][26]int, m 1)for i : 0; i < 26; i {f[m][i] m}for i : m - 1; i > 0; i-- {for j : 0; j < 26; j {if t[i] byte(j a) {f[i][j] i} else {…

java设计模式(行为型模式:状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式)

6&#xff0c;行为型模式 6.5 状态模式 6.5.1 概述 【例】通过按钮来控制一个电梯的状态&#xff0c;一个电梯有开门状态&#xff0c;关门状态&#xff0c;停止状态&#xff0c;运行状态。每一种状态改变&#xff0c;都有可能要根据其他状态来更新处理。例如&#xff0c;如果…

突破性进展!只需单张参考图,完美仿写各种手写内容!华南理工等开源One-DM

文章链接&#xff1a;https://arxiv.org/pdf/2409.04004 git链接&#xff1a;https://github.com/dailenson/One-DM 亮点直击 提出一种创新的扩散模型&#xff0c;用于生成风格化的手写文本。这一模型的显著特点是只需一个参考样本作为风格输入&#xff0c;便能模仿该样本的书写…

索引:数据库查询性能提升的利器

在数据库的世界里&#xff0c;索引就像是一把神奇的钥匙&#xff0c;能够极大地提高查询性能。那么&#xff0c;什么是索引呢&#xff1f;它又是如何发挥作用的呢&#xff1f;让我们一起来揭开索引的神秘面纱。 一、什么是索引&#xff1f; 索引&#xff0c;简单来说&#xf…

【机器学习-监督学习】集成学习与梯度提升决策树

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

chapter14-集合——(List-HashSet)——day18

目录 519-HashSet全面说明 520-数组链表模拟 521-HashSet扩容机制 重要 522-HashSet源码解读1 526-HashSet最佳实践 527-hashSet思考题 519-HashSet全面说明 题一、 两个tom都可以添加成功是因为这是两个对象 看源码做分析&#xff1a;不是直接指向常量池的吗&#xff1f;…

2024/9/9 408“回头看”:b树

B树是什么&#xff1f;有什么作用&#xff1f;B树的插入和删除具体细节是什么&#xff1f;除了B树还有一个是B&#xff0b;树、还是B-树&#xff0c;他们有什么区别&#xff0c;又有什么相同点&#xff1f; b树在王道考研查找这一章&#xff0c;所以他的主要作用就是查找。 在…

【python】OpenCV—Age and Gender Classification

文章目录 1、任务描述2、网络结构2.1 人脸检测2.2 性别分类2.3 年龄分类 3、代码实现4、结果展示5、参考 1、任务描述 性别分类和年龄分类预测 2、网络结构 2.1 人脸检测 输出最高的 200 个 RoI&#xff0c;每个 RoI 7 个值&#xff0c;&#xff08;xx&#xff0c;xx&#x…

基于SpringBoot+Vue+MySQL的校园生活服务平台

系统展示 用户前台界面 管理员后台界面 系统背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域的鸿沟&#xff0c;信息的…

C++当中的多态(一)

&#xff08;一&#xff09;什么是多态 1.现实中的多态&#xff1a; 所谓的多态在我们的生活当中其实很常见。举一个简单的例子&#xff1a;当我们需要买票的时候有很多种不同的票可以供我们购买&#xff0c;如果你是学生就可以享受半价票的优惠&#xff0c;如果你是VIP用户就可…

Leetcode 只出现一次的元素

题目要求我们找到数组中只出现了一次的元素&#xff0c;而其他元素都出现了两次。 解题思路&#xff1a; 我们可以使用位运算中的异或操作&#xff08;XOR&#xff09;。异或操作有以下两个特性&#xff1a; 相同的两个数字异或结果为0&#xff0c;例如&#xff1a;a ^ a 0…

Android12——Launcher3文件夹布局修改调整

文章声明&#xff1a;本文是笔者参考良心大佬作品后结合实际需求进行相应的定制&#xff0c;本篇主要是笔者记录一次解析bug笔记&#xff0c;文中可能会引用大佬文章中的部分图片在此声明&#xff0c;并非盈利目的&#xff0c;如涉嫌侵权请私信&#xff0c;谢谢&#xff01; 大…

基于亲和性的 GPU 容器绑核策略 Copy

1.引言 在高性能计算和大规模并行任务处理中&#xff0c;GPU已经成为不可或缺的加速器。为了充分发挥GPU的计算能力&#xff0c;通过合理分配CPU核与GPU的绑定来优化CPU和GPU的关系至关重要。我们将探讨socket和NUMA&#xff08;非统一内存访问&#xff09;的概念&#xff0c;并…

力扣 — — 2555. 两个线段获得的最多奖品

力扣 — — 2555. 两个线段获得的最多奖品 一、题目描述 题目大意&#xff1a;给定一个数组prizePositions&#xff0c;数组中的值表示的是奖品的位置&#xff0c;每一个位置可以有多个奖品&#xff0c;并且设定一个线段的长度 K K K&#xff0c;要求从所有奖品位置中选择两个…

springboot 整合quartz定时任务

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pom的配置1.加注解二、使用方法1.工程图2.创建工具类三、controller 实现前言 提示:这里可以添加本文要记录的大概内容: 提示:以下是本篇文章正文内容,下面案例可供参考 一、pom的配…

【RabbitMQ】工作模式

工作模式概述 简单模式 简单模式中只存在一个生产者&#xff0c;只存在一个消费者。生产者生产消息&#xff0c;消费者消费消息。消息只能被消费一次&#xff0c;也称为点对点模式。 简单模式适合在消息只能被单个消费者处理的场景下存在。 工作队列模式&#xff08;Work Qu…

Redisson分布式锁实现及原理详解

随着技术快速发展&#xff0c;数据规模增大&#xff0c;分布式系统越来越普及&#xff0c;一个应用往往会部署在多台机器上&#xff08;多节点&#xff09;&#xff0c;在有些场景中&#xff0c;为了保证数据不重复&#xff0c;要求在同一时刻&#xff0c;同一任务只在一个节点…

浏览器中的JavaScript核心BOM(浏览器对象模型)重点掌握对象之History对象的属性与方法

History对象是用来把网页浏览历史用类似栈的方式进行表示。 这定义听起来非常的抽象&#xff0c;其实History对象的作用就跟浏览器的前进和后退很像&#xff0c;我们来用几幅图来理解一下。首先我们先回顾一下浏览器的返回上一个页面 和 跳转到下一个页面 这两个功能。 就类似…