《嵌入式Linux内核详细设计31355.docx》由会员分享,可在线阅读,更多相关《嵌入式Linux内核详细设计31355.docx(91页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、嵌入式LLinuxx内核详细细设计说明明书拟制: 校对对: 审核核: 湖南计算机机股份有限限公司嵌入式系统统研究所2001.5目录1. 引言言21.1 参参考资料21.2 术术语和缩写写词22. 设计计概览52.1 设设计的驱动动因素以及及各自重要要性的排序序(例如,功功能、性能能、可靠性性、硬件、内内存考虑等等等)52.2 不不同设计方方案的评价价52.3 对对所选设计计方案总体体结构图示示及讨论52.4 开开发环境(如如开发语言言、硬件、外外设等等)63. 设计计描述73.1 全全局数据结结构73.2 进进程调度子子系统253.2.11 模块功功能概览253.2.22 详细输输入、输出出及
2、处理描描述253.3 内内存管理子子系统313.3.11 模块功功能概览313.3.22 详细输输入、输出出及处理描描述313.4 虚虚拟文件子子系统343.4.11 模块功功能概览343.4.22 详细输输入、输出出及处理描描述343.5 进进程间通信信(IPCC)子系统统513.5.11 模块功功能概览513.5.22 详细输输入、输出出及处理描描述513.6 网网络模块(NET)子系统603.6.11 模块功功能概览603.6.22 详细输输入、输出出及处理描描述601. 引言言1.1 参参考资料无1.2 术术语和缩写写词Argumment 参数,函函数和例程程中可以带带入参数进进行处理
3、。ARP 地址转换换协议。被被用来将IIP地址转转换成物理理硬件地址址,如网卡卡地址。AARP是TTCP/IIP协议族族中一个非非常重要的的协议。 Asciii Asciii代表着着Amerricann Staandarrd Coode ffor IInforrmatiion IInterrchannge. 字母表中中的每个字字母代表一一个8位的的编码。AAsciii被用来存存储”可写“的字符。 Bit 值域为0或或1的一个个二进制数数据位。Bottoom Haalf HHandller 核核心里在队队列中的任任务的句柄柄或指针。 Byte 字节,8位位数据。 C 一种高级级编程语言言,Lin
4、nux基本本上是用CC编写的。CPU Centtral Proccessiing UUnit(中央处理理单元)。Data Struucturre 数据结构构。Devicce Drriverr 设备驱动动程序。用用来控制一一个特定设设备类的软软件。例如如,NCRR 8100设备驱动动程序控制制NCR 810 SCSII 设备。DMA Direect MMemorry Acccesss(直接内内存存取)ELF Execcutabble aand LLinkaable Formmat(可可执行与可可连接格式式). EIDE 扩展IDEE. Execuutablle immage 可执行行映象。一一个
5、含有指指令和数据据的文件。可可以被调进进虚拟内存存而执行。 Functtion 函数IDE Inteegratted DDisk Elecctronnics. Imagee 参阅可执执行映象。IP Inteernett Prootocool(网际际协议). IPC Inteerproocesss Commmuniictioon(进程程间通讯) Interrfacee 接口。接接口是一个个抽象的概概念。实现现中,通常常指一些函函数或例程程接口。IRQ Inteerruppt Reequesst Quueue(中断申请请队列). ISA Induustryy Staandarrd Arrchitt
6、ectuure. Thiss is a sttandaard, althhoughh noww ratther dateed, ddata bus inteerfacce foor syystemm commponeents suchh as flopppy ddisk drivvers. Kerneel Moodulee 一个可以以动态地被被装载的核核心部份,如如文件系统统和设备驱驱动序。Kilobbyte 10244字节。Megabbyte 一兆字节节或10224K字节节。Microoproccessoor 微处理器器。Modulle 模块。一一个含有指指令的文件件。Objecct fii
7、le 目标文件件。或*.o文件。指指一个含有有指令和数数据的文件件。但这个个文件尚未未与其所需需要的其他他目标文件件或库相连连接以形成成一个可执执行文件。 Page 物理内存存被分成许许多同样大大小的页面面。是虚拟拟内存管理理调度的最最小单位。 Pointter 指针Proceess 进程。一一个正在执执行的程序序。Proceessorr 处理器的的简称。PCI Periipherral CCompoonentt Inttercoonnecct. 一个外设设总线。Perippheraal 外围设备备Progrram 程序。Protoocol 协议。通通常指两个个实体间“对对话”的一一种事先格格
8、式约定。Regisster 寄存器Routiine 例程。与与函数类似似,除了不不返回值。 SCSI Smalll Coomputter SSysteems IInterrfacee(小型计计算机接口口). Shelll commmand shelll。Liinux 缺省用的的是bassh shhell. SMP Symmmetriical multtiproocesssing. Sysstemss(对称多多处理系统统)。Sockeet 一个soccket代代表着一个个网络连接接。Linnux支持持BSD Sockket 接接口。Softwware 软件Systeem V Unixx的一个版版
9、本,发布布于19883。这个个版本中,引引进了著名名的士Syystemm V IIPC机制制。TCP Trannsmisssionn Conntroll Prootocool(传输输控制协议议). Task Queuue 任务队列列UDP Userr Dattagraam Prrotoccol(用用户数据报报协议). Virtuual mmemorry 虚拟内存存2. 设计计概览2.1 设设计的驱动动因素以及及各自重要要性的排序序(例如,功能、性性能、可靠靠性、硬件件、内存考考虑等等)在设计过程程中,主要要要考虑的的有以下几几点:跨平平台的可移移植性,在在保证功能能和不牺牲牲性能的前前提下尽量
10、量减小核心心的体积,为为今后进一一步开发留留下空间和和便利。其其中,最主主要的就是是可移植性性,这是这这个嵌入式式系统的特特色。减少少核心的体体积可以降降低成本,但但是随着当当今硬件生生产技术的的提高完善善,这一点点已经不像像过去那样样重要了,所所以在裁剪剪核心的同同时要避免免牺牲性能能和功能。2.2 不不同设计方方案的评价价内核采用用层次式结结构。这样样的结构似似乎层次清清晰,易于于修改。但但是它严重重降低了内内核的效率率。因为当当高层次的的函数调用用底层提供供的功能时时,可能需需要跨越几几个层次,这这样会增加加系统开销销。而且,在在系统核心心中,各个个部分互相相提供功能能调用,如如果严格按
11、按照层次式式结构组织织将打破核核心中各个个功能部分分的有机结结构,使结结构变的混混乱。内核采用用整体式结结构。这样样的结构的的特点是这这个内核由由许多过程程组成,但但是不像在在层次式结结构中那样样,每个过过程只能被被紧挨着它它的上层调调用。在整整体式结构构中,每个个过程独立立编译后,连连接程序将将其连接成成为一个单单独的目标标程序,每每个过程都都对其它过过程可见。这这样的结构构虽然在内内部关系上上确实变的的复杂了(各各个模块间间是网状的的结构),但但是在调用用关系和提提供服务的的角度来看看变的简单单清晰也更更直观了,子子系统间易易于访问,内内核工作效效率较高。而而且也有助助于不同的的人参与不不
12、同过程的的开发。所以对内内核的组织织采用整体体式结构。2.3 对对所选设计计方案总体体结构图示示及讨论内核由55个主要的的子系统组组成,它们们之间的大大致依赖关关系如图。FS:文件件系统IPC:进进程间通信信MM:内存存管理NET:网网络模块SCHEDD:进程调调度进程调度度子系统处处于核心地地位,其它它子系统要要完成操作作都需要它它来调度以以占用系统统资源完成成自己的操操作。文件件系统需要要利用网络络模块支持持网络文件件系统,也也需要利用用内存管理理支持RAAMDISSK设备。内内存管理利利用文件系系统支持交交换,交换换进程定期期的由调度度程序调度度,这也是是内存管理理依赖于进进程调度的的原
13、因。进进程间通信信子系统要要依赖内存存管理支持持共享内存存通信机制制。进程调调度子系统统需要内存存管理的支支持来完成成创建进程程等操作。2.4 开开发环境(如如开发语言言、硬件、外外设等等)内核由GNNU CC语言及汇汇编语言开开发。硬件件平台是ii386嵌嵌入式平台台。所支持持的外设诸诸如标准PPC的外设设,和一些些基本的嵌嵌入式系统统的硬件设设备。如网网络设备,显显示设备,外外存,音频频设备,视视频设备等等。3. 设计计描述3.1 全全局数据结结构全局数据结结构的描述述。blockk_devv_strruct 数据结构构用来登记记块设备以以被缓冲区区使用。strucct bllk_deev
14、_sttructt void (*reequesst_fnn)(vooid); strruct requuest * curreent_rrequeest;strucct reequesst pllug; strucct tqq_strruct plugg_tq; ;buffeer_heead 数据结构构用来存放放缓冲区中中的一个数数据块的信信息。 /* bhh staate bbits */ #defiine BBH_Upptodaate 00 /* 1 缓缓冲区里有有数据*/ #defiine BBH_Diirty 1 /* 1 缓缓冲区脏 */#defiine BBH_Loock 22
15、/* 1 缓冲冲区被锁 */ #defiine BBH_Reeq 3 /* 0 缓冲冲区无效 */ #defiine BBH_Tooucheed 4 /* 1 缓缓冲区被重重复访问 */ #defiine BBH_Haas_agged 55 /* 1 缓缓冲区过时时 */ #defiine BBH_Prroteccted 6 /* 1 缓冲区处处于保护状状态 */ #defiine BBH_FrreeOnnIO 77 /* 1 IIO后丢弃弃缓冲区头头部 */ strucct buufferr_heaad /* Firsst caache linee: */ unsiggned longg b
16、_bblockknr; /* 块数目 */ kdev_t b_dev; /* 设备 (B_FRREE = freee) */ kdev_t b_rdevv; /* 真实设设备 */ unsiggned longg b_rrsecttor; /* 磁磁盘上的真真是缓冲区区*/ strucct buufferr_heaad *bb_nexxt; /* 信号号队列列表表 */ strucct buufferr_heaad *bb_thiis_paage; /* 一一页内的缓缓冲区循环环列表 */ /* Seecondd cacche lline: */ unsiggned longg b_sstat
17、ee; /* 缓冲区区状态掩码码 */ strucct buufferr_heaad *bb_nexxt_frree; unsiggned int b_coount; /* 用户使用用此块 */ unsiggned longg b_ssize; /* 块大小 */ /* Noon-peerforrmancce-crriticcal ddata folllows. */ char *b_ddata; /* 数据块指指针 */ unsiggned int b_liist; /* 缓缓冲区发布布表 */ unsiggned longg b_fflushhtimee; /* 脏缓冲冲区被重写写时间 *
18、/ unsiggned longg b_llru_ttime; /* 缓冲区上上次被使用用时间 */ strucct waait_qqueuee *b_waitt; strucct buufferr_heaad *bb_preev; /* 双重重连接的哈哈希表 */ strucct buufferr_heaad *bb_preev_frree; /* 双双重连接的的缓冲区*/ strucct buufferr_heaad *bb_reqqnextt; /* 请求队队列 */ ; devicce 系统中每每一个网络络设备都对对应于一个个设备数据据结构。 strucct deevicee /*这这
19、里是这个个结构的可可见部分的的第一部分分 ( 就像用户户在文件SSpacee.c中看看到的一样样 ).这是它的名名称和接口口. */ char *namme; /* I/O sppeciffic ffieldds */ unsiggned longg rmeem_ennd; unsiggned longg rmeem_sttart; unsiggned longg memm_endd; /* 共享内内存结束 */ unsiggned longg memm_staart; /* 共共享内存起起始 */ unsiggned longg basse_adddr; /* 设设备IO地地址 */ uns
20、iggned charr irqq; /* devvice IRQ numbber */ /* Loow-leevel stattus fflagss. */ volattile unsiignedd chaar sttart, /* 开始一个个操作 */ interrruptt; /* 中断到到达 */ unsiggned longg tbuusy; /* 传传送忙 */ strucct deevicee *neext; /* 设设备初始化化,只被调调用一次 */ int (*iniit)(sstrucct deevicee *deev); /* 有些些设备还需需要下面这这些字段, 但是它它
21、们不是在在文件 SSpacee.c中通通常的设置置项. */ unsiggned charr if_portt; /* 可选择择的 AUUI,TPP, */ unsiggned charr dmaa; /* DMAA 通道 */ strucct ennet_sstatiisticcs* (*gett_staats)(struuct ddevicce *ddev); /* 标标记了结构构的可见部部分的结束束部分. 这后面的所所有字段是是系统内部部的,可以以被随意改改动 */ /* 这些些可能为将将来的远程程关机代码码使用 */ unsiggned longg traans_sstartt; /*
22、 最后一一次传送的的时间 */ unsiggned longg lasst_rxx; /* 最后RRx的时间间 */ unsiggned shorrt fllags; /* 接口标记记 (BSSD)*/ unsiggned shorrt faamilyy; /* 地址族族 ID */ unsiggned shorrt meetricc; /* 路由距距离 */ unsiggned shorrt mttu; /* MTTU 值 */ unsiggned shorrt tyype; /* 硬硬件类型 */ unsiggned shorrt haard_hheadeer_leen; /* 硬件件地址
23、长度度 */ void *priiv; /* 私有有数据 */* 接口口地址信息息. */ unsiggned charr brooadcaastMMAX_AADDR_LEN; unsiggned charr padd; unsiggned charr devv_adddrMAAX_ADDDR_LLEN; unsiggned charr adddr_leen; /* 硬件件地址长度度 */ unsiggned longg pa_addrr; /* 协议地地址 */ unsiggned longg pa_brdaaddr; /* 协议广播播地址*/ unsiggned longg pa_dsta
24、addr; /* PP协协议另一端端地址*/ unsiggned longg pa_maskk; /* 协议网网络掩码 */ unsiggned shorrt paa_aleen; /* 协议议地址长度度 */ strucct deev_mcc_lisst *mmc_liist; /* MMac广播播地址 */ int mmc_coount; /* 已安装的的Mac编编号 */ strucct ipp_mc_listt *ipp_mc_listt; /* IPMac链链 */ _u322 tx_queuue_leen; /* 每个个队列的最最大帧长度度 */* Foor looad bbala
25、nncingg driiver pairr suppportt */ unsiggned longg pktt_queeue; /* 包包队列 */ strucct deevicee *sllave; /* 附属设备备 */ strucct neet_allias_infoo *allias_infoo; /* 主设备备别名信息息 */ strucct neet_allias *my_aliaas; /* 别名名设备 */ /* Poointeer too thee intterfaace bbuffeers. */ strucct skk_bufff_heead bbuffssDEVV_NU
26、MMBUFFFS; /* Poointeers tto innterfface servvice routtiness. */ int (*opeen)(sstrucct deevicee *deev); int (*stoop)(sstrucct deevicee *deev); int (*harrd_sttart_xmitt) (sstrucct skk_bufff *sskb, struuct ddevicce *ddev); int (*harrd_heeaderr) (sstrucct skk_bufff *sskb, strucct deevicee *deev, unsiggn
27、ed shorrt tyype, void *dadddr, voidd *saaddr,unsiggned len); int (*reebuilld_heeaderr)(vooid *eth, strruct deviice *dev, unsiggned longg radddr, strucct skk_bufff *sskb); void (*seet_muulticcast_listt)(sttructt devvice *devv); int (*sett_macc_adddresss)(sttructt devvice *devv, void *adddr); int (*do
28、_iocttl)(sstrucct deevicee *deev, strucct iffreq *ifrr, innt cmmd);int (*sett_connfig)(strruct deviice *dev, strucct iffmap *mapp); void (*heeaderr_cacche_bbind)(strruct hh_ccachee *hhhp, strucct deevicee *deev, unsiignedd shoort hhtypee, _u332 daaddr); void (*heeaderr_cacche_uupdatte)(sstrucct hhh_
29、cacche *hh, strucct deevicee *deev, unsiggned charr * hhaddrr); int (*chaange_mtu)(strruct deviice *dev, int nnew_mmtu); strucct iww_staatisttics* (*gget_wwirelless_statts)(sstrucct deevicee *deev); ;devicce_sttructt 数据结构构用来登记记字符和块块设备(含含有相应的的名字和对对此设备的的文件操作作集)。每每一个chhrdevvs 和 blkddevs向向量的入口口对应一个个字符或块
30、块设备。strucct deevicee_strruct constt chaar * namee; strucct * fopps; ;file 每个打开开的文件, socket 接口都对应一个文件数据结构。 strucct fiile mode_t f_modee; loff_t f_pos; unsiggned shorrt f_flaggs;unsiggned shorrt f_counnt; unsiggned longg f_rreadaa, f_ramaax, ff_raeend, f_raalen, f_rrawinn; strucct fiile *f_neext, *f_p
31、prev; int ff_ownner; /* 将将发送的SSIGIOO的用户标标示和组标标示 */ strucct innode * f_inodde; strucct * f_oop; unsiggned longg f_vversiion; void *priivatee_datta; /* 为ttty或其其它设备需需要 */ ; 数据结结构描述一一个正被打打开的文件件。 strucct intt couunt;fd_seet cllose_on_eexec; fd_seet oppen_ffds; strucct fiile * fdNR_OOPEN; ; fs_sttructt st
32、rucct fss_strruct int ccountt; unsiggned shorrt ummask; strucct innode * rooot, * pwwd; ;gendiisk ggendiisk 数数据结构含含有一个硬硬盘的信息息。当系统统初始化,发发现硬盘和和检测分区区参数时,此此结构被填填充。 strucct hdd_strruct lonng sttart_sectt; lonng nrr_seccts; ; strucct geendissk intt majjor; /* 设设备主编号号 */ constt chaar *mmajorr_namme; /* 主设设
33、备名 */int mminorr_shiift; /* nnumbeer off timmes mminorr is shiffted to gget rreal minoor */ int mmax_pp; /* 每个设设备的最大大分区数 */ int mmax_nnr; /* 真实实设备的最最大个数 */ void (*innit)(struuct ggendiisk *); /* 工作作前先初始始化 */ strucct hdd_strruct *parrt; /* 分区区表 */ int *sizees; /* 以块块计数的设设备大小, 拷贝进进blk_sizee */ int nnr
34、_reeal; /* 真真实设备个个数 */ void *reaal_deevicees; /* 内部部使用 */ strucct geendissk *nnext; ; inodee数据结构构包含一个个磁盘中的的文件或目目录的信息息。strucct innode kdeev_t i_deev; unsiggned longg i_iino; umodee_t ii_modde; nlinkk_t ii_nliink; uid_tt i_uuid; gid_tt i_ggid; kdev_t i_rdevv; off_tt i_ssize;time_t i_atimme; time_t i_m
35、timme; time_t i_ctimme; unsiggned longg i_bblksiize; unsiggned longg i_bblockks; unsiggned longg i_vversiion; unsiggned longg i_nnrpagges; strucct seemaphhore i_seem; strucct innode_operratioons *i_opp; strucct suuper_blocck *ii_sb; strucct waait_qqueuee *i_waitt; strucct *i_fllock; strucct vmm_aree
36、a_sttructt *i_mmapp; strucct paage *i_paages; strucct dqquot *i_ddquottMAXXQUOTTAS; strucct innode *i_nnext, *i_prevv; strucct innode *i_hhash_nextt, *ii_hassh_prrev; strucct innode *i_bboundd_to, *i_bounnd_byy; strucct innode *i_mmountt; unsiggned shorrt i_counnt; unsiggned shorrt i_flaggs; unsiggn
37、ed charr i_llock; unsiggned charr i_ddirt; unsiggned charr i_ppipe; unsiggned charr i_ssock; unsiggned charr i_sseek; unsiggned charr i_uupdatte; unsiggned shorrt i_writtecouunt; unionn strruct pipee_inoode_iinfo pipee_i; strucct miinix_inodde_innfo mminixx_i; strucct exxt_innode_infoo extt_i; struc
38、ct exxt2_iinodee_inffo exxt2_ii; strucct hppfs_iinodee_inffo hppfs_ii; strucct mssdos_inodde_innfo mmsdoss_i; strucct ummsdoss_inoode_iinfo umsddos_ii; strucct isso_innode_infoo isoofs_ii; strucct nffs_innode_infoo nfss_i; strucct xiiafs_inodde_innfo xxiafss_i; strucct syysv_iinodee_inffo syysv_ii;
39、strucct afffs_iinodee_inffo afffs_ii; strucct uffs_innode_infoo ufss_i; struuct sockeet soockett_i; void *gennericc_ip; uu; ;fipc_permm ipcc_perrm 结构描述述了一个 Systtem VV IPCC 对象的的存取权限限。.strucct ippc_peerm keyy_t kkey; ushorrt uiid; /* 所有有者的用户户编号和组组编号 */ ushorrt giid; uushorrt cuuid; /* 创创建者的用用户编号和和组编号
40、*/ ushorrt cggid; ushoort mmode; /* 访问方式式 */ ushorrt seeq; /* 序列列号 */ ; irqacctionn 结构用来来描述系统统的中断句句柄。 strucct irrqacttion voiid (*handdler)(intt, vooid *, sttructt pt_regss *); unsiggned longg flaags; unsiggned longg massk; constt chaar *nname; void *devv_id; strucct irrqacttion *nexxt; ; linuxx_bin
41、nfmt 每个Linnux 可可以理解的的二进制文文件格式对对应一个llinuxx_binnfmt 数据结构构。 sttructt linnux_bbinfmmt strruct linuux_biinfmtt * nnext; long *usee_couunt; int (*loaad_biinaryy)(sttructt linnux_bbinprrm *, strruct pt_rregs * reegs); int (*loaad_shhlib)(intt fd);int (*corre_duump)(longg siggnr, strucct ptt_reggs * regss);
42、 ;mem_mmap_tt数据结构构(或叫做做页面) 用来存放放每个物理理内存页面面的信息。 typeddef sstrucct paage /* thesse muust bbe fiirst (freee arrea hhandlling) */ strucct paage *nextt; strucct paage *prevv; strucct innode *inoode; unsiggned longg offfset;strucct paage *nextt_hassh; atomiic_t counnt; unsiggned flaggs; /* attomicc flaags
43、, somee posssiblly uppdateed assynchhronoouslyy */ unsiggned dirtty:166, agge:8; strucct waait_qqueuee *waait; strucct paage *prevv_hassh; strucct buufferr_heaad *bbuffeers; unsiggned longg s; unsiggned longg mapp_nr; /* pagee->t;mapp_nr = ppage - meem_maap */ mmem_mmap_tt; mm_sttructt 用来描述述一个任务务活一个进进程的虚拟拟内存空间间。 strucct mmm_strruct intt couunt; pgd_tt * ppgd; unsiggned longg conntextt; unsiggned longg staart_ccode, endd_codde, sstartt_datta, eend_ddata; unsiggned longg staart_bbrk, brk, staart_sstackk, sttart_mmapp; unsiggned longg argg_staart, arg_end, envv_staart, env_end; uns