内核在线手册api
https://www.kernel.org/doc/html/latest/core-api/kernel-api.html
内核配置项menuconfig
系统滴答定时器(心跳)配置
开启内核打印log
echo “7 4 1 7” > /proc/sys/kernel/printk
内核裁剪方法
内核中修改和保存defconfig
- 要修改在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/
内核书本知识
内核问题排查方法
驱动安装异常奔溃,打印内核堆栈信息
在函数s3c24xx_spi_irq 的0x50地方发生了错误,有0x70个字节,
反编译内核查看地址,找到截图标记的函数原型
搜索函数s3c24xx_spi_irq
找到后,这个地址再加上0x50,
定位到出错位置汇编代码cmp r3, #0 ;0x0 // 如果r3不等于0
ldrbne r3, [r3, r2] // 从这个地址【r3+r2】读取一个数据放入r3这个寄存器
strb r3,[r0,#16] //将寄存器r3中的字节数据写入以r0+16为地址的存储器中。
观察出错汇编代码前后,初步定位到C语言代码,
从tx buf取数据
查看编写的驱动代码,定位到错误, 参数 wlen应该是每次256才对。
添加内核参数
https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html