Linux内核学习

简介: Linux内核学习

一、KConfig、Make

Kconfig语法简介

细说Kconfig(转)

三者之间的关系如下:当我们在内核源码目录下输入make menuconfig时,在出现的菜单界面中选择一项时,它会自动更新.config相应项的值。如果我们没有选择,则会在.config问下插入一行注释。类似于# CONFIG_SERIAL_NONSTANDARD is not set,当我们输入make时,根据makefile文件来编译,makefile文件中的变量值则由.config来进行赋值操作。仅仅只在kconfig中添加选项,只会在菜单界面中显示,即使此时选择y或m,也不会编译文件。还需要在makefile文件中按照规定添加相应行才能进行编译。简单图解如下:

kconfig------->.config---------->makefile


1、内核中加入自己的模块

  编写了 mytest.c 的文件,这里不关心 mytest.c 的内容。如果想把 mytest.c 编译到内核中,需要按照以下的步骤来完成:

  1. mytest.c 放到任何一个目录中,这个目录只要求已存在 KconfigMakefile 中,比如源码根目录 /arch/arm/ 目录中。
  2. 在这个目录的 Kconfig 中添加
config MY_TEST
    bool “My Test”
  1. Makefile 中添加
obj-$(CONFIG_MY_TEST) += mytest.o
  1. .config 中可以添加 CONFIG_MY_TEST = y 来选中或者在执行 make menuconfig 时,找到显示名为 My Test 的选项,使用空格选中

 总而言之,就是如果需要向系统内核中添加一个功能,那么首先定义一个配置项对应于这个功能,添加到特定的 Kconfig 文件中。然后在 Makefile 里,定义这个配置项需要编译哪些文件。最后就可以通过 make menuconfig 或者直接修改 .config 来使能这个配置项。

二、uboot

uboot源码下载以及编译

git clone https://source.denx.de/u-boot/u-boot.git

uboot学习视频

uboot研读笔记 | 01 - 下载uboot源码并使用VSCode远程查看源码、编译uboot(2012.04.01版本)

U-boot启动流程

带你了解uboot如何启动Linux内核

uboot的环境变量

环境变量的优先级

命令传参>环境变量>uboot源码中的设置

史上最全的Uboot常用命令汇总(超全面!超详细!)收藏这一篇就够了

uboot github

uboot docs

uboot源码下载以及编译

三、Linux内核

1、内核下载

Linux kernel

如何下载Linux Kernel历史版本

2、错误解决

【错误记录】编译 Linux 内核报错 ( Unable to find the ncurses package. )

make menuconfig错误: /bin/sh: 1: flex: not found 和 /bin/sh: 1: bison: not found

fatal error: libelf.h: No such file or directory 解决方案

【问题解决】fatal error: openssl/xxx.h: 没有那个文件或目录

Linux内核编译错误:make[1]: *** 没有规则可制作目标“debian/canonical-certs.pem”,由“certs/x509_certificate_list” 需求。 停止

make xconfig详解

linux内核配置编译过程

Cannot generate ORC metadata for CONFIG_UNWINDER_ORC=y, please install libelf-dev

3、docker ubuntu环境

docker学习之路

Ubuntu中安装vim、gcc以及ifconfig

清华源Ubuntu 镜像使用帮助

sudo apt-get install make

4、GDB

ubuntu - 如何将 GDB 更新到最新、稳定的版本

Ubuntu18.04升级gdb10.2

Ubuntu16.04升级gdb7.11升级到10.2版本

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get -y --force-yes install gdb
gdb -v
sudo apt-get -y --force-yes install gdbserver
sudo add-apt-repository --remove ppa:ubuntu-toolchain-r/test
sudo apt-get update

用图文带你彻底弄懂GDB调试原理

GDB的工作原理及skyeye远程调试

gdb远程调试

5、QEMU

Linux视频调试视频

Ubuntu安装QEMU

ubuntu下qemu使用:图文详解

Qemu 安装

在ubuntu上执行QEMU的编译安装

Github Qemu

QEMU官网

linux qemu 使用方法

Linux内核和驱动

6、vscode

VsCode配置ssh免密远程连接服务器

在windows通过VS Code开发Linux内核驱动程序

linux驱动开发,vscode环境配置

linux驱动之调试技巧— 应用程序远程gdb+vscode调试应用程序, 串口kgdboc调试.ko驱动程序

gdb 调试 Linux 内核网络源码(附视频)

vscode + gdb 远程调试 linux 内核源码(附视频)

vscode工程屏蔽不需要的文件(保持搜索便利)

【VScode】搜索栏语法

{
    "files.exclude": {
        "**/.git": true,
        "**/.svn": true,
        "**/.hg": true,
        "**/CVS": true,
        "**/.DS_Store": true,
        "**/Thumbs.db": true,
        "arch/[^ix]*": true,
        "arch/i[a-z]*": true,
        "arch/x[a-z]*": true,
        "arch/x86*": true,
        "include/asm-[^ixg]*": true,
        "include/asm-i[a-z]*": true,
        "include/asm-x[a-z]*": true,
        "include/asm-x86*": true,
        "Documentation": true
    },
    "search.exclude": {
        "**/node_modules": true,
        "**/bower_components": true,
        "**/*.code-search": true
    }
}

7、实战步骤

(1) 内核配置

make menuconfig 配置好的文件保存为.config文件,直接以当前运行的X86平台的配置作为参考(cp /boot/config-2.6.18.el5 .config),若要配置2440开发板,则可以参考arch/arm/configs/s3c2410_defconfig 将其拷贝到内核源代码根目录(cp arch/arm/configs/s3c2410_defconfig .config)

注意:就算你完全用别的配置文件,也要执行make menuconfig,就算你什么也不改变,退出时也要记得选保存,这样才会有.config文件


开始内核调试

Kernel hacking

=> Compile-time checks and compiler options

=> Debug information

=> Rely on the toolchain’s implicit default DWARF version

选择 Rely on the toolchain’s implicit default DWARF version 打开调试

(2) 内核映像文件制作

关于bzImage、vmlinux、vmlinuz等内核映像文件

zImage、bzImage、uImage、vmlinuz、vmlinux

# 制作RamFs(RootFs文件夹,主要为busybox和init文件)
├── bzImage
├── initramfs.img
├── Makefile
└── rootfs
    ├── bin
    ├── init
    ├── linuxrc -> bin/busybox
    ├── sbin
    └── usr
(a)init 文件
#!/bin/busybox sh

/bin/busybox echo "Hello Linux"

/bin/mount -t proc none /proc

/bin/busybox sh

或者参考 超级详细讲解根文件系统rootfs的制作 进行制作Rootfs

(2) QEMU调试参数

cmdline:nokaslr (禁用内核地址空间布局随机)

-S 在开始时阻塞 CPU 执行

-s 开启 GDB 服务器,端口 1234

-gdb tcp::1234 开启 GDB 服务器,端口可以自己指定

qemu-system-x86_64 \
                -kernel bzImage \
                -initrd initramfs.img \
                -m 1G \
                -nographic \
                -append "earlyprintk=serial,ttyS0 console=ttyS0 nokaslr" \
                -S \
                -gdb tcp::1234


(a)运行脚本

  Makefileramfs 目标用来创建 initramfs.imgrun 目标用来引导新建的内核和根文件系统。

ramfs:
        cd ./rootfs && find . -print0 | cpio -ov --null --format=newc | gzip -9 > ../initramfs.img

run:
        qemu-system-x86_64 \
                -kernel bzImage \
                -initrd initramfs.img \
                -m 1G \
                -nographic \
                -append "earlyprintk=serial,ttyS0 console=ttyS0"


(3) GDB 命令调试

target remote:1234

break start_kernel

continue

step

# 启动内核
make run

#调试内核
gdb vmlinux   # 根下的vmlinux
# 连接远端gdb端口
target remote :1234
# 设置断点
break start_kernel # 可通过System.map查看断点地址和信息
continue

gdb init


(4)vscode 界面调试

(a)launch.json

  .vscodelaunch.json ,配置调试信息。

// launch.json
{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "gdb debug",
            "type": "cppdbg",
            "request": "launch",
            // "miDebuggerServerAddress": "172.18.25.30:1234",
            "miDebuggerServerAddress": "127.0.0.1:1234",
            "program": "${workspaceRoot}/vmlinux",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "logging": {
                "engineLogging": false
            },
            "MIMode": "gdb"
        }
    ]
}
(b)c_cpp_properties.json
  1. 生成 compile_commands.json
# 生成 compile_commands.json
./scripts/clang-tools/gen_compile_commands.py
  1. 配置 c_cpp_properties.json

.vscodec_cpp_properties.json 可以使用 CTRL + SHIFT + P 选择 C/C++: Edit Configurations,创建 c_cpp_properties.json 文件。

// c_cpp_properties.json
{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c17",
            "cppStandard": "c++14",
            "intelliSenseMode": "linux-clang-x64",
            "compileCommands": "${workspaceFolder}/compile_commands.json"
        }
    ],
    "version": 4
}

(5)QEMU 命令

CTAL + A,然后按 x 键

8、前置知识

Linux内核和驱动

C 语言与嵌入汇编 详细篇

(1)多个版本GCC编译器的安装

Ubuntu16.04多个版本GCC编译器的安装和切换

Installing GCC

update-alternatives 使用详解

9、Linux 0.11

Linux 0.11启动过程分析(一)

Linux 0.11 fork 函数(二)

Linux0.11 缺页处理(三)

Linux0.11 根文件系统挂载(四)

Linux0.11 文件打开open函数(五)

Linux0.11 execve函数(六)

Linux0.11 80X86知识(七)

Linux0.11 内核体系结构(八)

Linux0.11 系统调用进程创建与执行(九)

Linux0.11 进程切换(十)

Linux0.11 管道(十一)

Linux0.11 信号(十二)

10、Linux 内核设计与实现

Linux 内核设计与实现

11、深入理解 Linux 内核

深入理解 Linux 内核

四、内核驱动

驱动模块构建

正点原子驱动开发视频

1、Camera 与 V4L2

【Camera基础(一)】Camera摄像头工作原理及整机架构

【Camera基础(二)】摄像头驱动原理和开发&&V4L2子系统驱动架构


Camera驱动开发知识讲解

v4l2应用程序接口

linux下通过V4L2驱动USB摄像头

基于ZedBoard的Webcam设计(一):USB摄像头(V4L2接口)的图片采集

基于ZedBoard的Webcam设计(二):USB摄像头图片采集+QT显示

基于ZedBoard的Webcam设计(三):视频的采集和动态显示

基于ZedBoard的Webcam设计(四):MJPG编码和AVI封装

基于ZedBoard的Webcam设计(五):x264编码在zedboard上的实现(软编码)


一文分析Linux v4l2框架

Linux V4l2驱动 – 框架概述

V4L2驱动框架详解

Linux摄像头驱动学习之:(一)V4L2_框架分析

Linux摄像头驱动学习之:(二)通过虚拟驱动vivi分析摄像头驱动

五、busybox

Busybox

bootloader与linux中位置无关代码(PIC)的分析理解

六、RootFs

超级详细讲解根文件系统rootfs的制作

根文件系统rootfs制作——使用buildroot工具(重制版)

yaffs2文件系统工具mkyaffs2image

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
15天前
|
算法 Linux
深入探索Linux内核的内存管理机制
本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。
|
15天前
|
存储 缓存 网络协议
Linux操作系统的内核优化与性能调优####
本文深入探讨了Linux操作系统内核的优化策略与性能调优方法,旨在为系统管理员和高级用户提供一套实用的指南。通过分析内核参数调整、文件系统选择、内存管理及网络配置等关键方面,本文揭示了如何有效提升Linux系统的稳定性和运行效率。不同于常规摘要仅概述内容的做法,本摘要直接指出文章的核心价值——提供具体可行的优化措施,助力读者实现系统性能的飞跃。 ####
|
16天前
|
监控 算法 Linux
Linux内核锁机制深度剖析与实践优化####
本文作为一篇技术性文章,深入探讨了Linux操作系统内核中锁机制的工作原理、类型及其在并发控制中的应用,旨在为开发者提供关于如何有效利用这些工具来提升系统性能和稳定性的见解。不同于常规摘要的概述性质,本文将直接通过具体案例分析,展示在不同场景下选择合适的锁策略对于解决竞争条件、死锁问题的重要性,以及如何根据实际需求调整锁的粒度以达到最佳效果,为读者呈现一份实用性强的实践指南。 ####
|
16天前
|
缓存 监控 网络协议
Linux操作系统的内核优化与实践####
本文旨在探讨Linux操作系统内核的优化策略与实际应用案例,深入分析内核参数调优、编译选项配置及实时性能监控的方法。通过具体实例讲解如何根据不同应用场景调整内核设置,以提升系统性能和稳定性,为系统管理员和技术爱好者提供实用的优化指南。 ####
|
19天前
|
负载均衡 算法 Linux
深入探索Linux内核调度机制:公平与效率的平衡####
本文旨在剖析Linux操作系统内核中的进程调度机制,特别是其如何通过CFS(完全公平调度器)算法实现多任务环境下资源分配的公平性与系统响应速度之间的微妙平衡。不同于传统摘要的概览性质,本文摘要将直接聚焦于CFS的核心原理、设计目标及面临的挑战,为读者揭开Linux高效调度的秘密。 ####
32 3
|
21天前
|
负载均衡 算法 Linux
深入探索Linux内核调度器:公平与效率的平衡####
本文通过剖析Linux内核调度器的工作机制,揭示了其在多任务处理环境中如何实现时间片轮转、优先级调整及完全公平调度算法(CFS),以达到既公平又高效地分配CPU资源的目标。通过对比FIFO和RR等传统调度策略,本文展示了Linux调度器如何在复杂的计算场景下优化性能,为系统设计师和开发者提供了宝贵的设计思路。 ####
33 6
|
21天前
|
消息中间件 安全 Linux
深入探索Linux操作系统的内核机制
本文旨在为读者提供一个关于Linux操作系统内核机制的全面解析。通过探讨Linux内核的设计哲学、核心组件、以及其如何高效地管理硬件资源和系统操作,本文揭示了Linux之所以成为众多开发者和组织首选操作系统的原因。不同于常规摘要,此处我们不涉及具体代码或技术细节,而是从宏观的角度审视Linux内核的架构和功能,为对Linux感兴趣的读者提供一个高层次的理解框架。
|
22天前
|
缓存 并行计算 Linux
深入解析Linux操作系统的内核优化策略
本文旨在探讨Linux操作系统内核的优化策略,包括内核参数调整、内存管理、CPU调度以及文件系统性能提升等方面。通过对这些关键领域的分析,我们可以理解如何有效地提高Linux系统的性能和稳定性,从而为用户提供更加流畅和高效的计算体验。
29 2
|
22天前
|
缓存 网络协议 Linux
深入探索Linux操作系统的内核优化策略####
本文旨在探讨Linux操作系统内核的优化方法,通过分析当前主流的几种内核优化技术,结合具体案例,阐述如何有效提升系统性能与稳定性。文章首先概述了Linux内核的基本结构,随后详细解析了内核优化的必要性及常用手段,包括编译优化、内核参数调整、内存管理优化等,最后通过实例展示了这些优化技巧在实际场景中的应用效果,为读者提供了一套实用的Linux内核优化指南。 ####
45 1
|
22天前
|
算法 前端开发 Linux
深入理解Linux内核调度器:CFS与实时性的平衡####
本文旨在探讨Linux操作系统的核心组件之一——完全公平调度器(CFS)的工作原理,分析其在多任务处理环境中如何实现进程间的公平调度,并进一步讨论Linux对于实时性需求的支持策略。不同于传统摘要仅概述内容要点,本部分将简要预览CFS的设计哲学、核心算法以及它是如何通过红黑树数据结构来维护进程执行顺序,同时触及Linux内核为满足不同应用场景下的实时性要求而做出的权衡与优化。 ####
下一篇
DataWorks