• JJJ:linux内核设计与实现 笔记


    第2章:

    1、压缩指令

    把一个文件或者目录(test)压缩成 .tar.bz2 格式:
    tar -vcjf test.tar.bz2 test

    把一个.tar.bz2 格式的压缩文件解压出来:
    tar -vxjf test.tar.bz2

    上面的两个操作是互逆的

    =

    同理压缩成 .tar.gz 或者 .tgz 格式:
    压缩:tar -vczf test.tar.gz test
    解压缩:tar -vxzf test.tar.gz

    =

    =

    2、diff & patch 指令

    生成patch & 用patch来升级一个文件

    Linux 命令 - patch命令(修补文件)

    diff file1 file2 > test.patch
    生成一个file1变成file2的patch

    patch file1 test.patch
    执行完后file1的内容就会和file2一样

    若是patch file2 test.patch
    则file2也会做同样的改动,如果可以的话

    =

    =

    3、编译内核前必须要先配置内核

    CONFIG_SMP 表示是否启用 SMP

    这些配置项要么是2选1,要么是3选1

    二选一:yes no,分别表示编译进内核,或不编译进内核

    三选一:再加一个m,表示编译成一个模块,若要使用需要手动加载

    =

    make config 逐一询问用户,需要手动配置 y,n(,m)
    make defconfig 采用默认配置
    make menuconfig

    经过上面三步中的某一步配置完成后,会生成1个 .config 文件(根目录下),如下:

    #
    # Automatically generated file; DO NOT EDIT.
    # Linux/arm 4.1.15 Kernel Configuration
    #
    CONFIG_ARM=y
    CONFIG_ARM_HAS_SG_CHAIN=y
    CONFIG_MIGHT_HAVE_PCI=y
    CONFIG_SYS_SUPPORTS_APM_EMULATION=y
    CONFIG_HAVE_PROC_CPU=y
    CONFIG_STACKTRACE_SUPPORT=y
    CONFIG_LOCKDEP_SUPPORT=y
    CONFIG_TRACE_IRQFLAGS_SUPPORT=y
    CONFIG_RWSEM_XCHGADD_ALGORITHM=y
    CONFIG_GENERIC_HWEIGHT=y
    CONFIG_GENERIC_CALIBRATE_DELAY=y
    CONFIG_NEED_DMA_MAP_STATE=y
    CONFIG_ARCH_SUPPORTS_UPROBES=y
    CONFIG_FIQ=y
    CONFIG_VECTORS_BASE=0xffff0000
    CONFIG_ARM_PATCH_PHYS_VIRT=y
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    A 如果.config不存在,运行make config/menuconfig时的缺省设置由固化在各个Kconfig文件中各项目的缺省值决定。

    B 如果.config存在,运行make config/menuconfig时的缺省设置即是当前.config的设置,若对设置进行了修改,.config将被更新。

    C arch/arm/defconfig是一个缺省的配置文件,make defconfig时会根据这个文件生成当前的.config。

    D arch/arm/configs文件夹中有许多命名为xxx_defconfig的配置文件,如果运行make xxx_defconfig,当前.config文件会由xxx_defconfig文件生成。

    E make oldconfig的作用是备份当前.config文件为.config.old,如若make config/menuconfig设置不当可用于恢复先前的.config。

    =

    =

    4、内核开发的特点

    内核代码的开发,不存在用户态那样的内存保护机制

    内核开发哪一进行浮点运算

    内核开发能使用标准的c库函数
    对于内核来说,完整的c库,甚至是它的一个子集,都太大&太低效了
    不过大部分常用的c库函数在内核中都得到了实现,如操作字符串的内核函数集就在 lib/string.c 中,内核的打印函数就是 printk

    =

    =

    5、printk函数的工作机制

    printk负责把格式化好的字符串拷贝到内核日志缓冲区上。然后syslog程序就可以通过读取该缓冲区来获取内核信息

    在这里插入图片描述

    =

    6、内联汇编的使用场景

    偏近体系结构的底层

    对执行时间要求严格的地方

    =

    =

    7、利用 likely 和 unlikely 对条件语句进行优化

    =

    =

    8、用户态的代码有内存保护机制,用户程序试图进行一次非法的访问,内核会报错并结束这个进程

    内核自己非法访问内存,可能会导致oops或者内核挂死

    另外内核中的内存都是不分页的(拓展:内核中的内存都不分页

    内核与其它普通进程一样,也是一个进程,但却与其它普通进程不同,它可以直接操作硬件,并且它也控制着分页机制以及内存页换入换出的替换算法。因此,对内核占用的内存分页没有意义

    =

    =

    9、用户程序在进行浮点操作时,内核会完成从整数操作到浮点数操作模式的转换,执行浮点指令。

    但要是在内核中使用浮点数,需要人工保存和恢复浮点寄存器等琐碎的事,比较麻烦。

    因此尽量不要再内核中使用浮点操作

    =

    =

    10、内核栈的容积小

    Linux内核栈和中断栈

    内核栈大小

    linux内核任务的堆栈大小设置,Linux 2.6.32的内核栈和用户空间栈关系

    LDD3曾说过:内核具有非常小的栈,它可能只和一个4096字节大小的页那样小。

    在内核程序实现过程中,一定要注意栈空间的使用,特别像递归这样的方法尽量少用,否则将可能会对产品产生致命的打击。

    =

    =

    11、内核中,大部分c代码应该与体系结构无关

    要把体系结构相关的代码分离出来

    疑问:如何在编译过程中配置linux kernel 栈大小

  • 相关阅读:
    国庆第五天
    大厂秋招真题【栈】Bilibili2019秋招-简单表达式求值
    springboot源码理解二、依赖管理
    C51--单片机中断
    C语言--输出1-100以内的素数
    JavaFX Scene Builder 工具详解
    Lambert (兰伯特)光照模型
    非零基础自学Java (老师:韩顺平) 第8章 面向对象编程(中级部分) 8.13 断点调试(debug)
    SparseBEV:High-Performance Sparse 3D Object Detection from Multi-Camera Videos
    Go语言基准测试(benchmark)三部曲之二:内存篇
  • 原文地址:https://blog.csdn.net/engineer0/article/details/125903471