嵌入式Linux内核详细设计.docx

上传人:夺命阿水 文档编号:434869 上传时间:2023-06-14 格式:DOCX 页数:58 大小:226.16KB
返回 下载 相关 举报
嵌入式Linux内核详细设计.docx_第1页
第1页 / 共58页
嵌入式Linux内核详细设计.docx_第2页
第2页 / 共58页
嵌入式Linux内核详细设计.docx_第3页
第3页 / 共58页
嵌入式Linux内核详细设计.docx_第4页
第4页 / 共58页
嵌入式Linux内核详细设计.docx_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《嵌入式Linux内核详细设计.docx》由会员分享,可在线阅读,更多相关《嵌入式Linux内核详细设计.docx(58页珍藏版)》请在课桌文档上搜索。

1、嵌入式1.inux内核详细设计嵌入式1.imIX内核全面设计说明书拟制:校对:湖南计算机股份有限公司嵌入式系统研究所2001.5目录1.引言21.l参考资料21.2术语与缩写词22设计概览52.1 设计的驱动因素与各自重要性的排序(比如,功能、性能、可靠性、硬件、内存考虑等等)52.2 不致设计方案的评价52.3 对所选设计方案总体结构图示及讨论52.4 开发环境(如开发语言、硬件、外设等等)63设计描述73 .1全局数据结构74 .2进程调度子系统253 .2.1模块功能概览254 .2.2全面输入、输出及处理描述253.3 内存管理管系统313.3.1 模块功能概览313.3.2 全面输入

2、、输出及处理描述313.4 虚拟文件子系统343 .4.1模块功能概览344 .4.2全面输入、输出及处理描述343.5 进程间通信(信C)子系统513.5.1 模块功能概览513.5.2 全面输入、输出及处理描述513.6 网络模块(NET)子系统603.6.1模块功能概览603.6.2全面输入、输出及处理描述601.引言.参考资料无1 .2术语与缩写词ArgumentARP参数,函数与例程中能够带入参数进行处理。地址转换协议。被用来将IP地址转换成物理硬件地址,如网卡地址。ARP是TCP/IP协议族中一个非常重要的协议。AsciiAscii代表着AnIeriCanStandardCodef

3、orInformationInterchange.字母表中的每个字母代表一个8位的编码。ASeii被用来存储”可写”的字符。Bit值域为0或者1的一个二进制数据位。BottomHalfHandler核心里在队列中的任务的句柄或者指针。ByteCCPUDataStructureDeviceDriver字节,8位数据。一种高级编程语言,1.inux基本上是用C编写的。CentralProcessingUnit(中央处理单元)。数据结构。设备驱动程序。用来操纵一个特定设备类的软件。比如,NCR810设备驱动程序操纵NCR810SCSI设备。DMAE1.FEIDEExecutableimageFunc

4、tionIDEImageIPIPCInterfaceIRQISADirectMemoryACCeSS(直接内存存取)Executableand1.inkableFOnnaI(可执行与可连接格式).扩展IDE.可执行映象。一个含有指令与数据的文件。能够被调进虚拟内存而执行。函数IntegratedDiskElectronics.参阅可执行映象。InternetProtOCOI(网际协议).InterprocessCommUniCtiOn(进程间通讯)接口。接口是一个抽象的概念。实现中,通常指一些函数或者例程接口。InterruptRequestQUeUe(中断申请队列).IndustryStan

5、dardArchitecture.Thisisastandard,althoughnowratherdated,databusinterfaceforsystemcomponentssuchasfloppydiskdrivers.KernelModuleKilobyteMegabyteMicroprocessorModuleObjectfile一个能够动态地被装载的核心部份,如文件系统与设备驱动序。1024字节。一兆字节或者1024K字节。微处理器。模块。一个含有指令的文件。目标文件。或者*.。文件。指一个含有指令与数据的文件。但这个文件尚未与其所需要的其他目标文件或者库相连接以形成一个可执行

6、文件。Page物理内存被分成许多同样大小的页面。是虚拟内存管理调度的最小单位。PointerProcessProcessorPCIPeripheralProgramProtocolRegisterRoutineSCSIShellSMPSocketSoftwareSystemV指针进程。一个正在执行的程序。处理器的简称。PeripheralComponentInterconnect.一个外设总线。外围设备程序。协议。通常指两个实体间“对话”的一种事先格式约定。寄存器例程。与函数类似,除了不返回值。SmallComputerSystemsIntCrfaCe(小型计算机接口).commandshel

7、l01.inux缺省用的是bashshell.Symmetricalmultiprocessing.SyStenIS(对称多处理系统)。一个socket代表着一个网络连接。1.inUX支持BSDSocket接口。软件Unix的一个版本,公布于1983。这个版本中,引进了著名的士SystemVIPC机制。TCPTaskQueueUDPVirtualmemoryTransmissionControlProtOCo1(传输操纵协议).任务队列UserDatagramPrOtOCOI(用户数据报协议).虚拟内存2 .设计概览2.1 设计的驱动因素与各自重要性的排序(比如,功能、性能、可靠性、硬件、内存

8、考虑等等)在设计过程中,要紧要考虑的有下列几点:跨平台的可移植性,在保证功能与不牺牲性能的前提下尽量减小核心的体积,为今后进一步开发留下空间与便利。其中,最要紧的就是可移植性,这是这个嵌入式系统的特色。减少核心的体积能够降低成本,但是随着当今硬件生产技术的提高完善,这一点已经不像过去那样重要了,因此在裁剪核心的同时要避免牺牲性能与功能。2 .2不一致设计方案的评价内核使用层次式结构。这样的结构大概层次清晰,易于修改。但是它严重降低了内核的效率。由于当高层次的函数调用底层提供的功能时,可能需要跨越几个层次,这样会增加系统开销。而且,在系统核心中,各个部分互相提供功能调用,假如严格按照层次式结构组

9、织将打破核心中各个功能部分的有机结构,使结构变的混乱。内核使用整体式结构。这样的结构的特点是这个内核由许多过程构成,但是不像在层次式结构中那样,每个过程只能被紧挨着它的上层调用。在整体式结构中,每个过程独立编译后,连接程序将其连接成为一个单独的目标程序,每个过程都对其它过程可见。这样的结构尽管在内部关系上确实变的复杂了(各个模块间是网状的结构),但是在调用关系与提供服务的角度来看变的简单清晰也更直观了,子系统间易于访问,内核工作效率较高。而且也有助于不一致的人参与不一致过程的开发。因此对内核的组织使用整体式结构。2.3 对所选设计方案总体结构图示及讨论内核由5个要紧的子系统构成,它们之间的大致

10、依靠关系如图。FS:文件系统IPC:进程间通信MM:内存管理NET:网络模块SCHED:进程调度进程调度子系统处于核心地位,其它子系统要完成操作都需要它来调度以占用系统资源完成自己的操作。文件系统需要利用网络模块支持网络文件系统,也需要利用内存管理支持RAMDISK设备。内存管理利用文件系统支持交换,交换进程定期的由调度程序调度,这也是内存管理依靠于进程调度的原因。进程间通信子系统要依靠内存管理支持共享内存通信机制。进程调度子系统需要内存管理的支持来完成创建进程等操作。2.4 开发环境(如开发语言、硬件、外设等等)内核由GNUC语言及汇编语言开发。硬件平台是1386嵌入式平台。所支持的外设诸如

11、标准PC的外设,与一些基本的嵌入式系统的硬件设备。如网络设备,显示设备,外存,音频设备,视频设备等。3 .设计描述3.3 全局数据结构全局数据结构的描述。block_dev_struct数据结构用来登记块设备以被缓冲区使用。structblk_dev_struct(void(*request_fn)(void);structrequest*CUrrenJrequest;structrequestplug;structtq_structplug_tq;buffer_head数据结构用来存放缓冲区中的一个数据块的信息。*bhstatebits*/defineBHUptodate0*1缓冲区里有数据

12、*/defineBH_Dirty1*1缓冲区脏*/defineBH_1.ock2*1缓冲区被锁*/defineBHRcq3/*0缓冲区无效*/defineBl1.ToUChed4/*1缓冲区被重复访问*/#defineBHHasaged5/*1缓冲区过时*/defineBH_Protected6*1缓冲区处于保护状态*/MefineBI1.FreeOnIO7/*1IO后丢弃缓冲区头部*/structbufferhead*Firstcacheline:*/unsignedlongb_blocknr;*块数目*/kdevtbdev;*设备(BFREE=free)*/kdevtbrdev;*真实设备

13、*/unsignedlongb_rsector;*磁盘上的真是缓冲区*/structbuffer_head*bnext;*信号队列列表*/structbuffer_head*b_this_page;*一页内的缓冲区循环列表*/*Secondcacheline:*/unsignedlongbstate;*缓冲区状态掩码*/structbuffer_head*b_next_free;unsignedintb_count;*用户使用此块*/unsignedlongbsize;*块大小*/*Non-performance-criticaldatafollows.*/char*bdata;*数据块指针*

14、/unsignedintb_list;*缓冲区公布表*/unsignedlongbflushtimc;*脏缓冲区被重写时间*/unsignedlongbru_time;*缓冲区上次被使用时间*/structwaitqueue*bwait;structbufferhead*b_prev;*双重连接的哈希表*/structbuffer_head*b_prev_free;*双重连接的缓冲区*/structbuffer_head*breqnext;*请求队列*/);device系统中每一个网络设备都对应于一个设备数据结构。structdevice/*这里是这个结构的可见部分的第一部分(就像用户在文件S

15、pace,c中看到的一样).这是它的名称与接口.*/char*namc;*I/Ospecificfields*/unsignedunsignedunsignedunsignedunsignedunsignedlonglonglonglonglongcharrmemend;rmem_start;memmom1.end;*共享内存结束*/1.start;/*共享内存起始*/base_addr;/*设备IO地址*/irq;*deviceIRQnumber*/*1.ow-levelstatusflags.*/volatileunsignedcharstart,*开始一个操作*/interrupt;*中

16、断到达*/unsignedlongtbusy;*传送忙*/structdevice*next;*设备初始化,只被调用一次*/int(*init)(structdevice*dev);*有些设备还需要下面这些字段,但是它们不是在文件Space,c中通常的设置项.*/unsignedcharif_port;/*可选择的AUI,TP,*/unsignedchardma;*DMA通道*/structenet_statistics*(*get_stats)(structdevice*dev);*标记了结构的可见部分的结束部分.这后面的所有字段是系统内部的,能够被随意改动*/*这些可能为将来的远程关机代码

17、使用*/unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsignedlong trans_start; *最后一次传送的时间*/ long last_rx; /* 最后 RX 的时间 */shortshortshortshortshortshortvoid *priv; *flags; * 接口标记(BSD)*/family; * 地址族 ID */metric; *路由距离*/mtu; * MTU 值 */type; *硬件类型*/hard_header_len; /* 硬件地址长度 */ 私有数据*/*接口地

18、址信息*/unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsigned unsignedcharcharchar char long long long longbroadcastMAX_ADDR_LEN; pad;dev addrMX ADDR_LEN;addrlen; /* pa_addr; /* pa_brdaddr;. padstaddr;. pamask; *:硬件地址长度*/协议地址*/*协议广播地址*/* P - P协议另i端地址*/ 协议网络掩码*/short pa_alen; *协议地址长度*/

19、structdev_mc_list*mclist;*MaC广播地址*/intmc_count;/*已安装的MaC编号*/structip_mcist*IPMac链*/u32tx_queue_len;/*每个队列的最大帧长度*/*Forloadbalancingdriverpairsupport*/unsignedlongpktqueue;*包队歹IJ*/structdevice*slave;*附属设备*/structnet_alias_info*alias_info;*主设备别名信息*/structnetalias*myalias;*别名设备*/*Pointertotheinterfacebu

20、ffers.*/structsk_buff_headbuffsDEV_NUMBUFFS;*Pointerstointerfaceserviceroutines.*/int(*open)(structdevice*dev);int(*stop)(structdevice*dev);int(*hard_startxmit)(structskbuff*skb,structdevice*dev);int(*hardheader)(structskbuff*skb,structdevice*dev,unsignedshorttype,void*daddr,void*saddr,unsignedlen);

21、int(*rebuiIdheader)(void*eth,structdevice*dev,unsignedlongraddr,structsk_buff*skb);void(*setmulticastlist)(structdevice*dev);int(*setmacaddress)(structdevice*dev,void*addr);int(*do_ioctl)(structdevice*dev,structifreq*ifr,intcmd);int(*set_config)(structdevice*dev,structifmap*map);void(*header_cache_b

22、ind)(structhhcache*hhp,structdevice*dev,unsignedshorthtype,_u32daddr);void(*header_cacheupdate)(structhhcache*hh,structdevice*dev,unsignedchar*haddr);int(*change_mtu)(structdevice*dev,intnewmtu);structiwstatistics*(*get_wireless_stats)(structdevice*dev););device.struct数据结构用来登记字符与块设备(含有相应的名字与对此设备的文件操

23、作集)。每一个ChrdCVS与blkdevs向量的入口对应一个字符或者块设备。structdevicestructconstchar*name;struct*fops;);file每个打开的文件,socket接口都对应一个文件数据结构。structfilemode_tfmode;loff_tf_pos;unsignedshortf_flags;unsignedshortf_count;unsignedlongf_reada,f_ramax,f_raend,f_ralen,f_rawin;structfile*f_next,*f_prev;intf_owner;*将发送的SlGlO的用户标示与组

24、标示*/structinode*f_inode;struct*fop;unsignedlongf_version;void*private_data;*为tty或者其它设备需要*/;数据结构描述一个正被打开的文件。structintcount;fdsetclose_on_exec;fd_setOPen_fds;structfile*fdNR_OPEN;);fs_structstructfs_struct(intcount;unsignedshortumask;structinode*root,*pwd;);gendiskgendisk数据结构含有一个硬盘的信息。当系统初始化,发现硬盘与检测分区

25、参数时,此结构被填充。structhd_structlongstart_sect;longnr_sects;structgendiskintmajor;*设备主编号*/constchar*maJorname;*主设备名*/intminor_shift;*numberoftimesminorisshiftedtogetrealminor*/intmax_p;*每个设备的最大分区数*/intmax_nr;/*真实设备的最大个数*/void(*init)(structgendisk*);/*工作前先初始化*/structhdstruct*part;/*分区表*/int*sizes;/*以块计数的设备

26、大小,拷贝进blk_size口*/intnr_real;/*真实设备个数*/void*realdevices;/*内部使用*/structgendisk*next;;inode数据结构包含一个磁盘中的文件或者目录的信息。structinodekdev_ti_dev;unsignedlongiino;umode_ti_mode;nlink_tinlink;uid_tiuid;gid_ti_gid;kdevti_rdev;off_ti_size;i_atime;timeti_mtime;timeti_ctime;unsignedlongi_blksize;unsignedlongiblocks;u

27、nsignedlongiversion;unsignedlonginrpages;structsemaphorei_sem;structinode_operations*iop;structsuper_block*i_sb;structwaitqueue*iwait;struct*iflock;structvm_area_struct*ijnmap;structpage*ipages;structdquot*idquotMAXQUOTAS;structinode*i_next,*i_prev;structinode*ihashnext,*i_hash_prevstructinode*iboun

28、dto,*iboundby;structinode*i_mount;unsignedshorti_count;unsignedshorti_flags;unsignedchari_lock;unsignedcharidirt;unsignedchari_pipe;unsigned chari_sock;unsigned chari_seek;unsignedchari_update;unsignedshortiwritecount;unionstructpipe_inode_infopipe;structminix_inode_infominixi;structext_inode_infoex

29、t_i;structext2_inode_infoext2_i;structhpfs_inode_infohpfs_i;structmsdos_inode_infomsdos_i;structumsdos_inode_infoumsdos_i;structisoinodeinfoisofs_i;structnfs_inode_infonfs_i;structxiafs_inode_infoxiafs_i;structSysvinodeinfosysv_i;structaffs_inode_infoaffs_i;structufs_inode_infoufs_i;structsocketsock

30、et_i;void*generic_ip;u;;fipc_permipc_perm结构描述了一个SystemVIPC对象的存取权限。.structipc_pennkey_tkey;ushortuid;*所有者的用户编号与组编号*/ushortgid;ushortcuid;/*创建者的用户编号与组编号*/shortcgid;ushortmode;/*访问方式*/ushortseq;/*序列号*/;irqaction结构用来描述系统的中断句柄。structirqactionvoid(*handler)(int,void*,structpt_regs*);unsignedlongflags;unsi

31、gnedlongmask;constchar*name;void*dev_id;structirqaction*next;linux_binfmt每个1.inUX能够懂得的二进制文件格式对应一个IinUXbinfmt数据结构。structlinux_binfmtstructIinuxbinfmt*next;long*use_count;int(*loadbinary)(structIinuxbinprm*,structptregs*regs);int(*loadshlib)(intfd);int(*core_dump)(longsignr,structpt_regs*regs);mem_ina

32、p_t数据结构(或者叫做页面)用来存放每个物理内存页面的信息。typedefstructpage*thesemustbefirst(freeareahandling)*/structpage*next;structpage*prev;structinode*inode;unsignedlongoffset;structpage*next_hash;atomictcount;unsignedflags;*atomicflags,somepossiblyupdatedasynchronously*/unsigneddirty:16,age:8;structwait_queue*wait;struc

33、tpage*prev_hash;structbuffer_head*buffers;unsignedlongs;unsignedlongmap_nr;*page->map_nr=page-InenIjnaP*/)mem_map_t;三.struct用来描述一个任务活一个进程的虚拟内存空间。structmm_structintcount;PgC1.t*pgd;unsignedlongcontext;unsignedlongstart_code,end_code,start_data,enddata;unsigned long start_brk,brk,start_stack,Startm

34、map;unsignedlong arg_start,arg_end, env_start, env_end;Iockedvm;unsignedlongrss,totalvm,unsignedlongdef_flags;structvm_area_struct*mmap;structvm_area_struct*mmapavl;structsemaphoremmapsem;pci_bus系统中的每个PCl总线对应一个pci_bus结构。structpci_busstructpcibus*parent;*父总线*/structpci_bus*chiIdren;*总线的P2P链*/structpc

35、i_bus*next;*所有PCl总线链*/structpci_dev*self;*被父总线看到的桥设备*/structpci_dev*devices;/*桥后的设备*/void*sysdata;/*系统指定的外部挂钩*/unsignedcharnumber;/*总线编号*/unsignedcharprimary;*主桥编号*/unsignedcharsecondary;*二级桥编号*/unsignedcharsubordinate;*下级总线的最大数目*/);pci_dev系统中的每个PCT设备,包含PCT-PCI与PCI-ISA桥设备都分别对应于一个pci_dev结构。/*Thereiso

36、nepcidevstructureforeachslot-number/function-number*combination:*/structpci_devstructpcibus*bus;*设备所基于的总线*/structpci_dev*sibling;*总线上的下一个设备*/structpci_dev*next;*所有设备的链*/void*sysdata;/*系统指定的外部挂钩*/unsignedintdevfn;/*可编程设备;函数索引*/unsignedshortvendor;unsignedshortdevice;unsignedintclass;*3bytes:(base,sub

37、,prog-if)*/unsignedintmaster:1;/*setifdeviceismastercapable*/*理论上,中断级别能够从配置空间中获取而* 不影响其它.但是,旧的PCI芯片不支持* 这些寄存器同时只返回零.比如,* 芯片ViSiOn864-Prev0能够使用INTA,但是返回0* .pci_init()用PCINTERRUPT_1.INE的数据初始化这个字段* .同时pcibios_fixup()能够改变它。*.这个字段不能是0,除非改设备*根本不能产生中断.*/unsignedcharirq;/*改设备产生的irq*/;request结构用来向系统中的块设备发出请求

38、。这些请求是关于读或者写缓冲区中的数据块。structrequestvolatileintrq_status;defineRQ_INACTIVE(-1)defineRQ_ACTIVE1defineRQ_SCST_BUSYOxffffdefineRQSCSIDONEOxfffettdefineRc1.SCS1.DlSCoNNECTINGOxffeOkdev_trq_dev;intcmd;*READorWRITE*/interrors;unsignedlongsector;unsignedlongnr_sectors;unsignedlongcurrent_nr_sectors;char*buff

39、er;structsemaphore*sem;structbufferhead*bh;structbuffer_head*bhtail;structrequest*next;);rtable每个rtable结构含有对应一个IP主机的路由信息。rtable结构在IP路由缓冲中被使用。structrtablestructrtable*rt_next;_u32rt_dst;_u32rt_src;u32rt.gateway;atomic_trt_refcnt;atomic_trt_use;unsignedlongrt_window;atomictrtlastuse;structhhcache*rt_h

40、h;structdevice*rt_dev;unsignedshortrt_flags;unsignedshortrtmtu;unsignedshortrt_irtt;unsignedcharrt_tos;semaphore被用来保护临界数据与临界区代码。structsemaphoreintcount;intwaking;intlock;*tomakewakingtestingatomic*/structwait_queue*wait;sk_buffsk_buff结构被用来当数据在网络协议之间移动时描述网络数据.structsk_buffstructskbuff*next;/*表中的下一个缓冲

41、区*/structskbuff*prev;/*表中的前一个缓冲区*/structsk_buff_head*list;/*所在的表*/intmagicdebugcookie;structsk_buff*link3;*IP协议层的缓冲区链*/structsock*sk;*所属的SoCket*/unsignedlongwhen;*usedtocomputertt,s*/structtimevalstamp;*到达时间*/structdevice*dev;*到达或者离开的设备*/unionstructtcphdr*th;structethhdr*eth;structiphdr*iph;structud

42、phdr*uh;unsignedchar*raw;*用来在一个UniXdomainsocket里传送文件句柄*/void*filp;h;union*Asyetincompletephysicallayerviews*/unsignedchar*raw;structethhdr*ethernet;mac;structiphdr*ip_hdr;*ForIPPROTO_RAW*/unsignedlonglen;*实际数据长度*/unsignedlongcsum;*校验与*/_u32saddr;*IP源地址*/_u32daddr;*TP目标地址*/_u32raddr;*IP下一节点地址*/_u32se

43、q;*TCP序列号*/u32end_seq;*Seq+fin+syn+datalen*/u32ackseq;*TCP确认序列号*/unsignedcharproto_priv16;volatilecharacked,*是否被确认*/used,*是否被使用?*/free,*如何释放缓冲区*/arp;*IP/ARP解析是否结束*/unsignedchartries,*Timestried*/lock,*是否锁住?*/localroute,*为改帧的本地路由断言*/pkt_type,/*包级别*/pktbridged,*Trackerforbridging*/ip_summed;*驱动产生的IP校验

44、与*/definePACKET_HOSTO*对自己*/definePACKET_BROADCAST1*对所有*/definePACKETJIU1.TTCAST2*对组*/definePACKET_OTHERHOST3*对其它人*/unsignedshortusers;*用户技术一见datagram,c,tcp.c*/unsignedshortprotocol;*来自协议的包的协议.*/unsignedinttruesize;*缓冲区大小*/atomic_tcount;*共享计数*/structskbuff*dataskb;*实际数据的Skb指针*/unsignedchar*head;*缓冲区头

45、*/unsignedchar*data;*数据头指针*/unsignedchar*tail;*尾指针*/unsignedchar*end;*结束指针*/void(*destructor)(structsk_buff*);*撤销函数*/_ul6redirport;*Redirectport*/;sock每个sock数据结构保护一个关于BSDsocket的协议信息。比如,对一个INET类型的socket,此数据结构将含有所有TCP/IP与UDP/IP的有关信息。structsock(*Thismustbefirst.*/structsock*sklist_next;structsock*sklist_prev;structoptions*opt;atomic_tmem_alloc;atomic_trmemalloc;unsignedlongallocation;*配置模式*/_u32write_seq;_u32sentseq;_u32ackedseq;u32copied_seq;u32rcvackseq

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号