Linux内核驱动编译

在看LINUX设备驱动(第三版)的时候,需要自己手敲代码然后验证。因此需要搭建一个可以编译内核驱动的编译环境。本文搭建ARM的交叉编译环境,能够单独编译出模块ko。

1 代码准备

driver目录下创建helloworld文件夹,并在该文件夹下创建hello.cMakefile文件。

hello.c源文件内容如下:

#include <linux/module.h>
#include <linux/init.h>

static int __init hello_init(void)
{
    printk(KERN_ALERT "welcome, hello\n");
    return 0;
}


static void __exit hello_exit(void)
{
    printk(KERN_ALERT "bye, hello\n");
}


MODULE_LICENSE("GPL");

module_init(hello_init);
module_exit(hello_exit);

Makefile内容如下:

ifneq ($(KERNELRELEASE),)
		obj-m := hello.o
else
		KERNELDIR := /home/code/BMC/Aspeed-Linux/linux
		PWD := $(shell pwd)
default:
		$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
		$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
endif

KERNELDIR是你下载的linux源代码并解压好的路径。根据实际修改KERNELDIR的值。

2 编译

需要先编译完整的linux内核,具体可以参考linux kernel编译以及根文件系统的制作 - cockpunctual - 博客园。编译完内核后,进入前面创建的hello文件夹编译ko。

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 

编译完的ko可以放入到制作的根文件系统中,用qemu进行调试。

image

image

制作根文件系统和使用qemu调试都可以参考前面的博客。

3 Reference

1 Linux驱动实践:带你一步一步编译内核驱动程序 - IOT物联网小镇 - 博客园

2 交叉编译arm linux内核模块 | blingbling's blog

posted @ 2025-07-10 09:55  cockpunctual  阅读(83)  评论(0)    收藏  举报