内核模块_设备驱动_lyf.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《内核模块_设备驱动_lyf.pdf》由会员分享,可在线阅读,更多相关《内核模块_设备驱动_lyf.pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 1/11 基本知识基本知识 01:程序空间分成了程序空间分成了 3 个部分个部分:0 表示 normal space,即普通地址空间,就是内核空间地址。1 表示用户地址空间.2 表示是设备地址映射空间,例如硬件设备的寄存器在内核里所映射的地址空间。这 3 个空间在属性检查是会被识别.Ex:#define _user _attribute_(noderef,address_space(1)定义了一个对用户空间属性的检查宏.表示这是一个用户空间的地址,即其指向的为用户空间的内存.long _user*p 表示指针 p 来自于用户空间.一个沟通内核与用户空间的函数对 copy_to_user(vo
2、id _user*to,const void*from,unsigned long n);copy_from_user(void*to,const void _user*from,unsigned long n);02:体系结构对操作系统的支持体系结构对操作系统的支持 操作系统的目的是提供一个多用户同时运行而相互不响应的环境.各个用户 好像自己独自占有一个处理器和自己需要的资源.为了这个目的,除了操作系统的软件外必须有硬件的支持,就是体系结构对操作系统的支持.一个名词解释一个名词解释:虚拟地址虚拟地址.虚拟地址和物理地址的概念 CPU通过地址来访问内存中的单元,地址有虚拟地址和物理地址之分,如
3、果CPU没有MMU(Memory Management Unit,内存管理单元),或者有MMU但没有启用,CPU核在取指令或访问内存时发出的地址将直接传到CPU芯片的外部地址引脚上,直接被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收,这称为物理地址 如果CPU启用了MMU,CPU核发出的地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address,以下简称VA),而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将虚拟地址映射成物理地址.MMU将虚拟地址映射到物理地址是以页(Page)为单位的,对于32位CPU通常一页为4K。例如,虚拟地
4、址0 xb700 10000 xb700 1fff是一个页,可能被MMU映射到物理地址0 x20000 x2fff.对于 arm 系统可以提供的部分支持如下:控制片上的 Cache,存储器管理,存储器保护,等.实现这些的核心是 ARM 片上的协处理器 CP15,15 是该处理器的序号.详细内容:-2/11 页式:段式:先分段,后分页 -页表基地址为0页表基地址一级页表内偏移序号00一级页表内偏移序号二级页表内偏移序号二级页表基地址10用户定义域0二级页表基地址二级页表内偏移序号10 92 1 03131 10 9 8 54 2 1 03114 132 1 03120 1903114 130CP
5、15中的寄存器C2一级描述符地址一级描述符二级描述符地址虚拟地址0012 11页表基地址为0页表基地址一级页表内偏移序号00一级页表内偏移序号段内地址偏移量段对应的物理基地址10BC用户定义域0A P0二级页表基地址段内地址偏移量20 192 1 0313120 1912 11 10 9 8 543 2 1 03114 132 1 03120 1903114 130CP15中的寄存器C2一级描述符地址一级描述符二级描述符地址虚拟地址2 个合成一个地址 查表获得一级描述符,该数据除了地址外,还有其它的内容 2 级页表基地址+2 级页表内偏移序号=具体页 2 个合成一个地址 查表获得一级描述符,该
6、数据除了地址外,还有其它的内容 2 级页表基地址+段内地址偏移=实际地址 3/11 03:Linux 的几种状态的几种状态 用户态 程序运行在用户空间的状态,无论工作在哪个用户进程,只要工作在 1 空间就是用户状态.内核态 程序运行在内核空间的状态.由于用户态不能够访问硬件,所以对所有文件的操作都是在内核态 完成的.用户内核态 程序工作在用户进程,但该进程此时正在调用内核程序(例如:系统调用).中断态 一种程序处理异常的程序状态.04:几个名词几个名词 01:索引点(inode 分为内存中的 inode 和文件系统中的 inode,下面是内存系统中的 inode)文件系统用来管理所有文件的一个
7、结构.该结构用来管理所有文件的消息.该结构的形式如下:struct inode struct hlist_node i_hash;struct list_headi_list;struct list_headi_sb_list;struct list_headi_dentry;unsigned long i_ino;/每一个每一个inode都有一个序号,都有一个序号,由由super block结构和其序号,可以很找到这个结构和其序号,可以很找到这个inode。atomic_t i_count;unsigned int i_nlink;/硬链结的个数的个数硬链结的个数的个数 uid_t i_ui
8、d;/inode拥有者的拥有者的id gid_t i_gid;/inode所属的群组所属的群组id dev_t i_rdev;/如果如果inode代表的是代表的是device的话,那此字段将记录的话,那此字段将记录device的代码的代码,即主设备号即主设备号(0,255),注意是开区间注意是开区间 /2.6 的内核可以容纳大量的设备,而以前版本的内核把主设备号和次设备号都限制为的内核可以容纳大量的设备,而以前版本的内核把主设备号和次设备号都限制为 255 unsigned long i_version;loff_t i_size;/inode所代表的档案大小所代表的档案大小#ifdef _N
9、EED_I_SIZE_ORDERED seqcount_t i_size_seqcount;#endif struct timespec i_atime;/inode最近一次的存取时间最近一次的存取时间 struct timespec i_mtime;/inode最近一次的修改时间最近一次的修改时间 struct timespec i_ctime;/inode的产生时间的产生时间 unsigned int i_blkbits;blkcnt_t i_blocks;unsigned short i_bytes;umode_t i_mode;/记录设备文件的类型记录设备文件的类型 spinlock_
10、t i_lock;/*i_blocks,i_bytes,maybe i_size*/struct mutex i_mutex;struct rw_semaphore i_alloc_sem;4/11 const struct inode_operations*i_op;/索引节点操作表索引节点操作表 const struct file_operations*i_fop;/默认的索引节点操作默认的索引节点操作 struct super_block*i_sb;/相关的超级块相关的超级块,inode所属档案系统的所属档案系统的super block struct file_lock*i_flock;
11、/用来做用来做file lock struct address_space*i_mapping;struct address_space i_data;#ifdef CONFIG_QUOTA struct dquot *i_dquotMAXQUOTAS;#endif struct list_headi_devices;union struct pipe_inode_info*i_pipe;struct block_device*i_bdev;struct cdev *i_cdev;int i_cindex;_u32 i_generation;#ifdef CONFIG_DNOTIFY unsi
12、gned long i_dnotify_mask;/*Directory notify events*/struct dnotify_struct*i_dnotify;/*for directory notifications*/#endif#ifdef CONFIG_INOTIFY struct list_headinotify_watches;/*watches on this inode*/struct mutex inotify_mutex;/*protects the watches list*/#endif unsigned long i_state;unsigned long d
13、irtied_when;/*jiffies of first dirtying*/unsigned int i_flags;atomic_t i_writecount;#ifdef CONFIG_SECURITY void *i_security;#endif void *i_private;/*fs or device private pointer*/02:文件描述符文件描述符(句柄句柄)用于标识”索引点索引点”的一个整数,就是定位索引点的值.由 fd=open(path,flag,mode);创建且获得.-1 创建失败 如果成功打开,将返回一个整数到 fd,这个 fd 就是用来定位索引点
14、的,或者说是用来描述,管理,操作被 打开的文件.更严格的说 用来定位操作结构”inode”.3 个已经定义的描述符(0,1,2).0 标准输入(控制台)(一般是键盘)1 标准输出(控制台)(一般是屏幕)2 标准错误输出 (使用“2文件名”可以将错误输出到一个文件)5/11 03:访问点访问点 用于操作数据或者设备的着力点,由于 linux 将设备也看做是文件,所以访问点一般情况下就是文件名.可以使用 open();(用于普通文件)函数 与 mknod();(用于设备文件创建),设备文件一般取名为设备名称,有时就将其叫做设备名称,本质是设备文件,也可以认为是:建立一个目录项和一个特殊文件的对建立
15、一个目录项和一个特殊文件的对应索引节点应索引节点.04:字符字符设备设备 面向字节操作的设备 05:主设备号主设备号,与次设备号与次设备号 设备从功能上来说是以类区分的,例如在一个 MCU 芯片中可能有 N 个串口,它们的功能基本上是一样 的,对它们的操作可以归为一类,这个类给它们取一个名字,叫做主设备号.但是对某一类设备的某个具体的设备进行操作时必须给出一个识别的名称,这个名称取名为次设备号.主设备号主设备号,次设备号次设备号=确定的一个设备确定的一个设备 主设备号与次设备号在老版本中为(0,255),注意是开区间.在 2.6 的版本中为主设备号占位 12 位(4*1024),次设备号占用位
16、 20 位(1M)定义如下定义如下:#define MINORBITS 20#define MAJOR(dev)(unsigned int)(dev)MINORBITS)#define MINOR(dev)(unsigned int)(dev)&MINORMASK)06:设备文件描述符设备文件描述符 与文件描述符一样与文件描述符一样,也是一个整数也是一个整数,从某种意义来说就是主设备号从某种意义来说就是主设备号,由用户对所使用的设备注册而获得.字符设备注册的函数在 2.6 中使用:int register_chrdev(unsigned int major,const char*name,st
17、ruct file_operations*fops);其中:major=申请的主设备号,Name=设备名称,Fops=操作该设备的一组函数,封装在 struct file_operations 中.所有的字符设备描述符都在一张表中.static struct device_struct chrdevsMAX_CHRDEV;struct device_struct const char*name;/设备名 struct file_operations*fops;/对该设备进行操作的结构(一组行为);07:系统调用系统调用 就是内核提供的一系列的函数。这些调用是在内核中实现的,系统调用是用户程序和
18、内核交互的接口,系统调用的实现在ARM中通过软件陷阱(实际是通过软件中断)来实现,系统调用是文件系统的 重要组成部分,所有的对设备的操作都是通过系统调用实现的.在 9260ARM 的 linux 2.6 版本中,所有可以使用的系统调用函数在 calls.S 文件中,共有 350 个函数,对这里可以明白所有系统调用的使用方法,因为有函数原型和函数本身.6/11 05:与设备驱动相关的几个函数与设备驱动相关的几个函数 01:打开或者创建普通文件打开或者创建普通文件 定义函数定义函数 int open(const char*pathname,int flags);int open(const cha
19、r*pathname,int flags,mode_t mode);第一个参数 pathname 指向欲打开的文件路径字符串 第二参数 flags 所能使用的标志:O_RDONLY 以只读方式打开文件 O_WRONLY 以只写方式打开文件 O_RDWR 以可读写方式打开文件。上述三种标志是互斥的,也就是不可同时使用,但可与下列的标志利用 OR(|)运算符组合。O_CREAT 若欲打开的文件不存在则自动建立该文件。O_EXCL 如果O_CREAT 也被设置,此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误。若O_CREAT与O_EXCL同时设置,并且欲打开的文件为符号
20、连接,则会打开文件失败。O_NOCTTY 如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。O_TRUNC 若文件存在并且以可写的方式打开时,此标志会令文件长度清为0,而原来存于该文件的资料也会消失。O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。O_NONBLOCK 以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返回进程之中。O_NDELAY 同O_NONBLOCK。O_SYNC 以同步的方式打开文件。O_NOFOLLOW 如果参数pathname 所指的文件为一符号连接,则会令打开文件失败。O_DIREC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 内核 模块 设备 驱动 _lyf
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内