还剩57页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
嵌入式Linux内核详细设计《嵌入式Linux内核全面设计说明书》拟制校对湖南计算机股份有限公司嵌入式系统研究所
2001.5intmax_p;/*每个设备的最大分区数*/intmax_nr;/*真实设备的最大个数*/void*initstructgendisk*;/*工作前先初始化*/structhd_struct*part;/*分区表*/intsizes;/*以块计数的设备大小拷贝进blk_size口*/intnr_real;/*真实设备个数*/void*real_devices;/*内部使用*/structgendisk*next;;inode数据结构包含一个磁盘中的文件或者目录的信息structinode{kdcvtidev;unsignedlongiino;umode_ti_mode;nlinktinlink;uidtiuid;gid_ti_gid;kdev_ti_rdev;off_tisize;time_ti_atime;unsignedlongiJolksize;unsignedlongi_blocks;unsignedlongiversion;unsignedlongi_nrpagcs;structsemaphoreisem;structinode_operations*i_op;structsuperblock*i_sb;structwaitqueue*i_wait;unsignedshorticount;unsignedshorti_flags;unsignedchari_lock;unsignedcharidirt;unsignedcharipipe;unsignedchari_sock;unsignedchari_seek;unsignedchariupdate;unsignedshortiwritecount;union{structpipeinodeinfopipoi;structminixinodeinfominixi;structext_inode_infoext_i;structext2_inode_infoext2_i;structhpfsinodeinfohpfsi;structmsdosinodeinfomsdosi;structumsdos_inode_infoumsdos_i;structiso_inode_infoisofsi;structnfsinodeinfonfsi;structxiafs_inode_infoxiafs_i;structsysv_inode_infosysv_i;structaffsinodeinfoaffsi;structufs_inode_infoufs_i;structsocketsocket_i;void*generic_ip;}u;;fipc_permipc_perm结构描述了一个SystemVIPC对象的存取权限.structipejperm{keytkey;ushortuid;/*所有者的用户编号与组编号*/□shortgid;ushortcuid;/*创建者的用户编号与组编号*/ushortcgid;ushortmode;/*访问方式*/ushortseq;/*序列号*/};irqaetion结构用来描述系统的中断句柄structirqaetion{void*handlerintvoid*structpt_regs*;unsignedlongflags;unsignedlongmask;constchar*name;void*dev_id;structirqaetion*next;};linux_binfmt每个Linux能够懂得的二进制文件格式对应一个linux_binfmt数据结构structlinuxbinfmt{structlinuxbinfmt*next;long*usecount;int*load_binarystiuctlinux_binprm*structpt_regs*regs;int*load_shlibintfd;int*coredumplongsignrstructpt_regs*regs;};mem_map_t数据结构或者叫做页面用来存放每个物理内存页面的信息typodefstructpage{/*thesemustbefirstfreeareahandling*/structpage*next;structpage*prev;structinode*inode;unsignedlongoffset;structpage*next_hash;atomictcount;unsignedflags;/*atomicflagssomepossiblyupdatedasynchronously*/unsigneddirty:16age:8;structwait_queue*wait;structpage*prev_hash;structbufferheadbuffers;unsignedlongs;unsignedlongmap_nr;/*page-gt;map_nr==page-memjnap*/}mem_map_t;mm_struct用来描述一个任务活一个进程的虚拟内存空间structmmstruct{intcount;pgd_t*pgd;unsignedlongcontext;unsignedlongstart_codeend_codestart_dataend_data;unsignedlongstartbrkbrkstartstackstartmmap;unsignedlongarg_startarg_endenv_startenv_end;unsignedlongrsstotal_vmlockedvm;unsignedlongdefflags;structvm_area_struct*mmap;structvmareastruct*mmapav1;structsemaphoremmap_sem;};pci_bus系统中的每个PCI总线对应一个pci_bus结构structpcibus{structpci_bus*parent;/*父总线*/pci_dev系统中的每个PCI设备,包含PCI-PCI与PCI-ISA桥设备都分别对应于-一个pci_dev结构/**Thereisonepcidevstructureforeachslot-number/function-number*combination:*/structpci_dev{structpci_bus*bus;/*设备所基于的总线*/structpcidevsibling;/*总线上的下一个设备*/structpcidev*next;/*所有设备的链*/void*sysdata;/*系统指定的外部挂钩*/unsignedintdevfn;/*可编程设备;函数索引*/unsignedshortvendor;unsignedshortdevice;unsignedintclass;/*3bytes:basesubprog-if*/unsignedintmaster:1;/*setifdeviceismastercapable*//**理论上,中断级别能够从配置空间中获取而不影响其它.但是,旧的PCI芯片不支持这些寄存器同时只返回零.比如,芯片Vision864-Prev0能够使用1NTA但是返回
0.pci_init用PCI_INTERRUPT_LINE的数据初始化这个字段.同时pcibios_fixup能够改变它*.这个字段不能是0除非改设备*根本不能产生中断.*/unsignedcharirq;/*改设备产生的irq*/};request结构用来向系统中的块设备发出请求这些请求是关于读或者写缓冲区中的数据块structrequest{volatileintrq_status;^defineRQ^INACTIVE-1^defineRQ.ACTIVE1^defineRQSCS1_BUSYOxffffdefineRQ_SCSI_DONEOxfffe^defineRQ_SCSI_DISCONNECTINGOxffeOkdov_trq_dev;intcmd;/*READorWRITE*/interrors;unsignedlongsector;unsignedlongnrsectors;unsignedlongcurrent_nr_sectors;char*buffer;structsemaphore*sem;structbuffer_head*bh;structbuffer_head*bhtai1;structrequest*next;;rtable每个rtable结构含有对应一个IP主机的路由信息rlable结构在IP路由缓冲中被使用structrtable{structrtcible*rt_next;_u32rt_dst;_u32rtsrc;―u32rt_gateway;atomic_trt_refcnt;atomictrtuse;unsignedlongrtwindow;atomic_trt_lastuse;structhhcache*rt_hh;structdevice*rt_dev;unsignedshortrtflags;unsignedshortrt_mtu;unsignedshortrtirtt;unsignedcharrt_tos;;semaphore被用来保护临界数据与临界区代码structsemaphore{intcount;intwaking;intlock;/*tomakewakingtestingatomic*/structwaitqueue*wait;;sk_buffsk_buff结构被用来当数据在网络协议之间移动时描述网络数据.structsk_buff{structsk_buff*next;/*表中的下一个缓冲区*/structsk_buff*prcv;/*表中的前一个缓冲区*/structsk_buff_head*list;/*所在的表*/intmagicdobugcookie;structsk_buff*link3;/*IP协议层的缓冲区链*/structsock*sk;/*所属的Socket*/unsignedlongwhen;/*usedtocomputertts*/structtimevalstamp;/*到达时间*/structdevice*dev;/*到达或者离开的设备*/union{structtcphdr*th;structethhdr*eth;structiphdr*iph;structudphdr*uh;unsignedchar*raw;/*用来在一个unixdomainsocket里传送文件句柄*/void*filp;h;union{/*Asyetincompletephysicallayerviews*/unsignedchar*raw;structethhdr*cthernot;mac;structiphdr*ip_hdr;/*ForIPPR0T0_RAW*/unsignedlonglen;/*实际数据长度*/unsignedlongcsum;/*校验与*/u32saddr;/*IP源地址*/u32daddr;/*IP目标地址*/u32raddr;/*IP下一节点地址*/u32seq;/*TCP序列号*/u32end_seq;/*seq[+fin][+syn]+datalen*/u32ack_seq;/*TCP确认序列号*/unsignedcharproto_priv
[16];volatilecharacked/*是否被确认*/used/*是否被使用*/free/*如何释放缓冲区*/arp;/*IP/A即解析是否结束*/lock/*是否锁住?*/localroute/*为改帧的本地路由断言*/pkt_type/*包级别*/pkt_bridged/*Trackerforbridging*/ip_summed;/*驱动产生的IP校验与*/^definePACKET_HOST0/*对自己*/^definePACKETBROADCAST1/*对所有*/^definePACKET_MULTICAST2/*对组*/^definePACKET_OTHERHOST3/*对其它人♦/unsignedshortusers;/*用户技术-见datagram.ctcp.c*/unsignedshortprotocol;/*来自协议的包的协议.*/unsignedinttrucsize;/*缓冲区大小*/atomic_tcount;/*共享计数*/structsk_buff*data_skb;/*实际数据的skb指针*/unsignedchar*head;/*缓冲区头*/unsignedchar*data;/*数据头指针*/unsignedchar*tail;/*尾指针*/unsignedchar*end;/*结束指针*/void*destructorstructskbuff*;/*撤销函数*/_ul6redirport;/*Redirectport*/};sock每个sock数据结构保护一个关于BSDsocket的协议信息比如,对一个INET类型的socket此数据结构将含有所有TCP/IP与UDP/IP的有关信息structsock{/*Thismustbefirst.*/structsock*sklist_next;structsock*sklist_prev;structoptions*opt;atomic_twmem_alloc;atomic_trmemal1oc;unsignedlongallocation;/*配置模式*/―u32write_seq;_u32sent_seq;_u32ackcdseq;u32copiedseq;_u32rcv_ack_seq;unsignedshortrcvackcnt;/*同一确认的计数*/_u32windowseq;u32fin_seq;—u32urg_seq;_u32urgdata;_u32syn_seq;intusers;/*用户计数*//*不是所有的都不稳固,但是确实有些是,因此我们能够说它们都不稳固.*/unsignedlonglingcrtimc;intproc;structsock*next;sock**pprev;sock*bind_next;structsock*pair;inthashent;sock*prev;sk_buffvolatilesend_head;structskbuff*volatilesendnext;structskbuff*volatilesendtail;structsk_buff_headbick_log;structsk_buffpartial;structtimerlistpartialtimer;longretransmits;structsk_buff_headwrile_queuereceive_queue;structproto*prot;structwaitqueue**sleep;_u32daddr;—u32saddr;/*发送源*/_u32revsaddr;/*目的地址*/unsignedshortmaxunacked;unsignedshortwindow;—u32last\vin_seq;/*最后一次更新窗口时的序列号*/_u32high_seq;/*进行当前最快转发时的序列号*/unsignedcharpriority;unsignedchardebug;intrcvbuf;intsndbuf;unsignedshorttype;unsignedcharlocalroute;/*只本地路由*//*这是没有重叠的私有选择区域*/union{structunixoptafunix;ifdefinedCONFIG_ATALK||definedCONFIG_ATALK_MODULEstructatalk_sockaf_at;#endififdefinedCONFIG_IPX||definedCONFIG」PX_MODULEstructipxoptafipx;#endif#ifdefCONFIG_INETstructinetpacketoptafpacket;#ifdefCONFIG_NUTCPstructtcp_optaftep;ftendifendif}protinfo;/**IP区*/int/*TTL设置*/intip_tos;/*TOS*/structtcphdrdummy_th;structtimer_listkeepalive_timer;/*TCPkeepalivehack*/structtimcrlistrctransmittinter;/*TCP转发计时*/structtimerlistdelacktimer;/*TCP延迟应答计时*/intip_xmit_timeout;/*超时的原因*/structrtable*ip_route_cache;/*输出路由缓存*/unsignedchariphdrincl;/*是否包含头部*/ftifdefCONFIG^IPMULTICASTintipmc.ttl;/*多点传送TTL*/intip_mc_loop;/*回送*/charip_mcname[MAXADDRLEN];/*多点传送设备名*/structip_mc_socklist/*组队列*/ttendif/**这部分用于超时功能timerc.*/inttimeout;/*在等什么?*/structtimer」isttimer;/*ThisistheTIME_WAIT/receive*timerwhenwearedoingIP*/structtimevalstamp;/*标示*/structsocket*socket;/*回叫*/void*state_changestructsock*sk;void*datareadystructsock*skintbytes;void*write_spacestructsock*sk;void*error_reportstructsock*sk;;socket每个socket结构包含一个BSDsocket信息这个结构不是独立存在的,而是作为一个VFS数据结构的一个部份structsocket{shorttype;/*sock流,…*/socketstatestate;longflags;structproto_ops*ops;/*协议完成几乎所有情况*/void*data;/*协议数据*/structsocket*conn;structsocket*iconn structsocket*next;structwaitquouc**wait;structinode*inode;structfasync_struct*fasync_list;/*异步等待队列*/structfile*file;/*pointerforgc*/;task_struct每个task_struct数据结构描述系统中的进程或者任务structtask_struct{/*thesearehardcoded-donttouch*/volatilelongstate;/*-1不可执行0科执行,gt;0停止*/longcounter;longpriority;unsignedlongsignal;unsignedlongblocked;/*伪码信号位图*/unsignedlongflags;/*每个进程的标记*/interrno;longdebugreg
[8];/*硬件调试寄存器*/structexec_domain*exec_domain;/*可变字段*/structlinux_binfmt*binfmt;structtask_struct*next_task*prev_task;structtaskstruct*ncxt_run*prev_run;unsignedlongsavedkernelstack;unsignedlongkernel_stack_page;intexitcodeexitsignal;unsignedlongpersonality;intdumpable:1;intdidexec:1;intpid;intpgrp;目录参考资料2术语与缩写词
22.设计概览51设计的驱动因素与各自重•自性的排序(比如,功能、性能、可靠性、硬件、内存考等)52不一致设计方案的评价5对所选设计方案总体结构图示及讨论5开发环境(如开发语言、硬件、外设等等)63设计描述71全局数据结构7进程调度了•系统25模块功能概览25全面输入、输出及处理描述25内存管理子系统
31.1模块功能概览
31.2全面输入、输出及处理描述31虚拟文件子系统
34.
4.1模块功能概览
34.
4.2全面输入、输出及处理描述34进程间通信(信C)了系统
513.
5.1模块功能概览
513.
5.2全面输入、输出及处埋描述
513.6网络模块(NET)子系统
603.
6.1模块功能概览
603.
6.2全面输入、输出及处理描述60intttyoldpgrp;intsession;/*booleanvalueforsessiongroupleader*/intleader;intgroups[NGROUPS];/*父进程指针,最下子进程指针,兄弟进程指针*/structtaskstruct*popptr*ppptr*pcptr*pysptr*posptr;structwait_queue*wait_chldexit;unsignedshortuidcuidsuidfsuid;unsignedshortgidegidsgidfsgid;unsignedlongtimeoutpolicyrt_priority;unsignedlongit_real_valueit_prof_valueit_virt_value;unsignedlongitrealincritprofincrit_virt_incr;structtimer_listreal_timer;longutimestimecutimeeslimestart_time;/*内存错误与交换信息*/unsignedlongminfltmajfltnswapcminfItcmajfltcnswap;ints;unsignedlongs;unsignedlongoldmajfit;/*majfit的旧值*/unsignedlongdec_flt;/*上次的页错误计数*/unsignedlongs;/*下次要进行交换的页面数目*//*限制*/structrlimitrlim[RLIM_NLIMITS];unsignedshortused_math;charcomm
[16];/*文件系统信息*/intlinkcount;structtty_struct*tty;/*假如没有tty为NULL*//*ipc资料*/structsemundo*semundo;structsemqueue*semsleeping;/*改任务的Idt.缺省值为NULL表示使用缺省Idt*/structdesc_struct*ldt;/*该任务的tss*/structthreadstructtss;/*文件系统信息*/structfs_struct*fs;/*打开文件信息*/struct*files;/*内存管理信息*/structmmstruct*nun;/*信号句柄*/structsignalstruct*sig;ttifdef_SMP_intprocessor;intlastprocessor;intlock_depth;/*锁深度.*/ftendif};timer」ist结构用来实现对进程的定时器的操作structtimer」ist{structtimer_list*next;structtimerlist*prev;unsignedlongexpires;unsignedlongdata;void*functionunsignedlong;;tq_struct每个任务队列taskqueuetq_struct含有已在排队的任务信息通常来说,这些任务是设备驱动程序所需的,但不是务必“立刻”被完成structtq_struct{structtqstruct*next;/*可用的bhs连接表*/intsync;/*务必初始化为0*/void*routinevoid*;/*调用的函数*/void*data;/*函数参数*/};vm_area_struct每个vmareastruct结构含有一个进程虚拟内存的每个部份的描述structvm_area_struct{structmm_struct*vm_mm;/*虚拟存储空间参数*/unsignedlongvmstart;unsignedlongvmend;pgprot_tvm_page_prot;unsignedshortvm_flags;/*每个任务的虚拟存储空间的AVL树,按地址排序*/shortvmavlheight;structvm_area_struct*vm_avl_left;structvm_area_struct*vm_avl_right;/*每个任务的虚拟存储空间连接表,按地址排序*/structvmareastruct*vmnext;/*关于使用inode的区域,循环列表inode-gt;i_mmap*//*关于共享内存,附属一个循环表,否则不使用*/structvmareastruct*vm_next_share;structvmareastruct*vmprevshare;/*more*/structvm_operations_struct*vm_ops;unsignedlongvm_offset;structinode*vm_inode;unsignedlongvmpte;/*共享内存*/};
3.2进程调度子系统
3.
2.1模块功能概览进程调度是Linux操作系统的心脏,要紧有下列功能同意进程建立自己的新拷贝;决定拿一个进程将占用CPU使得可运行进程之间进行有效的转移;同意中断并把他们发送到合适的内核子系统;发送信号给用户进程;管理定时器硬件;当进程结束后,释放进程所占用的资源;支持动态装入模块;
2.2全面输入、输出及处理描述进程调度提供两级接口:第一,它提供用户进程能够调用的有限的系统调用接口;第二它为内核的其他了•系统提供接口:_exit纲要void_exitintstatuQ参数status:[in]将死进程返回的状态描述系统调用立即结束调度任务返回值无cxecve纲要intexecveconstchar*constchar*argv[]constchar*envp口;参数[in]可执行文件的路径argv:[in]参数向量envp:[in]开始新文本的条件描述用带参数向量描述的磁盘上的可执行文件覆盖当前的任务,打开的文件在调用后不关闭返回值成功没有返回值,错误返回Terrno设成下列值EACCESS:文件错误或者为不可执行.EPERM:文件系统不同意执行或者文件的SUID或者SGID被设置但文件系统不同意SLID或者SG【D执行.E2BIGENOEXECEFAULTENAMETOOLONGENOENTENOMEMENOTDIREACCESSELOOP意义相同.template纲要pid_tforkvoid;pid_tvforkvoid;描述从当前任务中创建一个子任务,新任务是父任务的拷贝,vfork是fork.的别名返回值成功,在父进程中返回新进程PH在子进程中返回
1.错误返回T设置errn,EAGAIN没有足够的内存完成这一调用getegidandgetgid纲要gidtgetgidvoid;gid_tgetegidvoid;描述getgid返回当前进程的真实gidgetegid返回当前进程的有效gid真实gidis是执行这个任务的用户的gid有效gid是可执行文件的gid返回值getgid:实际的gid.getegid:有效的gid.geteuidandgetuid纲要uidtgetuidvoid;uid_tgeteuidvoid;描述getuid返回当前进程的真实uid.真实的uid是执行进程的用户的uidgeteuid返回当前进程的有效uid.有效uid是可执行文件的uid返回值getuid:真实uid.Geteuid有效uidgetpgrpsetpgidandsetpgrp纲要pidtgetpgrpvoid;intsetpgidpid_tpidpid_tpgid;intsetpgrpvoid;参数pid:[in]编辑的进程0当前进程.pgid\[in]新近承德groupid..描述getpgrp返回当前进程的组.setpgid设置由pidz确定的进程的组id为pgid.setpgrp设置当前进程的组id为它的进程id.返回值getpgrp返回进程的组id.成功,setpgrp与setgpid返回0错误返回|-1设置errno关于setpgid.EINVAL:pgid小于
0.getppid纲要pid_tgetpidvoid;pidtgctppidvoid;描述getpid返回当前的进程idgetppid返回父进程的进程id.返回值getpid:当前进程的pid.getppid:父进程的pidgetpriorityandsetpriority纲要intgetpriorityintwhichintwho;intsetpriorityintwhichintwhointprio;参数which[in]操作类别.who-.[in]设置的进程.prio:[in]新的优先级.描述getpriority返回进程的最高优先级setpriority设置进程的优先级操作类别有PRI0_PR0CESS获取进程的优先级who为进程id.PRQPGRP获取进程组的优先级.为进程组id.PRIO_LSER获取用户的优先级who为用户id.who为0代表当前的进程,进程组或者用户prio的取值[-
20.20]返回值getpriority返回-20至
20.setpriorityMe00错误返回T.设置errnoEINVAL:无效值.EACCESS:试图降低超级用的优先级ESRCH.nice纲要intniceintinc;参数inc:[in]增加值.描述给进程增加inc的优先级.只有超级用户可用返回值成功返回0错误返回T设置errnoEPERM:没有超级用户的权限setgid纲要intsetgidgid_lgid;参数gid\[in]新的gid.描述假如没有超级用户权限,可用sotgid设置有效的gid返回值成功返回0错误返回-1设置e^nEPERM:gfd不是真实的gidsetregid纲要intsetregidgid_trgidgidtegid\参数rgid\[in]新的真实的gid-1为不变.egid\[in]新的有效的gid-1为不变.描述设置进程的真实gid与有效的gid.假如没有超级用户权限只能在真实gid与有效gid间进行要换,假如有超级用户权限则可任意设置真实gid与有效gid返回值成功返回0错误返回-1设置errnEPERM:没有超级用户权限setreuid纲要intsetrugidgid_truidtgid_teuid;参数rgid\[in]新的真实的uid-1为不变.egid:[in]新的有效的uid-i为不变描述设置进程的真实uid与有效的uid.假如没有超级用户权限只能在真实uid与有效uid间进行要换,假如有超级用户权限则可任意设置真实uid与有效uid返回值成功返回0错误返回7设置errnEPERM:没有超级用户权限.setuid纲要intsetuidgid_tuid\参数uid:[in]新的uid.描述假如没有超级用户权限可用setuid设置它的有效uid为可存uid或者真实uid.假如有超级用户权限,真实有效可存的uids可设为小d返回值成功返回0错误返回-1设置errnEPERM:没有超级用户权限wait4纲要pidtwait4pid_tpidint*statusintoptionsstructrusage*rusage;参数pid:[in]子进程的pid.status:[out]返回子进程的状态.options[in]wait选项.rusage:[out]死调子进程可用资源.描述使进程睡眠直到由pid指定的子进程结束或者接到信号,假如符合请求的子进程在僵尸状态僵尸状态结束并马上返回不一致趋势范围由不一致意义-1等待子进程的组d1等待任何子进程退出.等待进程组id等于当前进程的子进程退出0等待pid等于子进程退出假如status不是NULL则返回的子进程状态存在status.指针所指区域options为下列值WNOHANG不等待直接结束.WUNTRACED返回停止的子进程.返回值存在的子进程的pid错误返回0设置errnECHILD:子进程不存在EPERM:没有超级用户权限
3.3内存管理子系统
3.1模块功能概览内存管理子系统提供下列功能扩大地址空间;进程保护;内存映射;公平的物理内存分配;共享虚拟内存;
3.2全面输入、输出及处理描述内存管理提供两级接口:笫一,用户进程使用的系统调用接口;第二,它为内核的其他子系统提供接口;brk纲要intbikvoid*enddata_segment;参数end_data_segment:[in]thenewendofthedatasegment.描述brk设置数据段的末端到被勿指定的值中,这个值务必大于文本段的末端,同时小于堆栈末端往常16KB0注意brk系统调用不能被直接调用它被一个改变返回值的libc函数打包,同样,sbrk函数也是被作为一个包来执行的.返回值返回新的数据段的末端假如返回结果不等于被请求的末端,那么说明这里有错误同时内存不能被分配getpagesize纲要size_tgetpagesizevoid;描述获取虚拟子系统页的字节大小,其大小不必与硬盘页的大小相同返回值以字节表示页的大小纲要caddr_tmmapcaddr_taddrsize_tlenintprotintflagsintfdoff_toffset;intmunmapcaddrtaddrsizetIori;参数addr.formmap[in]映射目标的地址.Formunmap[in]非映射区域lerr.[in]映射区域的长度.prot:[in]映射空间的保护.flags:[in]看描述.fd-[in]与映射对应的目标.offset[in]与映射对应的目标起始部分.描述在作业的虚拟地址空间中映射一个文件FI标在一页的大小中没有多重的offset或者者多重的len的情况下,映射空间能够扩展超过被指定的范围Addr仅是一个到系统的线索,用以指示放置映射区域的地方系统可能选择在其他地方映射目标Addr的为零的值告诉系统映射它认为合适地方的目标在一个先前被映射的区域中,一个成功的mmap会删除在那个区域中往常的映射参数将是下列列表中的一个或者多个值PR0T_EXEC被映射的范围是可执行的PROTREAD被映射的范围是可读的PROT_WRITE被映射的范围是可写的标记参数能够是下列列表中的一个或者多个值MAP_ANON新的区域与任何物理文件都没有关联在这种情况下,fd参数用来命名区域假如不需要命名,fd将被设置为-1MAP.FILE新的区域是一个规则文件映射或者者一个字符设置MAPFIXED由于addr系统可能不可能为映射选择其他的内存区域假如这个区域不可用,调用失败MAPJASSEMAPHORE通知系统被映射区域包含信号机MAP.INHERIT同意被映射区域通过实行的系统调用被继承MAP_PRIVATE对被映射区域的修改是非公开的MAP_SHARED对被映射区域的修改是公开的返回值成功的mmap返回新近被映射区域的地址,munmap返回零如若出错,这些调用返回7同时返回下列出错信息之一EACCESS:为被映射区域请求保护与fd模式不一致EINVAL:标记值不正确或者MAPFIXED被请求但地址范围不能是•个多重的页的大小ENOMEM:MAP_FIXED被请求但内存范围不能用于映射或者足够的内存完成调用ENODEV:文件描述符不能被映射EBADFEFAULT.sandswapon纲要intswaponconstchar;intsconstchar*path;参数pa防[in]点到路径到添加/删除描述swapon添加被到交换库路径指定的交换区域S删除被到交换库路径指定的交换区域调用作业务必有超级用户权限返回值如若成功,返回零失败则返回-1同时会反回下列出错信息之一EPERM:调用作业没有超级用户权限EINVAL:路径既不是一个块设备也不是一个规则路径ENOENTorENOMEM.4虚拟文件子系统模块功能概览文件子系统要紧提供卜.列功能:支持多种硬件设备;支持多种逻辑文件系统支持多种可执行文件格式;为多种文件系统与所有硬件设备提供统一的接口;对文件进行高速存取;限制用户对文件的存取权限;全面输入、输出及处理描述文件管理提供两级接口:用户进程可存取的系统调用接口,其它内核子系统使用的内核接口;access概要intaccessconstchar*pathnameintmode;参数pathname:[输入]要测试的文件的路径0加[输入]说明进程要测试的模式描述Checkswhetherthecallingtaskhasthenecessaryaccessrightstoperformoperationsspecifiedbymodeonthe.modeisamaskconsistingofoneormoreofthevaluesR_OKW_OKX_OKandF_OKwhichrespectivelytestifthetakscanreadwriteexecuteortestifthe.Thetestisperformedusingtherealuidandgidofthecallingtask.Onlytheaccessbitsofthetested.检查调用进程是否有必要的访问权限来执行由mode与pathname指定的相应操作Mode是R_OKWOKXOK与FOK中的若干个构成的掩码,这几个值分别测试进程是否能读、写、执行或者者文件是否存在该测试使用调用进程的真实的uid与gid只有文件的访问标志位被测试返回值成功时返回0出错时返回T同时errno被设置为下列值之一EINVAL:如而为非法值EACCESSEFAULTENOENTENOTD1RENOMEMENAMETOOLONG或者者ELOOP.sysinfo概要intsysinfostructsysinfo*info;参数G[输出]存放系统信息的缓冲区描述返回系统信息与统计数据结构如F structsysinfo{longuptime;unsignedlongloads[3];unsignedlongtotalram;unsignedlongfreeram;unsignedlongsharedram;
1.引言
1.1参考资料无
1.2术语与缩写词BottomHalfHandler核心里在队列中的任务的句柄或者指针unsignedlongbufferram;unsignedlongtotalswap;unsignedlongfreeswap;unsignedshortprocs;char_f
[22];/*缓冲区使用内存大小*//*交换空间大小*//*可用交换空间大小*//*当前进程总数*//*Pads结构64bytes*/;返回值成功时返回0出错时返回-1同时errno被设置为EFAULT.chdirandfchdir概要intchdirconstchar*patli;intfchdirintfd;参数3〃[输入]指向新的当前目录的指针々[输入]新目录的文件描述符描述chdir改变当前目录到pa改变fchdir为fd.返回值成功时返回0出错时返回T同时errno被设置为下列值之一对chdir:ENOTDIREACCESSEFAULTENOENTENOMEMENAMETOOLONGEROFS或者者ELOOP.对fchdir:EBADFENOENTENOTDIR或者者EACCESS.chmodandfchmod概要intchmodconstchar*pathmode_tmode;intfchmodintfdmode_tmode;参数田“[输入]指向要修改文件所在的路径戊/[输入]要修改的文件描述符加而[输入]新模式描述chmod改变由path指定的文件的模式到modooFchmod改变由fd指定的文件描述符的模式到加曲如曲的值由卜.列常量的或者运算得到S_ISUID:执行时设置uidS_ISGll:执行时设置gidS_ISVTX:粘贴位S_IRUSR:拥有者可读S」WUSR:拥有者可写S」XUSR:拥有者可执行S」RGRP:拥有者所在组可读S_IWGRP:拥有者所在组可写S_IXGRP:拥有者所在组可执行SJROTH:任何人可读S_IWOTH:任何人可写S」XOTH:任何人可执行返回值成功时返回0出错时返回T同时errno被设置为下列值之一对chmod:EPERMENOTDIREACCESSEFAULTENOENTENOMEMENAMETOOLONGER0FS或者者ELOOP.对fchrnod:EPERMENOENTER0FS或者者EBADF.chownandfchown概要intchownconstchar*pathuid_townergidtgroup;intfchownintfduid_townergid_tgroup;参数输入]指向要修改文件的路径的指针々[输入]指向要修改的文件描述符的指针owner.[输入]新的uidT就不改变gro印[输入]新的gid.-1就不改变描述Chown改变由path指定的文件的uid与gid为ownergroupFchown改变由fd指定的文件描述符的uid与gid为owner与group超级用户能够对文件的uid与gid做任何操作文件拥有者只能改变文件的gid到他所从属的任何组返回值成功时返回0出错时返回T同时errno被设置为下列值之一对chown:EPERMENOTDIREACCESSEFAULTENOENTENOMEMENAMETOOLONGEROFSorELOOP.对fchown:EPERMENOENTEROFSorEBADF.概要intchrootconstchar*pat/i;参数田“[输入]指向新的根目录的指针描述改变当前进程与它所有的子进程的根目录到由path指定的路径该操作为特权指令只有超级用户能够使用它返回值成功时返回0出错时返回T同时errno被设置为下列值之一EPERMENOTDIREACCESSEFAILTENOENTENOMEMENAMETOOLONGEROFSorELOOP.close概要intcloseintfd;参数[输入]要关闭的文件描述符描述关闭文件描述符fd假如fd是最后一个引用文件的描述符,则与该文件有关联的资源将被释放由当前进程拥有的文件锁也将被释放返回值成功时返回0出错时返回T同时crrno被设置为EBADF.creatandopen概要intopenconstchar*pathintflags;intopenconstchar*pathintflagsmode_tmode;intcreatconstcharpathmode_tmode;参数可〃[输入]要生成的新文件的路径/〃而[输入]该文件的新的权限掩码/Vags:[输入]标志描述ope〃打开一个文件flags参数务必给出如下O_RDONLY文件打开为可读0WRONLY文件打开为可写0_RDWR文件打开为可读写下列值可与以上各值中之一相或者
0.CREAT假如文件不存在则生成之O_EXCL使用O_CREAT时,假如文件已经存在,则调用失败测试文件存在同时假如不存在则生成之由POSIX.1标准,该操作是个原子操作O_NOCTTYthenotbecomethecontrolyttyofthetaskeveniftheattyandthetaskdoesnothaveacontrolingterminal.该文件将不可能变成该进程的主控ttyO_TRUNC假如文件已经存在,将其长度减为零O_APPBNI文件打开为可添加文件指针总在文件尾O_NONBLOCK或者者O_NDELAY处理文件时不被堵塞O_SYNC文件缓冲区总是与磁盘文件同步写调用堵塞直到数据完全被写到磁盘上该操作不是POSIX兼容的返回值成功时,该文件的描述符被返回该文件的描述符是未用的描述符中最小的出错时,返回Terror设置为下列之一EISDIRETXTBSYEFAULTEACCESSENAMETOOLONGENOENTENOTDIREMFILEENFILEENOMEMEROFSELOOPEEXISTENOSPC.dupanddup2概要intdupintoldfd;intdup2intoldfdintnewfd;参数o/dfd:[输入]要拷贝的文件描述符[输入]目的文件描述符描述dup复制一个文件描述符为最小的未用的文件描述符Dup2复制文件描述符到另一指定描述符假如目的描述符已被使用,就被关闭两个描述符共享除close-on-exec标志外的所有比如文件锁,位置等等返回值成功时,新文件描述符被返回出错时,返回Terror设置为下列之一EBADForEMFILE.fcntl概要intfcntlintfdintcmd;intfcntlintfdintcmdlongarg\参数[输入]要操作的文件描述符[输入]要执行的操作arg[输入]该操作可选的参数描述该调用直接对文件描述符操作可能的操作有F_IUPFI复制fd到由arg指定的新的文件描述符假如arg指定的描述符已被打开,则该描述符先被关闭F_GETFD返回fd的close-on-exec标志F_SETFD设置fd的close-on-exec标志F_GETFL返回描述符的标志F_SETFL设置描述符的标志为arg.F_GETOWN返回socket的进程组的进程idF_SET0WN设置socket的进程组的进程idF_RDLCK设置可共享的读锁F_WRLCK设置互斥的写锁FJJNLCK解锁.返回值成功时,依靠cmd参数FDLPFD新的描述符F_GETFDclose-on-exec标志的值F_GETFL文件描述符标志的值F_GET0WN文件标志符的拥有者出错是返回T,errno被设置为下列值之一EINVALEBADFEAGAINENOLCKEFAULTERESTARTSYS.fstatstatandIstat概要intfstatintfdtstructstat;intstatchar*pathstructstat*bu/;intIstatchar*path、structstat参数[输入]要取得信息的文件描述符外力[输入]要取得信息的文件路径加£[输出]指向存储信息的缓冲区的指针描述返回一个stat结构,格式如下structstat{};改变的时间由对inode的修改决定fstat从文件描述符获取信息stat与Istal从文件路径获取信息但Istat用与linki本身,而不是它所指向的文件返回值Onsuccesszeroisreturned.Onerror-1isreturnedanderrnoissettooneofthefollowingvalues:forstatorIstat:EFAULTENAMETOOLONGENOMEMENOENTENOTDIREACCESS.forfstat:EBADFSEFAULTfstatfsandstatfs概要intfstatfsintfdstructstatfs;intstatfschar*pathstructstatfs;参数fd\[输入]thewewanttogettheinformationfrom.path.[,俞入]thewewanttogettheinformationfrom.buf:[out]pointstothebufferthatwillcontaintheinformation.描述ThosecallsreturninformationabouttheonwhichthefilesA/orpathresides.Thebufferhasthefollowingformat:/*totalnumberoffreeblocks*//*numberoffreeblocksfornormaluser*//*numberof*//*numberoffree*//*id*//*maximumlength*//*unused*/;返回值成功时返回0出错时返回T同时errno被设置为:对fstatfs:EBADFSEFAULTENOSYSorEI
0.对statfs:EINVALENOTDIRENAMETOOLONGENOENTEACCESSELOOPEFAULTENOSYSorEIO.fsync概要intfsyncintfd;描述将磁盘文件的状态信息与core中的进行同步比如刷新文件缓冲区参数fd[输入]要同步的文件返回值成功时返回0出错时返回T同时errn被设置为EINVALEBADForEI
0.14ftruncateandtruncate概要intftruncateintfdsizetlength;inttruncatechar*pathsize_tlength;描述将文件减小到指定的尺寸对ftruncate文件务必被打开为可写参数〃[输入]要减小的文件描述符8幼[输入]指向要减小文件路径的指针[输入]新的文件大小返回值成功时返回0出错时返回T同时errno被设置为对ftruncate:ENOENTEBADFEACCESS.对truncate:ENOTDIREINVALENAMETOOLONGENOENTEACCESSELOOPEISDIREROFSETXTBSYEIOorEFAULT.概要intioctlintdintcmd…;参数d[输入]要操作的文件描述符[输入]请求的类型argp:依靠于请求描述操作特殊字符设备的io参数cmd可取的值如下FIOCLEX设置文件的close-on-exec标志FIONCLEX清除文件的close-on-exec标志FIOASYNC假如也•如为真设置O_SYNC标志否则清除该标志FIOSETOWN设置文件的拥有者为协apidoFIOGETOWN返回指向arp的文件的拥有者返回值成功时返回0出错时返回T同时errno被设置为EINVAL:cmd或者者argp为非法值ENOTTY:d不是个字符特殊设备或者者对d的请求不合法EBADF.16link定义intlinkconstchar*srcconstchar力;参数src:[in]指向我们想要添加链接的文件new:[in]指向新链接接的路径.描述建立新的到文件的绝对链接hardlink.没有办法区别这些链接.返回值成功时返回
0.发生错误时返回Terrno被设置成为如下值之一EPERM:文件系统不支持绝对链接、/4双力是当前目录.或者目录入口...EXDEVEFAULTEACCESSENAMETOOI.ONGENOENTENOTDIRENOMEMEROFSEEXISTEMLINKELOOP与ESPC.17Iseek定义offtlseekintfdoff_toffsetintwhence;参数f±[in]被执行操作的文件的描述符.offset[in]偏移修正值.whence-[in]标示出如何修改该偏移.描述改变文件描述符的文件读写偏移.建sei参数根据舫的下列不一致值具有不一致的含义SEEK_SEToffset为新的读写偏移值.SEEK_CUR新的偏移为当前偏移加上offset.SEEKEND新的偏移为文件末尾加上offset.假如新偏移超过文件末尾,新增的部分被填充
0.返回值成功时返回新的读写偏移,失败时返回
7.errno被设置为如下值之一ElNVAL:whence不合法.EBADF.18mkdir定义intmkdirconstchar*pat/imode_tmode;参数path[in]指向新目录的路径.mode:[in]新目录的读写权限位.描述建立一个新的目录,uid与调用者的uid相同.gid与新目录所在的父目录相同.返回值成功时返回0失败时返回T同时errno被设置为下列值之一EINVAL:路径中包含不再ASCII
[0127]范围内的字符.ENOTDJRENAMETOOLONGENOENTEACCESSELOOPEPERMEROFSEEXISTENOSPCEDQUOTEI0与EFAULT.19mknod定义intmknodconstchar*pathmode_tmodedev_tde;参数path[in]指向新设备文件的路径.mode:[in]指定何种设备文件被创建.不要该参数来指定读写权限.dev.[in]新设备文件的主设备号与从设备号.描述建立一个特定的设备文件节点.只有超级用户才能够使用本函数.读写权限位的设置与当前调用者的umask相同.假如而没有指出是何种设备文件,曲/将被忽略.返回值成功时返回0失败时返回T同时ebno将会被设置为下列值之一E1NVAL:路径包含超出ASCII
[0127]范围的字符.EPERM:调用者没有超级用户权限.ENOTDIRENAMETOOLONGENOENTEACCESSELOOPEIOENOSPCEDQUOTEROFSEEXIST与EFAULT.纲要intmountconstchar^specialfileconstchar*dirconstchar*unsignedlongrwflagconstvoid^data;intumountconstchar*specialfi10;参数specialfile-[in]要装载文件系统的路径.dir.[in]文件系统装载点路径.[in]文件系统类型.rwflag\[in]文件系统访问权限.data-[in]文件系统依靠参数.描述mount装载文件系统umount卸载文件系统.只有超级用户由此权限rwflag取下列值MS_RDONLY只读MS_NOSUID忽略suid与sgid位MS_NODEV不同意访问设备文件MS_NOEXEC不同意文件执行MS_SYNC写同步MSREMOUNT修改装载FS.标志返回值EPERMENODEVENOTBLKENXIOEMFILEEFALLTENOMEMEINVALEBUSYENOTDIRENOENTENAMETOOLONGELOOPEROFS.21pipe纲要intpipeint
[2];参数[输出]包含结点的数组.描述创建一对管道节点是到
[0].返回值成功返回0错误返回-1设置errnoEMFILEEN.
2.设计概览设计的驱动因素与各自重要性的排序(比如,功能、性能、可靠性、硬件、内存考虑等等)在设计过程中,要紧要考虑的有下列几点跨平台的可移植性,在保证功能与不牺牲性能的前提下尽量减小核心的体积,为今后进一步开发留卜.空间与便利其中,最要紧的就是可移植性,这是这个嵌入式系统的特色减少核心的体积能够降低成本,但是随着当今硬件生产技术的提高完善,这一点已经不像过去那样重要了,因此在裁剪核心的同时要避免牺牲性能与功能不一致设计方案的评价内核使用层次式结构这样的结构大概层次清晰,易于修改但是它严重降低了内核的效率由于当高层次的函数调用底层提供的功能时,可能需要跨越几个层次,这样会增加系统开销而且,在系统核心中,各个部分互相提供功能调用,假如严格按照层次式结构组织将打破核心中各个功能部分的有机结构,使结构变的混乱内核使用整体式结构这样的结构的特点是这个内核由许多过程构成,但是不像在层次式结构中那样,每个过程只能被紧挨着它的上层调用在整体式结构中,每个过程独立编译后,连接程序将其连接成为一个单独的目标程序,每个过程都对其它过程可见这样的结构尽管在内部关系上确实变的复杂了(各个模块间是网状的结构),但是在调用关系与提供服务的角度来看变的简单清晰也更直观了,子系统间易于访问,内核工作效率较高而且也有助于不一致的人参与不一致过程的开发因此对内核的组织使用整体式结构对所选设计方案总体结构图示及讨论read纲要intreadintfdchar*bufsize_tcount;参数fd:[in]要读取得文件描述符buf:[out]容纳读取信息的缓冲区.count:[in]如£的最大数目描述从fd读取count字节到buf返回值成功返回0错误返回T设置ei-rnE1NVAL:不能读取EINTREAGAINEISDIREBADFandEFAULT.readdir纲要structdirent*readdirDIR;参数dir.[in]一个目录的文件描述符.描述返回一个dirent结构返回值成功返回指向dirent结构的一个指针.错误返回-1设置errnoEBADF.readlink纲要intreadlinkconstchar*pathchar*bufsize_tbufsiz;参数path[in]读取得逻辑链接buf:[out]信息存放的缓冲区.bufsiz:[in]t缓冲区最大尺寸.描述读取逻辑链接的内容.返回值成功返回读取得字节数,错误返回T设置enmEINVAL:文件不是一个逻辑链接ENOTDIRENAMETOOLONGENOENTEACCESSELOOPEI0orEFAULT.rename纲要intremimeconstchar*srcconstchar*c/est;参数src:[in]t要重命名的文件dest:[in]文件新名.描述重命名或者移动文件,目标文件假如存在着被覆盖返回值成功返回0错误返回-1设置errno.EISDIR:dost是一个以存在的目录EPERM:文件系统不支持重命名EXDEVENOTEMPTYEMLINKENOTDIREFAULTEACCESSENAMETOOLONGEN0ENTENOMEMEROFSELOOPorENOSPC.rmdir纲要intrmdirconstchar;参数网必[in]删除目录的路径描述删除一个目录,目录为空返回值成功返回0错误返回-1设置EPERM:文件系统不支持删除目录或者目录包含正执行的进程EFAULTEACCESSENAMETOOLONGENOENTENOTDIRENOTEMPTYEBUSYEN0MEMEROFSorELOOP纲要intselectintnumfdsfdset*readfdsfdset*writefdsfdset生exceptfds、structtimoval*timeout;宏工具FD_CLRintfdyfd_set*se£;FD_ISSETintfdfdset*set;FDSETintfdyfdset*se£;FD_ZEROfd_set*set;参数numfds:[in]监测文件描述符的数目readfds\[inout]入口,可读文件描述符.出口,能读的文件描述符.writefds:[inout]入口,可写文件描述符.出口,能写的文件描述符.exceptfds:[inout]入口,不监测的文件描述符.出口,排除的文件描述符.timeout:[inout]入口超时时间.出口,剩余时间.描述使进程睡眠直到满足条件的一些文件描述符可用或者超时,要紧测试文件的三种条件:readfds.文件可读?writefds:文件可写?exce:例外文件?上述条件有一个成立返回由四个工具对文件描述符进行操作FD_SET设置文件描述符标志FD_CLR清除文件描述符标志FD_ZERO清除设置FD_ISSET假如设置文件描述符标志返回true返回值成功返回0错误返回-1设置crrnEBADFEINTREINVALorENOMEMsymlink纲要intsymlinkconstchar*srcconstchar*desR;参数src\[in]新链接desf.[in]所指文件.描述创建从src到的逻辑连接返回值成功返I可0错误返I可T设置errnoEPERM:文件系统不支持逻辑链接EFAULTEACCESSENAMETOOLONGENOENTENOTDIRENOMEMEROFSEEXISTELOOPENOSPCsync纲要intsyncvoid;描述使硬盘上的文件系统与内部文件系统同步返回值0纲要intumaskintmas/d;参数mask;[in]新掩码.描述去掉掩码maskk
0777.返回值掩码前的值unlink纲要intuniinkconstchar*pat参数path[in]文件的路径.描述删除一个文件的连接返回值成功返回0错误返回T设置errnEPERM:没有权限EFAULTEACCESSENAMETOOLONGENOENTENOTDIREISDIRENOMEMEROFS.write纲要sizejwriteintfdconstcharsize_tcount;参数fd-[in]读取得文件描述符.buf:[out]存储数据的缓冲区.count-[in]读取得最大块数.描述从忿中读count字节返回值成功返回读取得字节数错误返回T设置.crrnoEINVAL:不能写fd.EBADFEFAULTEPIPEtEINTREAGAINENOSPC.
3.5进程间通信IPC子系统
3.
5.1模块功能概览为了进程能在同一项任务上协调工作,它们彼此之间务必能够进行通信本内核支持许多不一致形式的进程间通信机制•信号信号能够通知进程系统正在出现的事件,一个信号具有改变同意者进程的状态的效果这取决于信号的含义内核能够给任何正在执行着的进程发信号用户进程也能够给同组的其它进程发信号•文件锁核心同意用户进程限制其它进程对一个文件全部或者是部分的存取这是通过文件锁机制实现的•管道管道是一个固定大小的缓冲区管道与命名管道的实现比较相似当管道建立时,返回一个文件描述符,关于打开的管道,给它分配一页的内存,然后把这页内存当作一个循环缓冲区管道写函数通过将字节复制到虚拟文件系统索引节点指向的物理内存而写入数据而管道读函数则通过复制物理内存中的字节而读出数据当缓冲区满时,写进程堵塞,假如要读的数据大于缓冲区能提供的数据,那么读进程也堵塞核心利用一定的机制来同步对管道的访问,为此,核心使用了锁、等待队列与信号•等待队列核心提供的等待队列是一个简单的数据结构该队列中的元素包含一个指向进程task_stuct结构的指针,与一个指向等待队列中卜一个元素的指针关于添加到某个等待队列的进程来说,它可能是可中断的,也可能是不可中断的当可中断的进程在等待队列中等待时,它能够被诸如定时器到期或者是信号的发送等事件中断•信号量信号量是用等待队列实现的每一个信号量都有一个有关的值信号量与消息队列与共享内存有相同的机制•消息队列消息队列是一个线性链表假如该进程能够向消息队列写入,则消息能够复制到消息队列的末尾在进行复制之前,务必推断消息队列当前是否已满消息的具体内容与应用程序有关,由参与通讯的进程约定•共享内存共享内存是IPC中最快的一种通信形式,这种机制同意共享内存的一个区域共享内存区域的建M是由内存管理系统完成的,能够用系统调用巴共享页放在用户进程的虚拟内存空间,也能够用系统调用删除共享页•套节口本核心支持Unix套节口Unixsockets的实现类似于管道,从某种意义上说,它们都是基于内存中一页的循环缓冲区,但sockets给每一个通信方向提供独立的缓冲区
3.
5.2全面输入、输出及处理描述
1.intsys_ipcuintcallintfirstintsecondintthirdvoid*ptr;参数call:[in]询问ipc是否完成firstsecondthird:参数.依靠于call.ptr:[in]指向一个缓冲区.描述这是一个为其他ipc调用的内核包装.调用他能够得到下列参数SEM0Psys_semopfirststructsembuf*ptrsecond;SEMGETsys_semgetfirstsecondthird;SEMCTLsysscmctlfirstsecondthirdptr;MSGSNDsys_msgsndfirststructmsgbuf*ptrsecondthird;MSGRCVstructipc_kludgetmp;if!ptrreturn-EINVAL;memcpy_fromfstmpstructipc_kludge*ptrsizeoftmp;returnsysmsgrcvfirsttmp.msgpsecondtmp.msgtypthird;MSGGETsysmsggetkeytfirstsecond;MSGCTLsysmsgctlfirstsecondstructmsqidds*ptr;SHMATsys_shmatfirstchar*ptrsecondulong*third;SHMDTsysshmdtchar*ptr;S11MGETsysshmgetfirstsecondthird;SHMCTLsys_shmct1firstsecondstructshmid_ds*ptr;
2.intmsgctlintmsqidintcmdstructmsqidds*buf;参数msqid:[in]操作信息队列.cmd:[in]信息队列中的操作过程.buf:t依靠cmd解释这个变量.描述处理一个信息队列.cmd也许是一下中的一种IPC_STAT从队列中找到一些信息.IPC_SET修改队列中的一些参数.buf指向一个nisqid_ds结构.仅需更换的参数为msgpermuidmsgporm.gidmsgpcrm.mode最小仅需9bitsandmsg_qbytes.只有下列几种情况才能调用uid创建的uid;该队列的所有者的uidor超级用户的uid.只有超级用户才能使msgqbytes超过MSGMNB的系统限制.IPC_RMI1立刻撤销信息队列同时唤醒所有的处于睡眠状态的读写处理.返回值成功则返回
0.出错则返回7并设置错误号为下列值中的一个EACCESS:呼叫者尝试对•IPC_STAT操作但是没有读此队列权限.EIDRU:该队列已经被删除.EINVAL:cmd或者msqid的值有错误.EPERM:正在尝试操作一个越权的操作.EFAULT.
3.intmsggetkey_tkeyintmsgflg;参数key:[in]获得一个信息队列的标识.msgflg:[in]一些标记见描述.描述获得一个信息队列的标识.假如key的值是IPC_PRIVATE表示一个新的队列被创建同时结果在msgflg.可能的msgflg的值有1PC_CREAT假如这个key不存在,为他创建一个新的队列.IPC_EXCL假如这个key己经连接了一个队列,那么呼叫失败.Msgflg的后9位时新队列的制定权限位.他们与文件系统的权限的规定与含义相同.但是,这些许但是无意义的.在创建一个队列时,系统为这个新的队列在msqid_ds中设置恰当的参数在访问一个已经存在的队列时,假如这个队列能够被访问,系统只是做一些校验工作返回值成功,将返回信队列的identificator.失败则返回7并设置错误号位下列值中的一个EACCESS:该任务没有访问该队列的许可EEXIST:IPC_CREAT与IPC_EXCL没有被指定同时该队列已经存在EIDRM:该信息队列不再存在于该系统中EN0ENT:该信息队列从未存在过EN0SPC:系统已经达到了信息队列总数的最大值EN0MEM
4.intmsgsndintmsqidstructmsgbuf*msgpintmsgszintmsgflg;intmsgrcvintmsqidstructmsgbuf*msgpintmsgszlongmsgtypintmsgflg;参数msqid:[in]该信息队列.msgp:为msgsnd[in]指定要发送的信息.为msgrcv[out]指定存放该信息的缓冲区.msgsz:[in]按正文的大小分配缓冲区最大的尺寸是MSGMAX通常为4080bytesomsgflg:[in]标记间描述.msgtyp:[in]同意的信息类型.描述msgp务必指向一个具有一下结构的缓冲区structmsgbuf{longmtype;/*信息类型,务必>0*/charmtext[l];/*信息数据*/}调用过程务必有该队列的都权限才那调用msgrcv同时有该队列的写权限才能调用msgsnd.msgsnd尝试把信息加入队列.假如msglfg被设置为IPC_NOWAIT同时队列已经满了,则调用失败.否则调用被堵塞.假如发送成功,目息队列别如下更新msg_lspid被设置程调用进程的进程编号.msg_qnum被增加
1.msg_stime被设置为当前时间.msgrcv从消息队列读出一个消息.假如被读出的消息的长度大于msgsz则调用失败.假如长度过大,但是MSG_N0ERR0R标记被设置,消息将被删节被删节的部分将永远丢失.能够通过msglyp的值选择读出的消息msgtyp为0:这种情况下消息队列中的第一个消息被读出.msgtyp大于0:假如标记MSGEXCEPT没有被设置,队列中第一个类型为msgtyp的消息将被读出,否则队列中第一个类型不是msgtyp的消息将被读出msgtyp小于0:队列中第一个类型在[1-msgtyp]范围内的消息将被读出假如标记IPC_NOWAIT被设置同时消息队列中没有想要的类型的消息,则调用失败,否则调用再堵塞.调用成功时,队列数据结构将这样更新msg」i・pid被设置为调用进程的进程号.msg_qnum减少
1.msg_rtime被设置为当前时间.返回值调用成功msgsnd返回0msgrcv返回取得的字节数.调用失败返回-1同时错误代码将按如下设置关于msgsnd:EAGAIN:IPCNOWAIT被设置同时队列已满.EACCESS:调用者没有该消息队列的写权限.EIDRM:该队列己经被删除.EINVAL:不合法的msqidmsgsz或者是mtype值.EFAILTEINTRandENOMEM.关于msgrcv:E2BIG:MSG_NOERROR没有被设置同时要读的消息大小大于msgsz.EACCESS:调用进程没有该消息队列的读权限.E1DRM:该队列已经被删除.EINVAL:不合法的msqid或者是msgsz值.ENOMSG:IPCNOWAIT被设置消息队列中没有类型的消息.EFAULTEINTR
5.intsemctl(intsemidintsemnunintcmdunionsemunarg);参数semid:[传入]要操作的信号灯集合.scmnum:[传入]要操作的信号灯集合中的一个(表示第一个).cmd:[传入]要执行的操作arg:[输出]一个操作参数(见描述).描述操作一个信号灯集合或者是信号灯集合中的一些成员.可选的cmd参数为IPC.STAT获得信号灯集合的信息.调用继承务必拥有该信号灯集合的读权限IPC.SET修改信号等集合中的一个信号等的semid_ds结构中的某些成员.能够被修改的成员是semperm.uidsemperm.gid与semperm.mode中的低9位.调用者务必是该信号灯建合的拥有者统者是创建者后世初级用户信号灯集合的sem.ctime字段被设置为当前时间IPC.RMID删除信号灯集合并唤醒那些被该信号等集合堵塞的进程只有该信号灯集合的拥有者或者是创建者或者是超级用户能够使用这个选项GETALL返回队列中所有信号灯的scmval值GETNCNT返回等待该信号灯集合中的某个信号灯增加的进程的数目调用者务必拥有该信号灯队列的读权限GETPPI1)返回最近上一次对该信号灯集合中的某个信号的操作的进程的进程号.调用者务必拥有该信号灯队列的读权限GETVAL返回信号灯集合中的某个信号灯的值.调用者务必拥有该信号灯队列的读权限GETZCNT返回等待该信号灯集合中的某个信号灯清零的进程的数目调用者务必拥有该信号灯队列的读权限SETALL将信号灯集合中的所有信号灯设置为某一值调用者务必拥有该信号灯队列的修改权限SETVAL将信号灯集合中的某一信号灯设置为某一值调用者务必拥有该信号灯队列的修改权限返回值调用成功,对不一致的cmd参数返回GETNCNT等待进程的数量(见描述).GETP1D进程的进程号(见描述).GETVAL信号灯值GETZCNT等待进程的数量(见描述).对其它的cmd参数取值,它返回0调用失败,调用返回-1返回的错误代码为下列取值之一EACCESSEFAULTEIDRMEINVAL:非法的cmd或者是semid取值.EPERM:试图使用IPC_SET或者是IPC.RMID的参数的调用者不是信号灯集合的拥有者或者是创建者或者是超级用户ERANGE:对信号灯的设定值超出范围
6.intsemget(key_tkeyintnsemsintsemflg);参数key:[传入]信号灯集合标示nsems:[传入]信号灯集合信号灯的数目.semflg:[传入]标记(见描述).描述获得一个信号灯集合的标示.假如key是IPC_PRIVATE一个新的集合将被创建否则,返回结构将根据semflg的取值IPC.CREAT假如key所标示的信号灯集合不存在,则创建一个新的队列.IPC_EXCL假如key所表示的队列已经存在,则调用失败.Semflg的低9位描述这个新的信号灯集合的权限.他们与文件权限的有相同的布局.但是,执行权限对信号灯集合没有意义.当创建新的信号灯集合时,系统根据新的集合在semid_ds结构中设置相应的值当访问一个以存在的信号灯集合时,系统将检查该集合是否能够被访问返回值调用成功,系统返回新的信号灯集合表示符.调用失败时-1被返回同时错误代码被设置为下列值之一EACCESS:调用进程对该信号灯集合没有访问权限EEXIST:IPC_CREAT与IPC_EXCL被设置表示该信号灯集合已经存在EIDRM:该信号灯集合将不在系统中出现.EN0ENT:该信号灯集合不存在.ENOSPC:信号灯集合中系统同意的信号灯的最大数目已经达到.ENOMEM
7.intsemopintsemidstructsembuf*sopsunsignednsops;参数semid:[输入]执行操作的信号灯集sops:[输入]指向要执行的操作矩阵的指针nsops:[输入]sops的元素数目.描述在一个信号灯集合上执行操作Sops的参数为一sembuf结构,格式为shortsem_num信号灯要操作的对象shortsemop;操作shortsem_flg;sem_flg能够是IPCNOWAIT用于不堵塞调用,SEMUNDO指定一能够被终止的操殖单独而操作被执行当且仅当所有的操作成功Cmd的可能值为cmd大于0:cmd的值被加到信号灯上调用进程务必有改变信号灯集合的权限cmd等于0:假如信号灯值为0调用返回否则,调用堵塞直到信号灯的值变为0信号灯集合被移去,或者者一个信号产生调用进程务必有信号灯集合上的读权限cmd小于0:假如信号灯的值大于cmd的绝对值,信号灯的值减去cmd的值,调用返回否则,调用堵塞直到信号灯的值大于cmd的绝对值,这时,调用返回信号灯集合被移去,或者者有信号发生调用进程务必有信号灯集合上的写限任何时候调用成功,信号灯集合的se叩id元素被设置为当前进程的pid同时sem_ctime与sem_olime被设置为当前时间返回值成功时,返回新的共享内存块标志符出错时,返回Tcrrn被设置为下列值:E2BIG:太多的操作请求最大值为SEM0PM.kFBIG:某些操作的semaphore越界EINVAL:semid或者nsops值非法.ERANGE:semaphore值越界EACCESSEAGAINEFAULTEIDRMEINTR或者EN0MEM.
8.char*shmatintshmidchar*shmaddrintshmflg;intshmdtchar*shmaddr;参数shmid:[输入]共享内存标志符shmaddr:[输入]共享内存块的起始地址shmflg:[输入]标志描述Shmat将一共享内存标志符与进程地址空间的一块内存区域有关联假如shmaddr为零,与共享内存有关联的内存区域被系统选择假如shmaddr不为零,SIIM_RND标志被指定,则地址以SHMBLA的整数倍取整假如SHMRDONLY被指定,进程务必有该内存共享块的读权限,同时它被与之关联为只读否则,进程务必有读写权限同时被关联为可读写成功时,下面的shmid_ds结构的成员被修改内核由5个要紧的子系统构成,它们之间的大致依靠关系如图FS文件系统IPC进程间通信UM内存管理NET网络模块SCHED进程调度进程调度子系统处于核心地位,其它子系统要完成操作都需要它来调度以占用系统资源完成自己的操作文件系统需要利用网络模块支持网络文件系统,也需要利用内存管理支持RAMDISK设备内存管理利用文件系统支持交换,交换进程定期的由调度程序调度,这也是内存管理依靠于进程调度的原因进程间通信子系统要依靠内存管理支持共享内存通信机制进程调度子系统需要内存管理的支持来完成创建进程等操作
2.4开发环境如开发语言、硬件、外设等等内核由GNUC语言及汇编语言开发硬件平台是i386嵌入式平台所支持的外设诸如标准PC的外设,与一些基本的嵌入式系统的硬件设备如网络设备,显示设备,外存,音频设备,视频设备等
3.设计描述
3.1全局数据结构全局数据结构的描述block_dev_struct数据结构用来登记块设备以被缓冲区使用structblkdevstructvoid*request_fnvoid;structrequest*currentrequest;structrequestplug;structtq_structplug_tq;shm_atime被设置为当前时间shmIpid被设置为当前pid.shm_nattch力口一Shmdt脱离被shmat有关联的共享内存块Shmaddr的参数务必与shmat关联时的相同失败时,下面的shmid_ds结构的成员被修改shm_dtime被设置为当前时间.shm_lpid被设置为当前pid.shm_nattch减一假如它变为零,共享内存块将被标记为deletionm该内存块将被删除关联的内存块能够通过fork调用继承在执行exec或者者exit调用后,它们被脱离关联返回值成功时,shmat返回新的内存块的地址,shmdt返回0失败时,都返回TErrno被设置为下面之一对shmat:EACCESS:没有足够权限EINVAL:shmid或者shmaddr非法.EN0MEM.对shmdt:对非法的shmaddr唯一的可能值是EINVAL
9.intshmctlintshmidintcmdstructshmidds*buf;参数shmid:[输入]要操作的内存块cmd:[输入]要实施的操作buf:[输入输出]操作的参数描述该调用处理共享内存块的一些操作用参数shmid_ds结构格式如下structshmid_ds{/*thefollowingareprivate*/unsignedshortshm_npages;/*内存块大小pages*/unsignedlong*shm_pages;/*arrayofptrstoframes-SUMMAX*/structshmdesc*attaches;/*依附进程的描述符*/};cmd能够使用下列值IPC_STAT找到内存块的shmid_ds结构调用进程务必有在该共享内存块的读权IPJSET设置内存块的shmidds结构调用进程务必有在该共享内存块的修改权IPC_RMID标记共享内存块为已破坏调用进程务必有在该共享内存块的生成者相同的uidSHNLLOCK防止内存块被交换到磁盘上只有拥有超级用户特权的进程才能够使用该命令SH.M_UNLCK同意内存块被交换到磁盘上只有拥有超级用户特权的进程才能够使甫该命令返回值成功时,返回新的共享内存块标志符出错时,返回Terrno被设置为下列值:EINVAL:shmid或者者cmd非法EPERM:调用进程没有足够的权限在该内存块执行操作EFAULTEIDRM.
10.intshmgetkeytkeyintsizeintshmflg;参数key:[输入]共享内存块标志符size:[输入]内存块大小shmflg:[输入]标志描述获取一个共享内存块的标志符假如key是IPC_PRIVATE则生成一新块,否则,结果依靠于shmflg的值IPC_CREAT为该key生成一新块,假如它还不存在IPC_EXCL假如已经有块关联与该key则该调用失败大小的值以PAGE_SIZE的倍数取整Shmflg的低9位指定新共享内存块的使用权限与文件的权限设置有相同的布局与意义但是,块的执行权限没有意义当生成一新块时,系统设置相应的参数到shmid_ds结构中当访问一己存在的块时,系统简单地检杳是否块可访问返回值成功时,返回新的共享内存块标志符出错时,返回-1errno被设置为下列值:EACCESS:进程没有该共享块的访问权限EEXIST:IPC_CREAT与IPC_EXCL被指定同时共享块已经存在EIDRM:共享块不再存在ENOENT:共享块从不存在ENOSPC:已达到系统的共享内存块数目的最大值EINVAL:大小值超出范围[SHMMINSHMMAX]ENOMEM
3.6网络模块NET子系统模块功能概览核心的网络系统支持两个机器间的网络连接与sockets通信模型网络模块提供了两种传输协议,即不可靠的、基于消息的UDP传输协议与可靠的基于流的TCP传输协议它们是在IP网络协议之上实现的最后,IP协议位于设备驱动程序之上:
3.
6.2全面输入、输出及处理描述
1.intaccept(intsstructsockaddr*addrint*addrlen);参数s:[in]网络连接.addr:[out]缓冲区的地址,缓冲区填写连接实体的地址addrlen:[out]对输入,包含地址的最大长度(以字节计),对输出,包含地址的实际长度(以字节计)描述假如连接在sockets上排队,队列中的第一个连接就出队,打开一个新与sockets一样属性的socket并返回假如sockets上没有连接那么当在sockets上有一个新的连接请求时socket是blocking的就调用模块;否则条用返回错误码sockets—直处于打开状态连接的实体的地址返回在addr中,addr的格式根据网络的类型的不一致而不一致Accep并不向连接的实体返回确认信息返回值成功,调用返回一个正值,代表新的socket的文件描述符错误,返回T与一些errno下面是他们代表的值EOPNOTSUPP:所指的socket不是SOCK_STREAM类型的EW0ULDBL0CK:socket被标忐是non-blocking,而且没有连接在排队EBADFENOTSOCKorEFALLT
2.intbind(intsockfdstructsockaddr*my_addrintaddrlen);参数sockfd:[in]要绑定的socket.myaddr:[in]要将socket绑定到的地址.addrlen:[in]地址的长度(以字节计).描述将socketsockfd绑定到本地地址my_addr.地址的格式与网络有关.返回值成功,返回0失败,返回T与errno下面是urno的值.EINVAL:这个socket已经绑定到了一个地址,或者者addrlon无效,或者者socket不是AF.UNIX族的.EACCESS:使用的地址是留给超级用户使用的保留地址,这个调用没有超级用户的权限或者者调用没有足够的存取权限ENAMETOOLONG:my_addr太长.EBADFEROFSEFAULTENOENTENOMEMENOTDIRorELOOP.
3.intconnectintsockfdstructsockaddr*servaddrintaddrlen;参数:sockfd:[in]要连接的socket.servaddr:[in]要连接的远端地址.addrlen:[in]serv_addr的长度以字节计描述假如一个SOCK_DGRAM类型的端口,连接socketsockfd到一个serv_addr指定的远端地址,数据包的的端口就能够调用连接多次改变远端地址假如端口是SOCK_STREAM类型的,他能够连接到其他的端口,这样的话serv_addr的格式就依靠于端口的通福空间.个stream端口只调用连接connect一次.返回值成功,返回0失败,返回T与errn,下面是errno的值EINVAL:端口处于一些极端状态既没有“连接”,也没有“不连接””EBADFENOTSOCKEISCONNEALREADYEAGAINEOPNOTSUPPEINPROGRESSERESTARTSYS.
4.intgetdomainnamechar*namesize]len;intsetdomainnameconstchar*namesizetlen;参数name:对getdomainname[out]指向包含了域名的缓冲区Forsetdomeiinname[in]指向包含了一个新域名的缓冲区len:[in]域名的最大长度描述取得或者设置机器的域名返回值成功,返回0失败,返回T与errno下面是errno的值对getdomainname:EINVAL:名字是空的NULL或者者域名长于len.对setdomainname:EPERM:调用者不是超级用户superuser.EINVAL:len太长了.
5.longintgethostidvoid;intsethostidlonginthostid;描述gethostidr返回主机的id号,sethostid设置主机的id号.主机的id号通常是主机的网络地址返回值gethostid返回32位的主机的id号.
6.intgethostnamechar*namcsizetlen;intsethostnameconstchar*namesizetlen;参数name:对gethostname[out]指向包含了主机名的缓冲区.对sethostname[in]指向包含了新的主机名的缓冲区.len:[in]主机名的最大长度.描述gethostname返回现在主机的主机名,sethostname设置主机的主机名.只有超级用户才能够调用1sethostname.返回值成功,返回0失败,返回T与Im,下面是门*no的值.对ofgethostname:EINVAL:名字是空的NULL或者者主机名长于len.对sethostname:EPERM:调用者不是超级用户superuser.EINVAL:len太长了
7.intgetpeernameintsstructsockaddr*nameint*namelen;参数:s:[in]端口.name:[out]指向包含了名字的缓冲区namelen:[inout]名字的最大长度.描述返回端口连接的远端对等机器的名字假如缓冲区太小,返回名字的前段会被冲掉返回值成功,返回0失败,返回T与errno下面是errno的值.EBADFENOSOCKENOTCONNENOBUFSandEFAULT.
8.intgetsocknameintsstructsockaddr*nameint*namelen;参数s:[in]存取端口.name:[out]存放端口名的缓冲区.namelen:[inout]对进入,名字的最大长度对返I可来讲,包含了名字的实际长度.描述取得本地的端口名.返回值成功,返回0失败,返回T与errno下面是errno的值.EBADFENOTSOCKENOBUFSandEFAULT.
9.intgetsockoptintsintlevelintoptnamevoid*optvalint*optlen;intsetsockoptintsintlevelintoptnameconstvoid*optvalintoptlen;参数s:[in]我们要工作的端口.level:[in]协议的级别heprotocolleveltoaccess.optname:[in]theoptiontoaccess.optval:对getsockopt[out]指向存放选项值的缓冲区.对setsockopt[in]指向存放新的选项值的缓冲区optlen:对getsockopt[inout]对进入optval的最大长度,对返回,这一选项的实际长度对setsockopt新选项的长度.描述协议级别可能的值SOJSOCKET与任何有效的协议码.在端口级别上,选项的0是布尔值的flaseand非0的值is布尔值的true.下面的选项S0_DEBUG:通过协议模块激活或者者不激活调试信息纪录optval是一个布尔值整型.SOREUSEADDR使本地地址能够或者不能够重复使用,能够重复使用的话,bind调用能够重复使用这个地址optval是一个布尔值整型.SO_KEEPALIVE:激活或者不激活”保持活动连接〃.使用这个特征,周期性的消息能够传送远端连接假如对等的机器对消息没有反应,说明连接断掉,进程使用端口同意SIGPIPE信号.optval是一个布尔值整型SO_DONTROUTE激活或者者不及或者发送消息的路由旁路,假如激活,端口完全旁路操作系统的路由设备optval是一个布尔值整型.SO_LINGER假如还有数据的话,close就“闲荡”.没有这个特征的话,一个端口的关闭执行快速的non-blocking形式,假如激活了这个特征,假如发送队列中还有数据.close调用会堵塞一会,直到能够发送数据,或者者一个时间期限到期optval是一个“闲荡”的结构.S_BRADCAST激活或者者不激活广播包的许可.oplvaloptval是一个布尔值整型SO_OOBINLINE:激活或者者不及或者按带宽内数据届同意带宽外数据ptval是一个布尔值整型SO_SNDBUF设定输入的缓冲的大小.optval是一个整型值.SO_RCVBUF设定输入的缓冲的大小.optval是一个整型值.SO_SNDLOWAT设定输出的最小数.这是在从一个端口发送数据之前,务必在缓冲顶存放的数据的最小值.optval是一个整型值.SO_RCVLOWAT设定输入的最小数.这是在从一个端口读数据返回之前,务必从缓冲区同意的数据的最小值.optval是一个整型值.SO_SNDTIMEO设定输出调用的时间期限.Optval是一时间间隔的结构SO_RCVTIMEO设定输入调用的时间期限.optval时间间隔的结构.SO_TYPE只对getsockopt:取得端口的类型.optval是一个整型值.SO_ERROR只对getsockopt:取得端口的最后的错误码,optval是一个布尔值整型返回值成功,返回端口的新的文件描述符失败,返回T与errno下面是errno的值.ENOPROTOOPT:特定协议的选项无效EBADFENOTSOCKandEFAULT.
10.int1istenintsintbacklog;参数s:[in]要同意连接的端口.backlog:[in]队列中最大的连接树描述通知操作系统任务已经准备好在端口上同意连接,确定了端口上队列同意的最大连接数返回值成功,返回0失败,返回T与errno下面是errno的值.EOPNOTSUPP:端口的协议不支持listen调用.EBADForENOTSOCK.
11.intrecvintsvoid*bufintlenunsignedintflags;intrecvfromintsvoid*bufintlenunsignedintflagsstructsockaddr*fromint*fromlen;intrecvmsgintsstructmsghdr*msgunsignedintflags;参数s:[in]要读数据的端口thesockettoreadfrom.buf:[out]指向一个存放读取的信息的缓冲区pointstoabufferwheretoputtheinformationread.Ion:[in]缓冲区的长度thecapacityofthebuffer.flags:[in]一些选项间描述.from:[out]指向一个存放对等机器地址的区域假如为空,说明并没有存放对等机器的的地址fromlcn:[inout]对进入,指向一个标志同意力的数,.对返回来讲,指向一个存放实际同意的长度的数msg:[out]执行一个存放要同意数据区域的头地址描述recvis经常是使用在用面向连接的端口接收数据时,from被设成空时,它与recvfrom是一样的.Rccvfrom与recvmsg都是用在conncction-less与connection-oriented的端口.假如没有数据可同意,除非端口是non-blocking型的,否则不调用上述模块参数flags有下列的值MSG_OOB:调用同意带宽外数据,而不是带宽内数据.MSG_PEEK从输入队列中返回数据,但并不将数据从队列中删除.MSGJAITAIL等待直到同意到请求的数据.recvmsg还没有在Linux中实现.返回值成功,返回同意到的数据数,失败,返回-1与errn下面是errn的值EBADFENOTCONNENOTSOCKEWOULDBLOCKEINTRorEFAULT.
12.intsendintsconstvoid*bufintlenunsignedintflags;intsendtointsconstvoid*bufintlenunsignedintflagsconststructsockaddr*tointtolen;intsendmsgintsconststructmsghdr*msgunsignedintflags;参数s:[in]要传送数据的端口.buf:[in]指向包含要传送的数据的缓冲区len:[in]thelenghtofbuf.flags:[in]间see描述.to:[in]指向数据要传送到的时等机器的地址tolen:[in]to的长度.msg:[in]要传送的信息.描述sendmsg还没有实现.send在面向连接的端口中使用传送数据sendto与sendmsgz在connection-less或者者connection-oriented的端II中使用.除非端口是non-blocking否则调用一直堵塞直到数据被发送出去flags能够是下面的一个或者多个MSG_OOB带宽外传送数据MSGDONTROUTE旁路系统的路由设备返回值成功,返回传送的数据数,失败,返回-1与errn,下面是errn的值EMSGSIZE:数据太大,不能自动传送.ENOBUFS:系统没有足够的内存分配输出缓冲区,或者者网络的输出队列已经满了EBADFENOTCONNENOTSOCKEWOULDBLOCKEINTRorEFAULT.
13.intshutdownintsinthow;参数s:[in]要关闭的端口how:[in]如何关闭.描述中止一个端口上的通信,可能的值0端口不再同意数据.端口不再发送数据.端口不再同意与发送数据.返回值成功,返回0失败,返回T与errno下面是errn的值.EBADFENOTSOCKorENOTCONN.
14.intsocketintdomaininttypointprotocol;参数domain:[in]端口的协议族.type:[in]类型.protocol:[in]通信使用的协议.描述产生一个通信的中止点参数domain有下列的值AF_UNIX Unix内部协议.AF.INET ARPA协议TCP/IP等.AF_ISO ISO协议.AF.NS Xerox网络系统协议.AF_IMPLINK IMP连接层.Linuxl.O版本:不支持AF」SOAF_IMPLINKandAF_NS.这些参数能够有下列的值SOCKSTREAM full-duplexreliablesequencedconnection-orientedstream.支持带宽外数据.SOCK_I}RAM connection-less数据包传送的不可靠连接.SOCK_RAW只有超级用户权限的任务才能够使用得选项见内核.SOCKSEQPACKET full-duplexreliablesequencedconnection-oriented连接,面向特定大小的数据包.只能在AF_NS域中使用.SOCK_RIM没有实现.SOCK_STREAM类型提供了可靠的传送.即使连接不在传送有用的信息,在定时的终端中也在传接一个包,给保证连接是可用的返回值成功,返回端口的新的文件描述符失败,返回-1与errno下面是errno的值.EACCESS:调用的任务没有产生一个口的权限EPROTONOSUPPORTEMF1LEENENOBUFFS.
15.intsocketpairintdomaininttypeintprotocolintsv
[2];参数domain:[in]端口协议族.type:[in]端口类型.protocol:[in]端口协议.sv:[out]两个文件描述符.描述产生一对相互通信的端口,这两个端口不可区分见socket得到全面的信息Linux
1.0对这个调用只支持AF_UNIX域.返回值成功,返回0失败,返回T与errno下面是errno的值.EACCESS:调用任务没有产生一个端口的权限EPROTONOSUPPORTEAFNOSUPPORTEOPNOSCPPORTEMEILEENFILEEFAULTorENOBUFFS.;buffer-head数据结构用来存放缓冲区中的•个数据块的信息/*bhstatebits*//*1缓冲区里有数据*//*1缓冲区脏*//*1缓冲区被锁*//*0缓冲区无效*//*1缓冲区被重复访问*//*1缓冲区过时*//*1缓冲区处于保护状态*/ftdefineBH_FreeOnIO7/*110后丢弃缓冲区头部*/structbuffcrhcad{/*Firstcacheline:*/unsignedlongb_blocknr;/*块数目*/kdevtbdev;/*设备(B_FREE=free)*/kdev_tb_rdev;/*真实设备*/unsignedlongb_rsector;/*磁盘上的真是缓冲区*/structbuffer_head*b_next;/*信号队列列表*/structbufferhead*b_this_page;/*一页内的缓冲区循环列表*//*Secondcacheline:*/unsignedlongb_state;/*缓冲区状态掩码*/structbufferhead*bnextfree;unsignedintb_count;/*用户使用此块*/unsignedlongb_size;/*块大小*//*Non-performance-critica1datafollows.*/char*b_data;/*数据块指针*/unsignedintblist;/*缓冲区公布表*/unsignedlongb_flushtime;/*脏缓冲区被重写时间*/unsignedlongb_lru_time;/*缓冲区上次被使用时间*/structwaitqueue*bwait;structbuffer_head*b_prev;/*双重连接的哈希表*/structbuffer_head*b_prev_free;/*双重连接的缓冲区*/structbufferhead*breqnext;/*请求队列*/);device系统中每一个网络设备都对应于一个设备数据结构structdevice{/*这里是这个结构的可见部分的第一部分(就像用户在文件Spacec中看到的一样).这是它的名称与接口.*/char*name;/*I/Ospecificfields*/unsignedlongrmcmond;unsignedlongrmemstart;unsignedlongmem_end;/*共享内存结束*/unsignedlongmem_start;/*共享内存起始*/unsignedlongbase_addr;/*设备10地址♦/unsignedcharirq;/*deviceIRQnumber*//*Low-levelstatusflags.*/volatileunsignedcharstart/*开始一个操作*/interrupt;/*中断到达*/unsignedlongtbusy;/*传送忙*/structdevice*next;/*设备初始化只被调用一次*/int*initstructdevice*dcv;/*有些设备还需要下面这些字段,但是它们不是在文件Spacec中通常的设置项.*/unsignedcharif_port;/*可选择的AUITP*/unsignedchardma;/*DMA通道*/structenetstatistics**get_statsstructdevice*dev;/*标记了结构的可见部分的结束部分.这后面的所有字段是系统内部的,能够被随意改动*//*这些可能为将来的远程关机代码使用*/unsignedlongtrans_start;/*最后一次传送的时间*/unsignedlonglast_rx;/*最后Rx的时间*/unsignedshortflags;/*接口标记BSD*/unsignedshortfamily;/*地址族ID*/unsignedshortmetric;/*路由距离*/unsignedshortmtu;/*MTU值*/unsignedshorttype;/*硬件类型*/unsignedshorthardheaderlen;/*硬件地址长度*//*接口地址信息.*/unsignedcharbroadcast[MAXADDRLEN];structdcv_mc」ist*mc_list;/*Mac广播地址*/intmc_count;/*已安装的Mac编号*/structip_mc_list*ip_mc_list;/*IP-Mac链*/—u32tx_queue_len;/*每个队列的最大帧长度*//*Forloadbalancingdriverpairsupport*/unsignedlongpkt_queue;/*包队列*/structdevice*slave;/*附属设备*/structnct_alias_info*alias_info;/*主设备别名信息*/structnet_alias*myalias;/*别名设备*//*Pointertotheinterfacebuffers.*/structsk_buff_headbuffs[DEV_NUMBUFFS];/*Pointerstointerfaceserviceroutines.*/int*openstructdevice*dev;int*stopstructdevice*dev;int*hard_start_xmitstructskbuff*skbstructdevice*dev;int*hardheaderstructskbuff*skbstructdevice*devunsignedshorttypevoid*daddrvoid*saddrunsignedlen;int*rebuild_headervoid*ethstructdevice*devunsignedlongraddrstructsk_buff*skb;void*set_multicast_liststructdevice*dev;int*set_mac_addressstructdevice*devvoid*addr;int*doioctlstructdevice*devstructifreq*ifrintemd;int*set_configstructdevice*devstructifmap*map;void*header_cache_bindstructhh_cache**hhpstructdevice*devunsignedshorthtype__u32daddr;void*header_cache_updatestructhh_cache*hhstructdevice*devunsignedchar*haddr;int*change_mtustructdevice*devintnowmtu;structiwstatistics**getwirelessstatsstructdevice*dev;;device_struct数据结构用来登记字符与块设备含有相应的名字与对此设备的文件操作集每一个chrdcvs与blkdevs向量的入口对应一个字符或者块设备structdevicestructconstchar*name;struct*fops;};file每个打开的文件,socket接口都对应一个文件数据结构structfilemode_tf_mode;lofftf_pos;unsignedshortfflags;unsignedshortf_count;unsignedlongf_readaframaxf_raendfralenfrawin;structfile*f_ncxt*f_prcv;intfowner;/*将发送的SIGIO的用户标示与组标示*/structinode*f_inode;struct*fop;unsignedlongfversion;void*private_data;/*为tty或者其它设备需要*/};数据结构描述一个正被打开的文件struct{intcount;fdsetclose_on_exec;fdsetopenfds;structfile*fd[NR_0PEN];;fs_structstructfsstructintcount;unsignedshortumask;structinode*root*pwd;};gendiskgendisk数据结构含有一个硬盘的信息当系统初始化,发现硬盘与检测分区参数时,此结构被填充structhd_struct{longstartsect;longnr_sects;;structgendisk{intmajor;/*设备主编号*/constchar*majorname;/*主设备名*/intminor_shift;/*numberoftimesminorisshiftedtogetrealminor*/struct*i_flock;structvm_area_struct*i_mmap;structpage*ipages;structdquot*i_dquot[MAXQUOTAS];structinode*i_next*i_prev;structinode*i_hash_next*i_hash_prcv;structinode*iboundto*i_boundby;structinode*i_mount;ArgumentARP参数,函数与例程中能够带入参数进行处理地址转换协议被用来将IP地址转换成物理硬件地址,如网卡地址ARP是TCP/IP协议族中一个非常重要的协议AsciiAscii代表着AmericanStandardCodeforInformationInterchange.字母表中的每个字母代表一个8位的编码Ascii被用来存储”可写”的字符Bit值域为0或者1的一个二进制数据位ByteCCPUDataStructureDeviceDriver字节,8位数据--种高级编程语言,Linux基本上是用C编写的CentralProcessingUnit(中央处理单元)数据结构设备驱动程序用来操纵一个特定设备类的软件比如,NCR810设备驱动程序操纵NCR810SCSI设备DMAELFEIDEExecutableimageFunctionIDEImageIPIPCInterfaceIRQISADirectMemoryAccess(直接内存存取)ExecutableandLinkableFormat(可执行与可连接格式).扩展IDE.可执行映象一个含有指令与数据的文件能够被调进虚拟内存而执行函数IntegratedDiskElectronics.参阅可执行映象InternetProtocol(网际协议).InterprocessCommuniction(进程间通讯)接口接口是一个抽象的概念实现中,通常指一些函数或者例程接口InterruptRequestQueue(中断申请队列).IndustryStandardArchitecture.Thisisastandardalthoughnowratherdateddatabusinterfaceforsystemcomponentssuchasf1oppydiskdrivers.KernelModuleKilobyteMegabyteMicroprocessorModuleObjectfile一个能够动态地被装载的核心部份,如文件系统与设备驱动序1024字节--兆字节或者1024K字节微处理器模块一个含有指令的文件目标文件或者*.文件指一个含有指令与数据的文件但这个文件尚未与其所需要的其他目标文件或者库相连接以形成一个可执行文件Page物理内存被分成许多同样大小的页面是虚拟内存管理调度的最小单位devtstdcv;/*device*/unsignedshortpadl;/*padding*/ino_tst_ino;/*inodeumodetstmode;./*accessmodenlinktstnlink;/*numberofhardlinks*/uidtstuid;/*uid*/gid_tst_gid;/*gid*/devtst_rdev;/*devicetype*/unsignedshort_pad2;/*padding*/off_tstsize;/*sizeinbytes*/unsignedlongst_blksize;/*blocksize*/unsignedlongstblocks;/*numberofallocatedblocks*/timetstatime;/*lastaccesstime*/unsignedlongunusedl;/*unused*/time_tstjntime;/*lastmodificationtime*/unsignedlongunuscd2;/*unused*/timetstctime;/*lastchangetime*/unsignedlong_unused3;/*unused*/unsignedlong_unused4;/*unused*/unsignedlongunused5;/*unused*/structstatfs{longftype;/*type*/longfbsize;longf_blocks;/*blocksize*//*totcilnumberofblocks*/structipc_permshm_perm;/*操作参数*/intshmscgsz;/*块大小bytes*/timetshmatime;/*最近依附时间*/time_tshm_dtime;/*最近脱离时间*/timetshmctime;/*最近修改时间*/unsignedshortshmcpid;/*生成者的pid*/unsignedshortshm_lpid;/*最近的操作者的pid*/shortshm_nattch;/*当前依附该内存块的进程数目unsignedcharpad;unsignedchardev_addr[MAX_ADDR_LEN];unsignedcharaddr_len;/*硬件地址长度*/unsignedlongpa_addr;/*协议地址*/unsignedlongpabrdaddr;/*协议广播地址*/unsignedlongpadstaddr;/*P-P协议另一端地址*/unsignedlongpamask;/*协议网络掩码*/unsignedshortpa_alen;/*协议地址长度*/。