内核在线手册api

https://www.kernel.org/doc/html/latest/core-api/kernel-api.html

内核配置项menuconfig

系统滴答定时器(心跳)配置

image.png

开启内核打印log

echo “7 4 1 7” > /proc/sys/kernel/printk


内核裁剪方法

内核中修改和保存defconfig

  1. 要修改在arch/arm/configs下的文件xxx_defconfig
    2. make xxx_defconfig 会生成.config文件。
    3. make menuconfig 修改配置后保存
    4. make savedefconfig 生成defconfgi文件
    5. cp defconfig arch/arm/configs/xxx_defconfig 保存
    这样保存的defconfig文件,配置最小化。

    内核新增驱动步骤

    案例1:向内核zImage添加LED驱动程序(“在一起”)
    实施步骤:
    1.获取LED的linux内核设备驱动程序
    ftp://porting/led_drv.rar
    led_drv.c:LED的驱动程序
    led_test.c:LED的测试程序
    2.将驱动拷贝到内核源码中
    cp led_drv.c /opt/kernel/drivers/char/
    3.修改对应的Kconfig和Makefile
    vim /opt/kernel/drivers/char/Kconfig 添加如下内容
    config TARENA_LED
    tristate “tarena led drivers”
    help
    “this is my first led drivers”
    明确:生成的选项叫:CONFIG_TARENA_LED
    保存退出
    vim /opt/kernel/drivers/char/Makefile 添加
    obj-$(CONFIG_TARENA_LED) += led_drv.o
    保存退出
    明确:led_drv.c如何编译关键看CONFIG_TARENA_LED
    CONFIG_TARENA_LED=y->在一起
    CONFIG_TARENA_LED=m->分家
    CONFIG_TARENA_LED=空->不编译
    4.配置内核源码
    cd /opt/kernel
    make menuconfig
    Device Drivers->
    Character devices —->
    //按Y选择为
    <
    > tarena led drivers
    保存退出
    5.检查配置选项是否生效
    cd /opt/kernel
    vim .config 搜索CONFIG_TARENA_LED的值是否为y
    6.重新编译内核
    cd /opt/kernel
    make zImage
    cp arch/arm/boot/zImage /tftpboot
    此时此刻,zImage就包含了led_drv.c驱动

内核下载源

msak国内开源镜像:https://mirrors.tuna.tsinghua.edu.cn
https://wireless.wiki.kernel.org/en/developers/Regulatory/CRDA
源码:https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/refs/


内核书本知识

image.png
image.png

image.png

image.png


内核问题排查方法

驱动安装异常奔溃,打印内核堆栈信息

image.png
在函数s3c24xx_spi_irq 的0x50地方发生了错误,有0x70个字节,image.png

反编译内核查看地址,找到截图标记的函数原型
image.png
搜索函数s3c24xx_spi_irq
image.png
找到后,这个地址再加上0x50,
image.png
定位到出错位置汇编代码image.pngcmp r3, #0 ;0x0 // 如果r3不等于0
ldrbne r3, [r3, r2] // 从这个地址【r3+r2】读取一个数据放入r3这个寄存器
strb r3,[r0,#16] //将寄存器r3中的字节数据写入以r0+16为地址的存储器中。

观察出错汇编代码前后,初步定位到C语言代码,
image.png

从tx buf取数据image.png

查看编写的驱动代码,定位到错误, 参数 wlen应该是每次256才对。
image.png


添加内核参数

https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html