Linux_编译内核并编写⼀个最基础的字符设备驱动程序
linux 内核编译以及字符设备驱动程序的编写
关键词: 内核编译; globalmem字符设备驱动编写; linux; linux设备驱动编写;
字符设备驱动程序主要内容事先准备linux-3.2.96内核镜像Ubuntu 14.04 64位系统(内核版本3.13.0-24-generic )编译环境配置:使⽤命令
sudo apt-get install build-essential kernel-package libncurses5-dev
其中gcc版本为4.8.2(Copyright © . All Rights Reserved)
内核编译
使⽤linux-3.2.96内核,下载的是. 格式,⾸先将下载的内核移动到/usr/src/⽬录下(Copyright © . All Rights Reserved)切换到/usr/src/⽬录下,解压缩内核压缩包。由于下载的压缩包是. 后缀,解压分为两步:进⼊/usr/src/linux-3.2.96中,清理旧的编译⽂件现在/usr/src
的样⼦就是这样的:在/usr/src/linux-3.2.96中使⽤命令复制运⾏中的内核config 到linux-3.2.96⽂件夹中(Copyright © . All Rights Reserved)接着复制现有内核中的.config ⽂件也复制到linux-3.2.96中(以我的Ubuntu 14.04为例,现有内核中的.config 即为/usr/src/linux-headers-3.13.0-24-generic/.config )
sudo mv linux-3.2. /usr/src
xz -d linux-3.2. tar -xvf linux-3.2.96.tar
cd /usr/src/linux-3.2.96
make mrproper
sudo cp /boot/config-3.13.0-24-generic /usr/src/linux-3.2.96
接着运⾏
menuconfig 选择load an Alternate Configuration file
sudo cp /usr/src/linux-headers-3.13.0-24-generic/.config /usr/src/linux-3.2.96
sudo make menuconfig
或者直接⽤默认的.config,都⼀样能编译
接着直接make编译,如果不指定参数,make默认单线程编译,所以我加了参数j4,多作业充分利⽤处理器核⼼多作业开始编译
sudo make -j4all
开始编译:
globalmem字符设备驱动编写及安装挂载globalmem字符设备驱动编写核⼼代码如下
int globalmem_init(void)
{
int result;
dev_t devno = MKDEV(globalmem_major, 0);
/* 申请设备号 */
if (globalmem_major)
result = register_chrdev_region(devno, 1, "globalmem");
else/* 动态申请设备号(Copyright © blog.csdn/s_gy_zetrov. All Rights Reserved) */
{
result = alloc_chrdev_region(&devno, 0, 1, "globalmem");
globalmem_major = MAJOR(devno);
}
if (result < 0)
return result;
/* 动态申请设备结构体的内存(Copyright © blog.csdn/s_gy_zetrov. All Rights Reserved) */
globalmem_devp = kmalloc(sizeof(struct globalmem_dev), GFP_KERNEL);
if (!globalmem_devp) /*申请失败*/
{
result = - ENOMEM;
goto fail_malloc;linux系统安装步骤csdn
}
memset(globalmem_devp, 0, sizeof(struct globalmem_dev));
globalmem_setup_cdev(globalmem_devp, 0);
return0;
fail_malloc: unregister_chrdev_region(devno, 1);
return result;
}
void globalmem_exit(void)
{
cdev_del(&globalmem_devp->cdev); /*注销 cdev*/
kfree(globalmem_devp); /*释放设备结构体内存 (Copyright © blog.csdn/s_gy_zetrov. All Rights Reserved)*/
unregister_chrdev_region(MKDEV(globalmem_major, 0), 1); /*释放设备号*/
}
完整代码见[]
globalmem字符设备驱动的编译makefile编写
在编写makefile的时候,我参考了⽹上的很多写法,都不能很有效地成功编译设备驱动。以下的makefile写法是我⾃⼰摸索出来的,在我的测试环境下,保证能编译成功。但也只保证在我的测试环境下,因为我没有测试其他的环境,如Ubuntu 16.04等。
代码如下:
# Makefile (Copyright © blog.csdn/s_gy_zetrov. All Rights Reserved)
ifneq ($(KERNELRELEASE),)
# kbuild syntax. dependency relationshsip of files and target modules are listed here.
obj-m := globalmem.o
else
PWD := $(shell pwd)
KERNEL_VER ?= $(shell uname -r)
KERNEL_DIR := /lib/modules/$(KERNEL_VER)/build
all:
$(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules
clean:
rm ‐rf *.o *~ core .depend .*.cmd *.ko *.mod.c
endif
运⾏make命令
编译成功:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论