嵌入式Linux设备驱动开发之:字符设备驱动编程
len:希望申请的字节数 | ||
flags | GFP_KERNEL:内核内存的通常分配方法,可能引起睡眠 | |
GFP_BUFFER:用于管理缓冲区高速缓存 | ||
GFP_ATOMIC:为中断处理程序或其他运行于进程上下文之外的代码分配内存,且不会引起睡眠 | ||
GFP_USER:用户分配内存,可能引起睡眠 | ||
GFP_HIGHUSER:优先高端内存分配 | ||
__GFP_DMA:DMA数据传输请求内存 | ||
__GFP_HIGHMEN:请求高端内存 | ||
函数返回值 | 成功:写入的数据长度 |
表11.9给出了kfree()函数的语法格式。
表11.9 kfree()函数语法要点
所需头文件 | #includelinux/malloc.h> |
函数原型 | voidkfree(void*obj) |
函数传入值 | obj:要释放的内存指针 |
函数返回值 | 成功:写入的数据长度 |
表11.10给出了以页为单位的分配函数get_free_page类函数的语法格式。
表11.10 get_free_page类函数语法要点
所需头文件 | #includelinux/malloc.h> |
函数原型 | unsignedlongget_zeroed_page(intflags) |
函数传入值 | flags:同kmalloc() |
order:要请求的页面数,以2为底的对数 | |
函数返回值 | 成功:返回指向新分配的页面的指针 |
表11.11给出了基于页的内存释放函数free_page族函数的语法格式。
表11.11 free_page类函数语法要点
所需头文件 | #includelinux/malloc.h> |
函数原型 | unsignedlongfree_page(unsignedlongaddr) |
函数传入值 | addr:要释放的内存起始地址 |
order:要请求的页面数,以2为底的对数 | |
函数返回值 | 成功:写入的数据长度 |
(9)打印信息。
就如同在编写用户空间的应用程序,打印信息有时是很好的调试手段,也是在代码中很常用的组成部分。但是与用户空间不同,在内核空间要用函数printk()而不能用平常的函数printf()。printk()和printf()很类似,都可以按照一定的格式打印消息,所不同的是,printk()还可以定义打印消息的优先级。
表11.12给出了printk()函数的语法格式。
表11.12 printk类函数语法要点
所需头文件 | #includelinux/kernel> | |
函数原型 | intprintk(constchar*fmt,…) | |
函数传入值 | fmt: | KERN_EMERG:紧急时间消息 |
KERN_ALERT:需要立即采取动作的情况 | ||
KERN_CRIT:临界状态,通常涉及严重的硬件或软件操作失败 | ||
KERN_ERR:错误报告 | ||
KERN_WARNING:对可能出现的问题提出警告 | ||
KERN_NOTICE:有必要进行提示的正常情况 | ||
KERN_INFO:提示性信息 | ||
KERN_DEBUG:调试信息 | ||
…:与printf()相同 | ||
函数返回值 | 成功:0 |
这些不同优先级的信息输出到系统日志文件(例如:“/var/log/messages”),有时也可以输出到虚拟控制台上。其中,对输出给控制台的信息有一个特定的优先级console_loglevel。只有打印信息的优先级小于这个整数值,信息才能被输出到虚拟控制台上,否则,信息仅仅被写入到系统日志文件中。若不加任何优先级选项,则消息默认输出到系统日志文件中。
注意 | 要开启klogd和syslogd服务,消息才能正常输出。 |
4.proc文件系统
/proc文件系统是一个伪文件系统,它是一种内核和内核模块用来向进程发送信息的机制。这个伪文件系统让用户可以和内核内部数据结构进行交互,获取有关系统和进程的有用信息,在运行时通过改变内核参数来改变设置。与其他文件系统不同,/proc存在于内存之中而不是在硬盘上。读者可以通过“ls”查看/proc文件系统的内容。
表11.13列出了/proc文件系统的主要目录内容。
表11.13 /proc文件系统主要目录内容
目录名称 | 目录内容 | 目录名称 | 目录内容 | |
apm | 高级电源管理信息 | locks | 内核锁 | |
cmdline | 内核命令行 | meminfo | 内存信息 | |
cpuinfo | CPU相关信息 | misc | 杂项 | |
devices | 设备信息(块设备/字符设备) | modules | 加载模块列表 | |
dma | 使用的DMA通道信息 | mounts | 加载的文件系统 | |
filesystems | 支持的文件系统信息 | partitions | 系统识别的分区表 | |
interrupts | 中断的使用信息 | rtc | 实时时钟 | |
ioports | I/O端口的使用信息 | stat | 全面统计状态表 | |
kcore | 内核映像 | swaps | 对换空间的利用情况 | |
kmsg | 内核消息 | version | 内核版本 | |
ksyms | 内核符号表 | uptime | 系统正常运行时间 | |
loadavg | 负载均衡 | … | … |
除此之外,还有一些是以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的PID号为目录名,它们是读取进程信息的接口。进程目录的结构如表11.14所示。
表11.14 /proc中进程目录结构
目录名称 | 目录内容 | 目录名称 | 目录内容 | |
cmdline | 命 |
嵌入式Linux 设备驱动 字符设备驱动 操作系统 相关文章:
- 嵌入式Linux技术在工业控制网络中的应用(10-30)
- 基于嵌入式Linux的组态软件实时数据库的设计(02-01)
- 基于ARM+DSP的嵌入式Linux数控系统设计(11-18)
- 基于嵌入式Linux的细胞特征提取算法设计(11-19)
- 基于S3C2410的嵌入式Linux系统构建(03-02)
- 嵌入式Linux网络编程之:网络基础编程(08-13)