Linux内核编译流程

删除之前编译生成的文件和配置文件

make mrproper

生成.config文件

make menuconfig

编译

make -j4

1. No rule to make target ‘debian/canonical-certs.pem‘, needed by ‘certs/x509_certificate_list‘

vim .config
修改CONFIG_SYSTEM_TRUSTED_KEYS为""
修改CONFIG_SYSTEM_REVOCATION_KEYS为""

2.BTF: .tmp_vmlinux.btf: pahole (pahole) is not available Failed to generate BTF for vmlinux

sudo apt install linux-tools-common
编辑.config文件,将CONFIG_DEBUG_INFO_BTF设置为n

后续

root@100ask:/home/book/Downloads/linux-5.19/arch/x86/boot# file bzImage
bzImage: Linux kernel x86 boot executable bzImage, version 5.19.0 (root@100ask) #2 SMP PREEMPT_DYNAMIC Wed Aug 2 09:35:26 EDT 2023, RO-rootFS, swap_dev 0xA, Normal VGA
  • 编译busybox
make menuconfig
勾选 Build static binary 生成静态链接的busybox二进制文件再make -j4进行编译
  • 安装
make install
会安装在当前busybox目录的_install目录下
  • 制作initramfs.img
    写如下Makefile文件:
    initramfs:cd ./initramfs_dir && find . -print0 | cpio -ov --null --format=newc | gzip -9 > ../initramfs.imgrun:qemu-system-x86_64 \-kernel bzImage \-initrd initramfs.img \-m 512M \-nographic \-append "earlyprintk=serial,ttyS0 console=ttyS0"
    

在启动Linux时,会执行以下步骤:
1.引导加载器加载内核映像(这里是bzImage)
2.内核加载并挂载根文件系统启动init进程
3.init进程使用根文件系统下的/init脚本来继续启动系统

root@100ask:/home/book/linux-demo#下
执行make initramfs即可生成根文件系统的映像文件initramfs.img
执行make run就会启动qemu虚拟机
  • /init脚本

    #!/bin/busybox sh/bin/busybox mkdir -p /proc && /bin/busybox mount -t proc none /proc
    /bin/busybox echo "Hello"/bin/busybox sh
    
  • 文件结构
    ├── bzImage
    ├── initramfs_dir
    │ ├── bin
    │ │ └── busybox
    │ └── init
    ├── initramfs.img
    └── Makefile

  • 使用

    root@100ask:/home/book/Downloads/busybox-1.36.1/_install/bin# busybox echo 123
    123
    
  • 退出:ctrl+a,then press x

  • 将内核中的proc文件系统挂载到/proc文件夹,这样就可以通过访问/proc下的文件和目录,获取到与内核和系统相关的信息

  • 显示进程
    init中加入下面这行:

    /bin/busybox mkdir -p /proc && /bin/busybox mount -t proc none /proc
    

    这样执行busybox ps就可以显示进程了

  • 修改shell提示符

    加一行 export $PS1='(kernel) =>'
    

文件系统

文件系统常用格式:ext2、yaffs2
内存文件系统:ramdisk:用内存模拟块设备,并格式化为文件系统格式ramfs:利用linux会把块设备的数据缓存到内存中的机制实现,不会将数据写回到存储设备tmpfs:tmpfs是ramfs的衍生物,有容量大小限制、允许向交换空间(swap) 写入数据
内核早期启动的临时根文件系统:initramfs:
linux最终使用的完整的文件系统:rootfs:是ramfs和tmpfs的一个实现,包含系统所有基本文件和目录,是完整的Linux文件系统

内核在启动初始化过程中会解压缩initrd文件,然后将解压后的initrd挂载为根目录,然后执行根目录中的/init脚本,您就可以在这个脚本中运行initrd文件系统中的内核模块自动加载机制udevd,让它来自动加载realfs(真实文件系统)存放设备的驱动程序,以及在/dev目录下建立必要的设备节点。在udevd自动加载磁盘驱动程序之后,就可以mount真正的根目录,并切换到这个根目录中来。
详细描述

initfd和initramfs

  • initrd:有image格式和cpio格式。基于ramdisk的小型根目录,包含启动阶段中需要的文件和脚本,会在系统启动时被读入到内存,执行其中的/init脚本。
    为了精简内核代码,将加载各种设备驱动和模块的代码写在init脚本中,放在大小固定大小的块设备上,放在用户态来做。
    由于其基于块设备,因此需要内核有文件系统驱动
  • initramfs:本质上是cpio格式的initrd

initramfs是initrd的继承者,都用来做一些内核不容易做的事情,比如挂载文件系统、加载模块等

怎样在linux中添加一个系统调用

下面以获得cpu个数为例:
  • 在arch/x86/entry/syscalls/syscall_64.tbl中注册系统调用号
    451 common get_cpu_number sys_get_cpu_number
    
  • 在include/linux/syscalls.h中声明系统调用函数
    asmlinkage long sys_get_cpu_number(void);
    
  • 在kernel/sys.c中实现系统调用函数
    SYSCALL_DEFINE0(get_cpu_number)
    {return num_present_cpus();
    }
    
  • 然后重新编译linux内核(使用默认配置即可)
  • 测试程序get_cpu.c:
    #include <sys/syscall.h>int main()
    {int cpu_numbers= syscall(451);return 0;
    }
    
    结构和之前的linux-demo类似,只是bzImage是重新编译内核生成的
    ├── get_cpu.c 测试程序
    ├── bzImage 编译内核生成的镜像
    ├── initramfs_dir 目录
    │ ├── bin 目录
    │ │ └── busybox 编译busybox生成的可执行文件
    │ └── get_cpu 可执行文件
    │ └── init 脚本文件
    ├── initramfs.img 执行Makefile下的make initramfs会生成该镜像文件
    └── Makefile 也和linux-demo中写的一样
    执行gcc -static get_cpu.c -o get_cpu生成静态可执行文件,所有的依赖库都会被静态链接到可执行文件中,从而使可执行文件在其他系统上运行时不需要依赖动态库

qemu的按键驱动程序

  • 编译内核
    我的linux内核目录为~/100ask_imx6ull-qemu/linux-4.9.88

    • 设置环境变量

      export ARCH=arm
      export CROSS_COMPILE=arm-linux-gnueabihf-
      
    • 生成.config文件 make menuconfig

      为避免后期报错:button_drv: version magic '4.9.88-g8f6c88de SMP mod_unload modversions ARMv7 p2v8 ’ should be '4.9.88-g8f6c88de SMP preempt mod_unload modversions ARMv7 p2v8 ',要做如下设置

      编译内核时使用抢占式模型,需要设置Kernel Features -> Preemption Model为Preemptible Kernel (Low-Latency Desktop)

    • make -j4

    • 修改内核源码的version magic
      为避免加载的驱动所使用的内核版本和系统运行的版本不一致,导致后期报错:Unknown symbol __gnu_mcount_nc
      打开内核include/generated/utsrelease.h文件,修改version magic为开发板的版本。
      #define UTS_RELEASE "4.9.88-g8f6c88de"

  • 编译按键驱动程序

    • 在Makefile中指定内核路径KERN_DIR

      KERN_DIR = /home/book/100ask_imx6ull-qemu/linux-4.9.88
      all:make -C $(KERN_DIR) M=`pwd` modules$(CROSS_COMPILE)gcc -o button_test button_test.c
      clean:make -C $(KERN_DIR) M=`pwd` modules cleanrm -rf modules.orderrm -f ledtest
      obj-m   += button_drv.o
      obj-m   += board_100ask_imx6ull-qemu.o
      
    • make编译,然后将ko文件和程序复制到nfs文件夹
      cp *.ko button_test /home/book/nfs_rootfs/

  • 启动qemu,挂载nfs
    mount -t nfs -o nolock,vers=3 10.0.2.2:/home/book/nfs_rootfs /mnt

  • 安装模块
    insmod button_drv.ko
    insmod board_100ask_imx6ull-qemu.ko

  • 查看内核日志
    dmesg | grep hello

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

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

相关文章

理解异步复位,同步释放 ?

在数字电路设计中&#xff0c;复位信号用于初始化系统&#xff0c;使其进入一个已知的状态。复位信号可以是异步的&#xff0c;即不依赖于时钟信号&#xff0c;这种设计方法称为异步复位。然而&#xff0c;为了确保系统在复位解除后能够正确同步和稳定工作&#xff0c;常采用同…

如何把图片转换成pdf格式?图片转PDF方法分享

如何把图片转换成pdf格式&#xff1f;图片转换为PDF格式的重要性不言而喻。PDF文件不仅能够在各种操作系统和设备上保持一致的显示效果&#xff0c;还能确保图片内容的清晰度和质量不受损害。此外&#xff0c;PDF格式支持加密和权限设置&#xff0c;可以保护图片内容不被轻易篡…

FireFox 编译指南2024 Windows10篇-环境准备(一)

1. 引言 在开源浏览器项目中&#xff0c;Firefox因其高性能和灵活性而备受开发者青睐。为了在本地环境中编译和定制Firefox&#xff0c;开发者需要做好充分的环境准备工作。这不仅是编译成功的基础&#xff0c;也是后续调试、优化和二次开发的关键步骤。 编译Firefox是一个复…

深入剖析Tomcat(十二) 详解StandardContext

StandardContext是Context容器的一个标准实现&#xff0c;一般情况下&#xff0c;Tomcat都是使用StandardContext类来创建Context容器。前面讲过&#xff0c;Context容器代表了一个Web应用&#xff0c;Tomcat本身支持部署多个应用&#xff0c;相应的每个应用都会有一个Standard…

C语言 输入输出使用

一、getchar putchar puts #include "stdio.h" /* 跟printf的区别 1.自动加入换行符 2.printf支持多种输出&#xff0c;而puts就是输出字符串 */ int main(){char c;puts("请输入一个字符");cgetchar();puts("你输入的字符是");putchar(c);ret…

实用软件下载:ABBYY Finereader 15最新安装包及详细安装教程

数据表明FineReader PDF提供实用、简易的工具&#xff0c;将纸质文档和PDF结合起来&#xff0c;提高了数字工作场所的效率。我们都知道 即时背景识别:使不可搜索的PDF能够在工作中立即使用。值得一提的是文档转换更精准&#xff1a;OCR技术&#xff0c;它提高了PDF转换、布局保…

基于STM32的简易计算器proteus仿真设计(仿真+程序+设计报告+讲解视频)

基于STM32的简易计算器proteus仿真设计 讲解视频1.主要功能2. 仿真3. 程序4. 设计报告5. 资料清单&下载链接 基于STM32的简易计算器proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 …

c语言输出文字颜色

c语言输出文字颜色 在C语言中&#xff0c;输出文字颜色主要是依赖于你的终端或者是你所使用的编译器是否支持这种操作。在Windows的命令提示符&#xff08;cmd&#xff09;中&#xff0c;可以使用ASCII控制码来改变文字颜色&#xff0c;但在Linux或Mac的终端中&#xff0c;通常…

深入JVM:详解JIT即时编译器

文章目录 深入JVM&#xff1a;详解JIT即时编译器一、序言二、基础概念1、何为JIT即时编译2、热点代码 三、HotSpot内置的即时编译器1、C1编译器2、C2编译器3、分层编译3.1 协作流程 四、常见JIT优化技术1、方法内联2、逃逸分析&#xff08;1&#xff09;同步锁消除&#xff08;…

数据结构:栈和队列详解

栈 栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守先进后出LIFO&#xff08;Last In First Out&#xff09;的原则。大家可以理解为…

3-自动驾驶车辆路径规划

在自动驾驶领域&#xff0c;轨迹搜索&#xff08;Trajectory Searching&#xff09;和轨迹生成&#xff08;Trajectory Generation&#xff09;是两个密切相关但有所不同的概念&#xff0c;它们都是自动驾驶车辆规划其行驶路径的关键步骤。 轨迹搜索&#xff08;Trajectory Se…

Day60 代码随想录打卡|回溯算法篇---组合

题目&#xff08;leecode T77&#xff09;&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 方法&#xff1a;本题最直观的解法是使用暴力for循环遍历法&#xff0c;根据k的大小定for循环的嵌套次数&…

Posix消息队列使用总结

Posix在线文档&#xff1a; The Single UNIX Specification, Version 2 (opengroup.org) Linux系统中提供了两种不同接口的消息队列&#xff1a; POSIX消息队列。POSIX为可移植的操作系统接口。System V消息队列。System V 是 AT&T 的第一个商业UNIX版本(UNIX System III)的…

[Python人工智能] 四十六.PyTorch入门 (1)环境搭建、神经网络普及和Torch基础知识

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解合如何利用keras和tensorflow构建基于注意力机制的CNN-BiLSTM-ATT-CRF模型,并实现中文实体识别研究。这篇文章将介绍PyTorch入门知识。前面我们的Python人工智能主要以TensorFlow和Keras为主,…

python开发之代码规范

1、背景 现实中进行python代码开发&#xff0c;需要遵循一定的规范&#xff0c;这个规范对后期维护起到的作用很大。 2、规范 https://peps.python.org/pep-0008/#a-foolish-consistency-is-the-hobgoblin-of-little-minds

Java中的设计模式:实战案例分享

Java中的设计模式&#xff1a;实战案例分享 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 设计模式是软件开发中的宝贵工具&#xff0c;它们为常见的问题提供…

Redis 7.x 系列【5】 基础命令

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 KEYS2.2 DEL2.3 EXISTS2.4 EXPIRE2.5 TTL2.6 RENAME2.7 TYPE2.…

【Linux】进程间通信_4

文章目录 七、进程间通信1. 进程间通信分类systeam V共享内存消息队列信号量 未完待续 七、进程间通信 1. 进程间通信分类 systeam V共享内存 进程间通信的本质就是让不同进程看到同一份资源。而systeam V是通过让不同的进程经过页表映射到同一块内存空间&#xff08;操作系…

LED显示屏中什么是静态驱动?什么是扫描驱动?两者的区别是什么?

随着科技的飞速发展&#xff0c;LED显示屏作为现代信息显示技术的重要组成部分&#xff0c;正以其独特的优势引领着显示行业的革新。近日&#xff0c;LED显示屏市场呈现出蓬勃的发展态势&#xff0c;技术创新不断推动行业向前发展&#xff0c;让LED显示屏无论是在商场的广告牌、…

苏东坡传-读书笔记一

太守的官衙位于杭州中心&#xff0c;但是苏东坡却喜欢在较为富有诗意的地方办公。他往往在葛岭下面有十三间房子的寿星院办公&#xff0c;因为那里风光如画。看公文不在寒碧轩&#xff0c;就在雨奇堂。我们记得雨奇堂是从苏东坡西湖诗“山色空濛雨亦奇”而得名的。在这里&#…