必备基础

内核编程注意事项

  • 不能使用浮点运算。内核在切换模式时候不保存处理器的浮点状态。

  • 不要让内核程序进行长时间等待。操作系统本身是抢占式的,内核是非抢占式的

  • 保持代码整洁,方便后期调试

  • 申请资源后一定要释放

  • Linux 内核API很多配对使用

模块编译Makefile模板

ifneq ($(KERNELRELEASE),)

mymodule-objs := mymodule1.o mymodule2.o
obj-m := mymodule.o

else

PWD := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
    $(MAKE) -C $(KDIR) M=$(PWD)

clean:
    rm -rf *.o *.mod.c *.ko *.symvers *.order *.markers *-
endif

KERNELRELEASE 是在内核源码的顶层 Makefile 文件中定义的一个变量,第一次读取此Makefile文件的时候变量没有被定义,第二次才会定义。

  • -C 表示跳转到内核源码目录下读取那里的Makefile。

  • M= 表明返回到当前目录继续读入、执行当前的Makefile

  • mymodule-objs := xxx1.o xxx2.o 表示 mymodule.o由 xxx1.o 和 xxx2.o 链接生成

  • obj-m := mymodule.o 表示编译链接后生成 mymodule.ko 模块

内核调试函数 printk

内核编译与定制

创建initramfs

设置 grub