Linux设备驱动程序.ppt
《Linux设备驱动程序.ppt》由会员分享,可在线阅读,更多相关《Linux设备驱动程序.ppt(39页珍藏版)》请在三一文库上搜索。
1、Linux设备驱动程序,http:/ 设备驱动程序的框架 字符型设备 网络设备 文件系统 User Space File System USB设备 FrameBuffer例子和使用 Debug原理和Debug方法 常用设备/fb/ram/loopback/zero,设备驱动程序的任务,设备初始化 硬件操作和管理 外部硬件和内核空间的数据传递 内核空间和用户空间的数据传递,设备驱动程序的功能,外部硬件,设备驱动程序,用户程序,存储缓冲,用户空间,内核空间,用户态程序 vs 内核态程序,用户程序 权限受限 虚拟运行环境 逻辑地址 关键资源访问受监管 函数调用由用户控制,内核程序 最高权限 实际的运
2、行环境 物理地址 可访问所有资源 函数由内核直接调用 可以运行驱动程序,设备操作和管理能运行在用户态吗?,地址映射与物理地址访问,物理地址空间,用户进程1,用户进程2,用户进程3,虚拟地址映射,用户利用指针访问的是虚地址,不是物理地址,IO设备的物理地址可能是用户进程不可触及的,虚拟地址映射,虚拟地址映射,直接访问内核内存(/dev/kmem),kmfd = open(“/dev/kmem“, O_RDONLY ); lseek( kmfd, offset, SEEK_SET ); read( kmfd, byteArray, byteArrayLen ); close(kmfd);,直接访问
3、内核地址(内核态的虚地址) 一般内核地址起始于0xC0000000,直接访问物理地址(/dev/mem),mem_fd = open(“/dev/mem“, O_RDONLY ); b=mmap(0, 0x10000, PROT_READ|PROT_WRITE,MAP_SHARED, mem_fd,0xA0000) close(memfd);,0xA0000,0xB0000,Pointer b,mmap将文件中的数据映射成数组 这里是将物理内存(由特殊文件/dev/mem访问)映射成指针b指向的数组。 注意,指针b的值不一定是0xA0000,它是和物理地址0xA0000对应的用户态的虚拟地址
4、Linux中/dev/mem主要是用于设备内存的访问(比如显卡内存),而不是普通存储器,直接访问IO端口(/dev/port),port_fd = open(“/dev/port“, O_RDWR); lseek(port_fd, port_addr, SEEK_SET); read(port_fd, ); write(port_fd, ); close(port_fd);,注意:不能用fopen/fread/fwrite/fclose因为它们有数据缓冲,对读写操作不是立即完成的,outb()/outw()/inb()/inw()函数,#include #include #include #d
5、efine BASEPORT 0x378 / printer int main() ioperm(BASEPORT, 3, 1); / get access permission outb(0, BASEPORT); usleep(100000); printf(“status: %dn“, inb(BASEPORT + 1); ioperm(BASEPORT, 3, 0); / give up exit(0); ,ioperm(from,num,turn_on) 用ioperm申请的操作端口地址在0x0000x3FF,利用iopl()可以申请所有的端口地址 必须以root运行 用 “gcc
6、-02 o xxx.elf xxx.c” 编译,outb(value, port); inb(port); / 8-bit outw(value, port); inw(port); / 16-bit 访问时间大约1us,设备驱动程序内访问设备地址,设备驱动程序可以通过指针访问设备地址 设备驱动程序接触到的还是虚拟地址,但对于外界设备有固定的设备地址映射(设备的地址在移植Linux时候确定),物理内存地址空间,设备驱动程序,虚拟地址映射,设备地址空间,设备地址映射,设备驱动程序,虚拟地址映射,设备地址映射,直接访问IO端口 vs 设备驱动程序,IO直接访问 用户态 程序编写/调试简单 查询模式
7、,响应慢 设备共享管理困难,设备驱动访问 核心态 编程调试困难 可用中断模式访问、快 设备共享管理简单(由内核帮助完成),设备分类,字符设备 鼠标、串口、游戏杆 块设备 磁盘、打印机 网络设备 由BSD Socket访问,字符设备 vs 块设备,字符设备 字符设备发出读/写请求时,对应的硬件I/O一般立即发生。 数据缓冲可有可无 ADC/DAC、按钮、LED、传感器等,块设备 利用一块系统内存作缓冲区,一般读写由缓冲区直接提供,尽量减少IO操作 针对磁盘等慢速设备,可装卸的设备驱动程序和 静态连接到内核的设备驱动程序,静态连接到内核的设备驱动程序 修改配置文件、重新编译和安装内核 可装卸的设备
8、驱动程序 insmod 装载 rmmod 卸载 lsmod 查询,Linux对硬件设备的抽象,设备文件 Open/Close/Read/Write 例子 /dev/mouse /dev/lp0,驱动程序与设备文件,设备驱动程序,设备 文件,用mknod 命令创建,用insmod命令安装, 或直接编译到内核中,用户程序,用open/read/write/close等命令访问,通过主设备号找到设备驱动,驱动程序代码结构,驱动程序注册与注销,设备文件的操作函数 (*open)() (*write)() (*flush)() (*llseek)() ,中断服务程序,LED设备驱动程序的例子,CPU,s
9、truct file_operations LED_fops = read: LED_read, write: LED_write, open: LED_open, release: LED_release, ; int LED_init_module(void) SET_MODULE_OWNER(,程序列表 (1),程序列表 (2),int LED_open(struct inode *inode, struct file *filp) printk(“LED_open()n“); MOD_INC_USE_COUNT; return 0; int LED_release(struct ino
10、de *inode, struct file *filp) printk(“LED_release()n“); MOD_DEC_USE_COUNT; return 0; ,程序列表 (3),ssize_t LED_read (struct file *filp, char *buf, size_t count, loff_t *f_pos) int i; for (i=0; iLED_on(); else Data-LED_off(); return count; ,(*(volatile unsigned int *)(0xXXXXXXXX) |= MASK; (*(volatile uns
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 设备 驱动程序
链接地址:https://www.31doc.com/p-3028656.html