Linux内核结构框架和驱动管理

文件系统以及虚拟文件系统概念

后续会提到文件系统和虚拟文件系统所以先在开头说明一下。

文件系统

文件系统就是操作系统是明确存储设备组织文件的方法(管理文件内容的编辑及目录的编排的程序)

种类有:FAT、NTFS、EXT/1/2/3/4(linux用的)、tmpfs(基于内存,内存文件系统) (查看文件属于的文件系统用命令:df -T)

可在/etc/init/bootmisc.sh.conf 或修改/etc/rc.local,加入可执行文件执行命令,即可设置开机启动。

虚拟文件系统VFS(Virtual File System)

linux根目录下文件夹的分区不同,文件系统不同,文件的操作方式也不同,所以虚拟文件系统解决了这个操作方式不同的问题。

虚拟文件系统是对各种文件系统的一个抽象,给开发者通过一个接口。

Linux内核结构框架

Linux内核结构框架和驱动管理_第1张图片
open等API调用驱动文件时识别的方式有两个:
1.文件名

2.设备号
主设备号:区分不同种类的设备
次设备号:区分同一类型的多个设备

所以添加驱动的过程为:设备名>>设备号>>设备驱动函数(操作寄存器驱动io口)

内核驱动的框架

自定义的设备驱动函数注册结构体

static struct file_operations pin4_fops ={
	.owner = THIS_MODULE, //前缀.为单独提取该结构体类型中的其中一个元素进行操作
	.open = pin4_open,
	.write = pin4_write, //函数指针,为我们定义的驱动函数
};

我们需要先定义一个自定义的设备驱动函数,在file_operation类型的结构体中注册

驱动入口

int __init pin4_drv_init(void)
{
	int ret;
	devno = MKDEV(major,minor);	//major为主设备号,minor为次设备号
	ret = register_chrdev(major,module_name,&pint4_fops);	//注册驱动函数,module_name为模块名
	pin4_class = class_create(THIS_MODULE,"myfirstdemo");	//自动生成设备到/dev/底下,第二个参数为设备名
	pin4_class_dev = device_create(pin4_class,NULL,devno,NULL,module_name);	//创造设备文件
}

module_init(pin4_drv_init);	//驱动入口注册

通过设备名,设备号,驱动地址,注册驱动
该函数是在insmod安装驱动的时候调用的

卸载驱动

void __exit pin4_dev_exit(void)
{
	device_destroy(pin4_calss,devno); //销毁设备
	class_destroy(pin4_class);//销毁类
	unregister_chrdev(major,module_name);//卸载驱动
}

module_exit(pin4_dev_exit); //卸载驱动

驱动代码编译与测试

取驱动源码:以模块的方式编译
将驱动源码放入linux内核源码目录下的/driver/char/
修改在Linux内核源码目录下的Makefile
加入:

obj -m += "驱动程序文件名"	//-m意思是以模块的方式编译

编译:

sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make modules

该命令会生成pin4driver2.ko

然后使用以下命令将生成的模块文件用scp传入树莓派中生成驱动

sudo insmod pin4driver2.ko 	//会在/dev/下生成pin4模块文件
sudo chmod 666 /dev/pin4		//给予所有使用者权限

你可能感兴趣的:(linux学习,linux,运维,服务器)