linux 基础复习(9)设备驱动入门
· get_free_page:获得一个或几个连续页面。
· get_dma_pages:获得用于DMA传输的页面。
与之相对应的释放内存用也有kfree或free_pages 族。
kmalloc 函数语法要点
所需头文件 #i nclude
函数原型 void *kmalloc(unsigned int len,int flags)
Len:希望申请的字节数
GFP_KERNEL:内核内存的通常分配方法,可能引起睡眠
GFP_BUFFER:用于管理缓冲区高速缓存
函数传入值 flags GFP_ATOMIC:为中断处理程序或其他运行于进程上下文之外的代码分
配内存,且不会引起睡眠
GFP_USER:用户分配内存,可能引起睡眠
GFP_HIGHUSER:优先高端内存分配
_GFP_DMA:DMA数据传输请求内存
_GFP_HIGHMEN:请求高端内存
函数返回值 成功:写入的数据长度
失败:-EFAULT
kfree函数的语法格式
所需头文件 #i nclude
函数原型 void kfree(void * obj)
函数传入值 obj:要释放的内存指针
函数返回值 成功:写入的数据长度
失败:-EFAULT
get_free_ page类函数语法要点
unsigned long get_zeroed_page(int flags)
unsigned long __get_free_page(int flags)
函数原型 unsigned long __get_free_page(int flags,unsigned long order)
unsigned long __get_dma_page(int flags,unsigned long order)
函数传入值 flags:同kmalloc
order:要请求的页面数,以2为底的对数
函数返回值 成功:写入的数据长度
失败:-EFAULT
free_page类函数语法要点
所需头文件 #i nclude
函数原型 unsigned long free_page(unsigned long addr)
unsigned long free_page(unsigned long addr)
函数传入值 flags:同kmalloc
order:要请求的页面数,以2为底的对数
函数返回值 成功:写入的数据长度
失败:-EFAULT
printk类函数语法要点
所需头文件 #i nclude
函数原型 int printk(const char * fmt,…)
KERN_EMERG:紧急时间消息
KERN_ALERT:需要立即采取动作的情况
KERN_CRIT:临界状态,通常涉及严重的硬件或软件操作失败
KERN_ERR:错误报告
函数传入值 fmt: KERN_WARNING:对可能出现的问题提出警告
日志级别 KERN_NOTICE:有必要进行提示的正常情况
KERN_INFO:提示性信息
KERN_DEBUG:调试信息
…:如printf一样的格式说明
函数返回值 成功:0
失败:-1
这些不同优先级的信息可以输出到控制台上、/var/log/messages 里。其中,对输出给控制台的信息有一个特定的优先级console_loglevel。若优先级小于这个整数值时,则消息才能显示到控制台上,否则,消息会显示在/var/log/messages 里。若不加任何优先级选项,则消息默认输出到/var/log/messages 文件中。
要开启klogd和syslogd服务,消息才能正常输出。
proc 文件系统
/proc 文件系统是一个伪文件系统,它是一种内核和内核模块用来向进程发送信息的机制。这个伪文件系统让用户可以和内核内部数据结构进行交互,获取有关进程的有用信息,在运行时通过改变内核参数改变设置。与其他文件系统不同,/proc存在于内存之中而不是硬盘上。读者可以通过“ls”查看/proc文件系统的内容。
/proc文件系统主要目录内容
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';} onclick=if(!this.resized) {return true;} else {window.open(this.src);} alt= src=http://blogimg.chinaunix.net/blog/upfile2/080413215654.jpg onload=if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';} border=0>
除此之外,还有一些是以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的PID 号为目录名,它们是读取进程信息的接口。进程目录的结构如下
screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';} onclick=if(!this.resized) {return true;} else {window.open(this.src);} alt= src=http://blogimg.chinaunix.net/blog/upfile2/080413215720.jpg onload=if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new windownCTRL+Mouse wheel to zoom in/out';} border=0>
用户可以使用cat命令来查看其中的内容。
可以看到,/proc文件系统体现了内核及进程运行的内容,在加载模块成功后,读者可以使用查看/proc/device文件获得相关设备的主设备号。
评论