




已阅读5页,还剩39页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
5.4内存管理,操作系统常用的内存管理方式:单一分配方式分区式分配方式页式分配方式段式分配方式Linux系统采用了虚拟内存管理机制,就是交换和请求分页存储管理技术,程序的链接和内存装入,连续分配方式,单一连续分配,这是最简单的一种存储管理方式,但只能用于单用户、单任务的操作系统中。采用这种存储管理方式时,可把内存分为系统区和用户区两部分,系统区仅提供给OS使用,通常是放在内存的低址部分;用户区是指除系统区以外的全部内存空间,提供给用户使用。,固定分区分配,1.划分分区的方法,分区大小相等,即使所有的内存分区大小相等。(2)分区大小不等。,2.内存分配,固定分区使用表,4.2.3动态分区分配,1.分区分配中的数据结构,空闲分区表。(2)空闲分区链。,空闲链结构,5.4.1请求分页机制1分页概念逻辑空间分页内存空间分页页面和内存块的大小是由硬件确定的逻辑地址表示内存分配原则页表,2请求分页的基本思想请求分页提供虚拟存储器在每一个页表项中增加一个状态位表示一个页面是否已装入内存块如果地址转换机构遇到一个具有N状态的页表项时,便产生一个缺页中断,3Linux的多级页表Linux进程的虚存空间Linux系统采用三级页表的方式,4内存页的分配与释放Linux系统采用两种方法来管理内存页:位图和链表页组中内存页的数量依次按2的倍数递增,5.4.2内存交换,内核的交换守护进程kswapd:有自己的进程控制块task_struct结构,它与其他进程一样受内核的调度。但是,它没有自己独立的地址空间,只使用系统空间,所以也把它称为线程。它的任务就是保证系统中有足够的空闲内存页。当系统启动时,交换守护进程由内核的init(初始化)进程启动。被定时唤醒。所做的工作主要分为两部分:将若干不常用的活跃内存页面变为不活跃状态;清理不活跃的“脏”页面,或者回收一些内存页,使之成为空闲的内存页。作为交换空间的交换文件实际就是普通文件,但它们所占的磁盘空间必须是连续的,7.5内存管理,#includevoid*malloc(size_tsize);#includevoid*calloc(size_tnmemb,size_tsize);#includevoid*realloc(void*ptr,size_tsize);#includevoidfree(void*ptr);,5.6设备管理5.6.1设备管理概述,所有设备都作为特别文件,从而在管理上就具有下列共性:(1)每个设备都对应文件系统中的一个索引节点,都有一个文件名。(2)应用程序通常可以通过系统调用open()打开设备文件,建立起与目标设备的连接。(3)对设备的使用类似于对文件的存取。(4)设备驱动程序是系统内核的一部分,它们必须为系统内核或者它们的子系统提供标准的接口。(5)设备驱动程序利用一些标准的内核服务,如内存分配等。另外,大多数Linux设备驱动程序都可以在需要时装入内核,不需要时卸载下来。,设备驱动的分层结构,5.6.2设备驱动程序和内核之间的接口,1可安装模块可安装模块是可以在系统运行时动态地安装和拆卸的内核模块,即经过编译但尚未连接的目标文件(后缀为.o)。设备驱动程序或者与设备驱动紧密相关的部分(如文件系统)都是利用可安装模块实现的。在通常情况下,用户利用系统提供的插入模块工具和移走模块工具来装卸可安装模块。,2字符设备用户对字符设备的使用就和存取普通文件一样。在应用程序中使用标准的系统调用来打开、关闭、读写字符设备。,3块设备对块设备的存取与对文件的存取方式一样,其实现机制也与字符设备使用的机制相同。,设备驱动与文件系统的关系,设备驱动是Linux内核的重要组成部分。驱动程序跟一般的用户应用程序不同,它工作在内核态,编程方法和使用的库函数都跟用户级的应用程序有所区别。在Linux内核中,设备驱动跟文件系统联系紧密。每一个设备都是作为一个设备文件,交给文件系统去管理的。设备驱动程序内部是由一组函数组成的。函数由设备驱动的上层文件系统来调用,每一个函数被称做一个入口点。入口点的集合被称为设备驱动程序的上半部分,实现设备驱动与文件系统的接口。常用的入口点有:open、close(或release)、read、write、ioctl等。每一个函数的内部实现被称作驱动程序的下半部分,负责实现具体的设备操作。函数的内部实现通常是靠系统调用提供的函数实现的,不能使用平常我们使用的用户级的C语言库函数。,Linux通过设备号来区分不同的设备。设备号由两部分组成:主设备号MAJOR和次设备号MINOR。主设备号MAJOR指明对应哪些设备驱动。一般一个主设备号对应一个驱动程序。次设备号MINOR用来区分同一个驱动程序控制下的不同的独立的设备。例如:硬盘的主设备名称为hd。在/dev目录下hd即为硬盘。/dev/hda、/dev/hdb等是系统的第一个硬盘和第二个硬盘。而hda0和hda1分别是第一个硬盘上的第一个分区和第二个分区。/proc/devices列出所有现在正在使用的设备号。,设备号,Linux操作系统将所有的设备全部看成文件,并通过文件的操作界面进行操作,用户程序可以像对其他文件一样对此设备文件进行操作。这意味着:由于每一个设备至少由文件系统的一个文件代表,因而都有一个“文件名”。应用程序通常可以通过系统调用open()打开设备文件,建立起与目标设备的连接。打开了代表着目标设备的文件,即建立起与设备的连接后,可以通过read()、write()、ioctl()等常规的文件操作对目标设备进行操作。设备文件的属性由三部分信息组成:第一部分是文件的类型,第二部分是一个主设备号,第三部分是一个次设备号。其中类型和主设备号结合在一起惟一地确定了设备文件驱动程序及其界面,而次设备号则说明目标设备是同类设备中的第几个。,设备文件,设备文件不能用普通的办法建立。要通过mknod命令。mknod命令的语法:mknod路径模式主设备号次设备号模式有两种:c为字符设备b为块设备例如:mknod/dev/testc2540设备文件可以象普通文件一样直接使用,例如:/dev/lp0为一个打印机,使用catdoc.txt/dev/lp0就可以将文档交给打印机去进行打印/dev/ttyS0为主机上的串口COM1,使用读写文件的方法,也可以实现对串口的读写操作,设备文件,一、设备驱动中的关键数据结构二、驱动程序框架三、实现各种功能的基本函数四、实例,设备驱动基础,要编写设备驱动程序,就要实现它跟高层文件系统和底层硬件之间的操作接口。这些接口一般要遵循DDI/DKI(Device-DriverInterface/Device-KernelInterface)接口规范,所以要使用一些标准的数据结构来进行操作。底层硬件的操作主要由不同硬件的特性来决定。跟文件系统的接口主要使用三个数据结构:inode文件索引节点结构structfile文件结构file_operations文件操作结构,设备驱动程序要实现这个结构里的主要操作,一、设备驱动中的关键数据结构,structinode称做索引节点数据结构,定义如下:structinodestructlist_headi_hash;structlist_headi_list;structlist_headi_dentry;structlist_headi_dirty_buffers;structlist_headi_dirty_data_buffers;unsignedlongi_ino;atomic_ti_count;kdev_ti_dev;umode_ti_mode;nlink_ti_nlink;uid_ti_uid;gid_ti_gid;kdev_ti_rdev;loff_ti_size;time_ti_atime;time_ti_mtime;time_ti_ctime;unsignedinti_blkbits;unsignedlongi_blksize;unsignedlongi_blocks;unsignedlongi_version;structsemaphorei_sem;structsemaphorei_zombie;structinode_operations*i_op;structfile_operations*i_fop;/文件操作指针structsuper_block*i_sb;wait_queue_head_ti_wait;structfile_lock*i_flock;structaddress_space*i_mapping;structaddress_spacei_data;structdquot*i_dquotMAXQUOTAS;structlist_headi_devices;structpipe_inode_info*i_pipe;structblock_device*i_bdev;/块设备structchar_device*i_cdev;/字符设备unsignedlongi_dnotify_mask;structdnotify_struct*i_dnotify;unsignedlongi_state;unsignedinti_flags;unsignedchari_sock;atomic_ti_writecount;unsignedinti_attr_flags;,_u32i_generation;unionstructminix_inode_infominix_i;structext2_inode_infoext2_i;structext3_inode_infoext3_i;structhpfs_inode_infohpfs_i;structntfs_inode_infontfs_i;structmsdos_inode_infomsdos_i;structumsdos_inode_infoumsdos_i;structiso_inode_infoisofs_i;structnfs_inode_infonfs_i;structsysv_inode_infosysv_i;structaffs_inode_infoaffs_i;structufs_inode_infoufs_i;structefs_inode_infoefs_i;structromfs_inode_inforomfs_i;structshmem_inode_infoshmem_i;structcoda_inode_infocoda_i;structsmb_inode_infosmbfs_i;structhfs_inode_infohfs_i;structadfs_inode_infoadfs_i;structqnx4_inode_infoqnx4_i;structreiserfs_inode_inforeiserfs_i;structbfs_inode_infobfs_i;structudf_inode_infoudf_i;structncp_inode_infoncpfs_i;structproc_inode_infoproc_i;structsocketsocket_i;structusbdev_inode_infousbdev_i;structjffs2_inode_infojffs2_i;void*generic_ip;u;,structfile主要用于与文件系统相关的设备驱动程序,可提供关于被打开的文件的信息,定义如下:structfilestructlist_headf_list;structdentry*f_dentry;structvfsmount*f_vfsmnt;structfile_operations*f_op;atomic_tf_count;unsignedintf_flags;mode_tf_mode;loff_tf_pos;unsignedlongf_reada,f_ramax,f_raend,f_ralen,f_rawin;structfown_structf_owner;unsignedintf_uid,f_gid;intf_error;unsignedlongf_version;/*neededforttydriver,andmaybeothers*/void*private_data;/*preallocatedhelperkiobuftospeedupO_DIRECT*/structkiobuf*f_iobuf;longf_iobuf_lock;,structfile_operationsstructmodule*owner;loff_t(*llseek)(structfile*,loff_t,int);ssize_t(*read)(structfile*,char*,size_t,loff_t*);ssize_t(*write)(structfile*,constchar*,size_t,loff_t*);int(*readdir)(structfile*,void*,filldir_t);unsignedint(*poll)(structfile*,structpoll_table_struct*);int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);int(*mmap)(structfile*,structvm_area_struct*);int(*open)(structinode*,structfile*);int(*flush)(structfile*);int(*release)(structinode*,structfile*);int(*fsync)(structfile*,structdentry*,intdatasync);int(*fasync)(int,structfile*,int);int(*lock)(structfile*,int,structfile_lock*);ssize_t(*readv)(structfile*,conststructiovec*,unsignedlong,loff_t*);ssize_t(*writev)(structfile*,conststructiovec*,unsignedlong,loff_t*);ssize_t(*sendpage)(structfile*,structpage*,int,size_t,loff_t*,int);unsignedlong(*get_unmapped_area)(structfile*,unsignedlong,unsignedlong,unsignedlong,unsignedlong);在用户自己的驱动程序中,首先要根据驱动程序的功能,完成file_operations结构中函数的实现。不需要的函数接口可以直接在file_operations结构中初始化为NULL。file_operations中的变量会在驱动程序初始化时,注册到系统内部。每个进程对设备的操作,都会根据主次设备号,转换成对file_operations结构的访问。在设备驱动中,如果有需要的操作而本结构中没有提供的,统统交给ioctl函数实现,Linux的设备驱动程序与外部的接口可以分为三部分:驱动程序与内核的接口:通过file_operations来完成驱动程序与系统引导的接口:利用驱动程序对设备初始化驱动程序与设备的接口:描述了驱动程序如何与设备进行交互,这部分与具体设备密切相关驱动程序的代码可以分成以下几个部分:驱动程序的注册和注销;设备的打开和释放;设备的读写;设备的控制;设备的中断和查询。,二、设备驱动程序框架,1.驱动程序的注册和注销:驱动程序一般通过注册的方式将自己的函数操作集与具体的设备关联起来。所以,在设备初始化时,应向系统进行登记register。卸载设备的时候用unregister注销。字符设备和块设备的注册和注销并不相同。字符设备的注册函数是:intregister_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops)卸载函数是:intunregister_chrdev(unsignedintmajor,constchar*name),三、实现各部分需要的基本函数,Linux对字符设备的管理是通过一个字符设备表chrdevs来实现的。表里的每一项是一个device_struct结构。structdevice_structconstchar*name;structfile_operations*fops;chrdevs的数组下标就是字符设备的主设备号major。要查看系统中这个表格的当前内容,看/proc/devices即可。,字符设备表,字符设备的注册:向chrdevs中增加一个新项。intregister_chrdev(intmajor,char*name,structfile_operations*fops)major为申请的主设备号,为0时,自动寻找一个空闲号分配。name为设备的名字。fops为驱动程序中file_operations结构的指针。注册成功时,返回申请到的主设备号。出错时返回一个负值。字符设备的注销:voidunregister_chrdev(intmajor,char*name),字符设备表,2.设备读写:设备读写是实现用户空间和内核空间的数据交换,因此涉及内存操作。设备驱动程序在申请和释放内存时,因为使用的是内核空间,不能调用用户空间的函数malloc和free,而代之以调用kmalloc和kfree,它们在linux/kernel.h中被定义为:void*kmalloc(unsignedintlen,intpriority);voidkfree(void*obj);参数len为希望申请的字节数,obj为要释放的内存指针。priority为分配内存操作的优先级,即在没有足够空闲内存时如何操作,一般由取值GFP_KERNEL解决即可。,三、实现各部分需要的基本函数,2.设备读写:设备读写是实现用户空间和内核空间的数据交换,因此涉及内存操作。内存间数据的传送:unsignedlongcopy_to_user(void*to,void*from,longcount);unsignedlongcopy_from_user(void*to,void*from,longcount);以上两个函数的原型在,三、实现各部分需要的基本函数,3.设备控制:对设备的控制是通过对I/O端口的读写来实现的。inlineunsignedintinb(unsignedshortport);inlineunsignedintinb_p(unsignedshortport);/读端口inlinevoidoutb(charvalue,unsignedshortport);inlinevoidoutb_p(charvalue,unsignedshortport);/写端口int_check_region(structresource*parent,unsignedlongstart,unsignedlongn);/检查一个区域的端口structresource*_request_region(structresource*parent,unsignedlongstart,unsignedlongn,constchar*name);/申请一个区域的端口void_release_region(structresource*parent,unsignedlongstart,unsignedlongn);/释放一个区域的端口,三、实现各部分需要的基本函数,3.设备控制:对设备的控制接口通过ioctl函数来实现。它就象个大杂物箱,把跟设备有关的各种操作都装在这里。例如:一个LCD的驱动,要实现清屏LCD_Clear、显示矩形Disp_Rect、画线Draw_Line等功能。voidLCD_Clear()voidDisp_Rect()voidDraw_Linestaticint*_ioctl(structinode*inode,structfile*file,intcmd,longarg)switch(cmd)case:CLEARLCD_Clear();case:RECTDisp_Rect();case:LINEDraw_Line();,三、实现各部分需要的基本函数,编写一个test.c,虽然它基本上什么也不干,但是它体现了一个字符设备驱动程序的基本框架:#define_NO_VERSION_#include#include#include#include#include#include#include#include#include#includeunsignedinttest_major=0;/用一个静态变量存储设备号,四、一个简单的字符设备驱动程序,read和write的实现:staticsszie_tread_test(structfile*file,char*buf,size_tcount,loff_t*fops)copy_to_user(*buf,*file,count);staticsszie_twrite_test(structfile*file,char*buf,size_tcount,loff_t*fops)copy_from_user(*file,*buf,count);,二、一个简单的字符设备驱动程序,open和release的实现:staticintopen_test(structinode*inode,structfile*file)MOD_INC_USE_COUNT;return0;staticintrelease_test(structinode*inode,structfile*file)MOD_DEC_USE_COUNT;return0;,二、一个简单的字符设备驱动程序,file_operations的实现:structconststructfile_operationstest_fops=.read=read_test,.write=write_test,.open=open_test,.release=release_test;通过这个结构,将本程序的几个函数集成在这个结构里,注册到字符设备表里去。如果有ioctl函数,则驱动程序里就可以写更丰富的函数了。,二、一个简单的字符设备驱动程序,注册和注销:intinit_m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年化学工艺专业笔试宝典模拟题与答案详解版
- 2025年广告文案设计师职业资格考试试题及答案解析
- 2025年承包商安全知识培训题集及答案
- 2025年通信专业招聘笔试高频题库
- 2025年安徽安全员实操题库
- 2025年县级档案馆招聘面试题库大全
- 学前班bpmf教学课件
- 2025年宠物店店长面试模拟题集锦
- 2025年消防干部招录笔试模拟试卷解析
- 课件《两小儿辩日》
- 中枢神经系统药理学概论课件
- DB65-T 4773-2024 生物安全实验室消毒技术指南
- 成人体外膜氧合辅助期间感染防控专家共识2024版
- 2024年河北石家庄市井陉矿区人力资源和社会保障局公益性岗位招聘100人历年(高频重点提升专题训练)共500题附带答案详解
- 优化方案语文必修上册
- 云南省大中型水电站情况表
- 旅游景区规划设计方案
- 高中历史知识竞赛省公开课一等奖全国示范课微课金奖课件
- DL-T 5117-2021水下不分散混凝土试验规程-PDF解密
- 铁路专用线设计规范(试行)(TB 10638-2019)
- 国家药政法规培训
评论
0/150
提交评论