Linux内核模块编程

来源:互联网 发布:网络语言橘子啥意思 编辑:程序博客网 时间:2024/05/09 12:38
选定linux内核版本号,下载。如linux-2.6.32-10
根据开发板的芯片方案,移植下载的内核源代码,配置CPU型号、芯片型号等。
学习linux内核的最好的方法就是查看源代码。内核庞大而复杂,建议用source insight/sclickedit等工具。

开发板,bootloader,文件系统烧写等。


Linux 系统层次结构
系统调用
内核组成部分
Linux驱动分类
内核模块编程


一个Linux系统分为三个层次:
●  用户进程
●  核心
●  硬件




    系统调用是用户程序与核心间的边界,通过系统调用进程可由用户模式转入核心模式,在核心模式下完成一定的服务请求后再返回用户模式;系统调用是用户进程进入内核执行的唯一方式。
系统调用的主要功能是使用户可以使用操作系统提供的有关设备管理、文件系统、进程控制进程通讯以及存储管理方面的功能,而不必要了解操作系统的内部结构和有关硬件的细节问题,从而减轻用户负担和保护系统以及提高资源利用率
系统调用的实现:
    在每种平台下,都有特定的指令可以使进程的执行由用户态转换到核心态,这种指令称作操作系统陷入(operating system trap)。在linux中是通过软中断来实现这种陷入的,如在X86平台上,这条指令是int 0x80。也就是说在linux中,系统调用的接口是一个中断处理函数的特例。
系统调用的分类:系统调用分为两个大的部分,与文件子系统交互的和与进程子系统交互的部分。其中和文件子系统可以包括与设备文件和普通文件的交互的系统调用(open,close,ioctl, create,unlink,…);与进程相关的包括进程控制(fork,exit,getpid,…),进程间通讯,存储管理,进程调度等的系统调用。


进程管理:进程的创建、管理,进程调度。其中进程调度程序( S C H E D)负责控制进程访问C P U。保证进程能够公平地访问C P U,同时保证内核可以准时执行一些必需的硬件操作。
内存管理:分配、管理物理内存,并支持虚拟内存。
虚拟文件系统(VFS):通过提供一个所有设备的公共文件接口, V F S抽象了不同硬件设备的细节。此外, V F S支持与其他操作系统兼容的不同的文件系统格式。
网络:网络协议栈的实现。
进程间通讯:为进程与进程之间的通信提供了一些机制
     这些子系统虽然实现的功能相对独立,但存在着较强的依赖性(调用其他子系统提供的函数,如在进程管理中需要调用分配内存等)


驱动是干什么的? 
      驱动就是驱动硬件的(操作某一硬件)的代码,也就是说,驱动主要负责与某一特定的硬件打交道。比如说显卡驱动,就主要通过操作显卡来显示图像。
Linux驱动分类:主要分为三类驱动
字符设备驱动(char device driver):针对字符设备的驱动
块设备驱动(block device driver): 针对块设备(如磁盘、光驱等)的驱动
网络设备驱动(net device driver):针对网络设备(如网卡等)的驱动
分类依据
    不同的硬件设备操作方法及流程不一样,所以才有了上面三类驱动的划分,比如对块设备的读写和对字符设备的读写就不一样(块设备的读写最小单位为“块”,而对字符设备的读写最小单位是字节)。


什么是内核模块?
内核模块是,可以根据需要加载进内核或从内核中卸载的代码块。内核模块可以扩展内核的功能而不必重启系统。例如:设备驱动就是内核模块的一种类型,它们允许内核去访问连接到系统的硬件设备。
假如没有模块,我们必须把所有功能都编进庞大的内核映象中去,这样不仅使内核映象越来越大,而且更重要的是,每次我们想增加新功能,就必须重新编译内核和重烧内核映象。 


几个与内核模块有关的命令:

lsmod
insmod, modprobe
rmmod
/sys/modules


什么是模块参数?
    模块参数就是可以通过命令行传递初始值的全局变量。

定义模块参数

1. 首先声明接收参数值的变量为全局变量
如:int myint  = 5; 
2.   用module_param() 宏声明该全局变量为模块参数。


module_param(name, type, perm)  :
name : 变量名
type : 变量类型. Byte, short,ushort, int, uint, long,ulong,charp, bool
perm:  参数权限。(与文件权限一样,因为参数名最终在会在/sys/modules/xxx/parameters/目录下生成一个以变量名为文件名的文件。)如:S_IRUSR, S_IWUSR, S_IXUSR ,S_IRGRP,S_IWGRP,等等,定义在linux/stat.h, 也可以直接用0660这样的格式指定参数权限。


0 0
原创粉丝点击