- 文件系统:在一个物理设备上的任何文件组织和目录。
- 文件系统时操作系统的重要组成部分,时操作系统中负责管理和
存储文件信息
的软件
机构。
- 文件系统时操作系统的重要组成部分,时操作系统中负责管理和
- 根文件系统:是Linux启动时,第一个挂载的文件系统,存放系统启动所必需的文件。
- 跟问建系统制作过程:
- 创建系统目录
- 添加必备的文件、命令
- 制作镜像
- 一直根文件系统
- 跟问建系统制作过程:
Linux 驱动开发基础
设备驱动程序
设备驱动程序:是计算机硬件与应用程序
的接口
,是计算机系统软件与硬件
的桥梁
,是一种可以与设备进行通信的特殊程序
。
- 为Linux内核提供调用接口
- 被用户程序调用
- 控制硬件
Linux操作系统与驱动的关系
Linux上程序开发一般分为两种:
- 内核及驱动程序开发
- 应用程序开发
Linux两种状态:
内核态:用来管理用户态的程序,完成用户态请求的工作。
用户态:处理上层的软件工作。
内核态有较高的权限,可以控制处理器内存的映射和分配方式,访问外设空间和处理器状态寄器,控制终端等。用户态只能运行系统上的应用程序。
驱动程序
与底层的硬件交互,所以工作在内核态
。
用户态和内核态的切换
- 系统调用
- open、write、read、close等。
- 异常
- 当cpu在执行运行在用户态下的程序时,发生了一些没有预知的异常,这时会触发由当前运行进程切换到处理此异常的内核相信进程种,也就是切换到了内核态,如缺页异常。
Linux设备驱动分类
-
字符设备
- 能一个字节一个字节读取数据的设备。
- 一般不支持随机访问。
- 发光二极管、键盘、鼠标、串口设备。
-
块设备
- 块设备是向磁盘一样的设备,在块设备种可以容纳文件系统并存储大量信息。
进行块设备读写时,每次只能传输一个或者多个块
。 - 可以进行顺序访问,也可以随机访问。
- 硬盘、U盘、光盘。
- 块设备是向磁盘一样的设备,在块设备种可以容纳文件系统并存储大量信息。
-
网络设备
- 数据传输通过
套接字接口
来实现。 - 网卡、路由器、集线器、交换机、网桥、网关等。
- 数据传输通过
字符设备
- 驱动模块组成
- 头文件
- 模块加载函数
- 模块卸载函数
- 模块许可声明
//Hello World驱动模块
#include<linux/init.h>
#include<kernel.h>
#include<linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int_init hello_init(void) //初始化函数
{
printk(KERN_ALERT"Hello,world\n");
return 0;
}
static void_exit hello_exit(void)
{
printk(KERN_ALERT"Goodbye,world\n");
}
module_init(hello_init);//模块加载函数
module_exit(hello_exit);//卸载函数
Linux驱动程序和应用程序的区别
- Linux驱动程序没有main主函数,不会自己运行,内核调用执行。
- Linux驱动程序是内核的一部分,运行在内核空间,应用程序运行在用户空间。
- 应用程序可以使用GLIBC标准C库,Linux驱动程序不能使用标准C库。
内核中编译驱动模块
完成4个工作:
- 编写驱动程序文件。
- 将驱动程序文件放到Linux内核源码的相应目录中,如果没有合适的目录,可以自己建立一个目录来存放驱动程序文件。
- 在目录的 Kconfig 文件中添加新的驱动程序对应的项目编译选择,修改菜单。
- 在目录的Makefile文件中添加新的驱动程序的编译语句。
Linux模块机制
- 模块加载:insmod hello.ko
- 模块卸载:rmmod hello
- 查看模块信息:lsmod hello、modinfo hello
- modprobe:命令时比较高级的加载和删除模块命令,可以解决模块之间的依赖性问题。
- modinfo命令用于查询模块的相关信息,比如:作者、版权等。
驱动程序安装
模块方式(动态加载)
- 模块加载:insmod hello.ko
- 模块卸载:rmmod hello
直接编译进内核
- make menuconfig 启动菜单,选择。