Chinaunix首页 | 论坛 | 博客
  • 博客访问: 41550
  • 博文数量: 19
  • 博客积分: 1416
  • 博客等级: 上尉
  • 技术积分: 210
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-19 11:33
文章分类
文章存档

2010年(10)

2009年(9)

我的朋友

分类: 嵌入式

2010-01-12 14:44:15

一: 基本数据结构
typedef struct node/* Node of a linked list. */
{
struct node *next;/* Points at the next node in the list */
struct node *previous;/* Points at the previous node in the list */
} NODE;
typedef struct/* Header for a linked list. */
{
NODE node;/* Header list node */
int count;/* Number of nodes in list */
} LIST;
typedef struct dlnode/* Node of a linked list. */
{
    struct dlnode *next;/* Points at the next node in the list */
    struct dlnode *previous;/* Points at the previous node in the list */
} DL_NODE;
typedef struct/* Header for a linked list. */
    {
    DL_NODE *head;/* header of list */
    DL_NODE *tail;/* tail of list */
} DL_LIST;
 
二: 网络相关
1.LIST hostList  
整个系统的host, hostAdd()产生. hostShow()产看.其中的表项为: 
typedef struct
    {
    NODE node; /*节点链*/
    HOSTNAME hostName;/*名称*/
    struct in_addr netAddr;/*网络地址*/
    } HOSTENTRY;
char targetName [HOSTNAME_LEN];/* name for this target machine */
2.LIST endList
整个系统已加载的end, muxDevLoad()产生,endFindByName()查看.其中表项为:
typedef struct end_tbl_row
    {
    NODE node;                  /* Needed by our list processing library. */
    char name[END_NAME_MAX];/* Name of the devices in row. (ln, etc.) */
    LIST units;                 /* List of devices, i.e. 0, 1, etc..  */
    } END_TBL_ROW;
units链表中包含的是真正的END_OBJ.
3.END_TBL_ENTRY endDevTbl[]
整个系统要加载的end,加载后便进入endList.其中表项为:
typedef struct end_tbl_entry
    {
    int unit;                                /* This device's unit # */
    END_OBJ* (*endLoadFunc) (char*, void*);         /* The Load function. */
    char* endLoadString;                     /* The load string. */
    BOOL endLoan;                            /* Do we loan buffers? */
    void* pBSP;                              /* BSP private */
    BOOL processed;                          /* Has this been processed? */
    } END_TBL_ENTRY;
4._netDpool(_pNetDpool)  _netSysPool(_pNetSysPool)
系统网络缓冲区.在netLibInit()->netLibGeneralInit()->mbinit()中初始化.
_netDPool(_pNetSysPool) 
Only used for data transfer in the network stack.
_netsyspool(_pNetDpool) 
Used for network stack system structures such as routes, sockets, protocol control blocks, interface addresses, mulitcast addresses,and multicast routing entries.
5.struct ifnet *ifnet;/* list of all network interfaces */
网络接口链表, 可以使用ifShow()通过遍历ifp->if_next查看整个表. 由if_attach(ifp)加入一个. ipAttach()内部调用了if_attach().
IP层自己有一个IP_DRV_CTRL ipDrvCtrl[IP_MAX_UNITS], 其中包含了struct ifnet.
最后一个成员是:
structifqueue if_snd;/* output queue */
6.UDP和TCP都有in_pcb的链表,指向每个socket的so_pcb.
struct inpcb 
{
LIST_ENTRY(inpcb) inp_list;/* list for all PCBs of this proto */
LIST_ENTRY(inpcb) inp_hash;/* hash list */
structinpcbinfo *inp_pcbinfo;
structin_addr inp_faddr;/* foreign host table entry */
u_shortinp_fport;/* foreign port */
structin_addr inp_laddr;/* local host table entry */
u_shortinp_lport;/* local port */
structsocket *inp_socket;/* back pointer to socket */
caddr_tinp_ppcb;/* pointer to per-protocol pcb */
structroute inp_route;/* placeholder for routing entry */
intinp_flags;/* generic IP/datagram flags */
structip inp_ip;/* header prototype; should have more */
structmbuf *inp_options;/* IP options */
structip_moptions *inp_moptions; /* IP multicast options */
};
 
7.struct protosw inetsw [IP_PROTO_NUM_MAX]  Protocol switch table,存放各种协议的函数.
Each protocol has a handle initializing one of these structures,
which is used for protocol-protocol and system-protocol communication.
Protocols pass data between themselves as chains of mbufs using the pr_input and pr_output hooks.
pr_input的调用
ipintr()
{
(*inetsw[ip_protox[ip->ip_p]].pr_input) (m, hlen); 
}
struct protosw
  {
    shortpr_type;/* socket type used for */
    structdomain *pr_domain;/* domain protocol a member of */
    shortpr_protocol;/* protocol number */
    shortpr_flags;/* see below */
    void(*pr_input) ();/* input to protocol (from below) */
    int(*pr_output) ();/* output to protocol (from above) */
    void(*pr_ctlinput) ();/* control input (from below) */
    int(*pr_ctloutput) ();/* control output (from above) */
    int(*pr_usrreq) ();/* user request: see list below */
    void(*pr_init) ();/* initialization hook */
    void(*pr_fasttimo) ();/* fast timeout (200ms) */
    void(*pr_slowtimo) ();/* slow timeout (500ms) */
    void(*pr_drain) ();/* flush any excess space possible */
    int(*pr_sysctl) ();/* sysctl for protocol */
};
在ipLibInit(),icmpLibInit(),igmpLibInit(),udpLibInit(),tcpLibInit()等都会有一个protosw.
{
pProtoSwitch
->pr_type=  (0,SOCK_RAW , SOCK_RAW , SOCK_DGRAM, SOCK_STREAM)
    ->pr_domain=  &inetdomain;
    ->pr_protocol=  (IPPROTO_IP, IPPROTO_ICMP, IPPROTO_IGMP,IPPROTO_UDP, IPPROTO_TCP)
    ->pr_flags=  PR_ATOMIC | PR_ADDR;
    ->pr_input=  (0, icmp_input , igmp_input ,udp_input,tcp_input);
    ->pr_output=  (ip_output , rip_output, rip_output, 0,0);
    ->pr_ctlinput=  udp_ctlinput;
    ->pr_ctloutput=  ip_ctloutput;
    ->pr_usrreq=  udp_usrreq;
    ->pr_init=  udp_init;
_protoSwIndex++;
}
8.struct domain *domains;/* list of domain descriptors */
    由addDomain (struct domain * pDomain)添加一个新的域.
系统预定义的一个域为:
struct domain inetdomain =
     {
  AF_INET, "internet", 0, 0, 0, 
        inetsw, &inetsw[sizeof(inetsw)/sizeof(inetsw[0])], 0,
        rn_inithead, 27, sizeof(struct sockaddr_in) 
};
9.RIP ripState;
整个系统的rip状态.
10.struct radix_node_head *rt_tables[]
整个系统的路由表.可以有很多种,如rt_tables[AF_INET].
三: 中断相关
11.INTR_HANDLERintrVecTable[NUM_VEC_MAX]/*  Intr vector table */
MPC860 core的外部中断表, 中断定位在0x500处.由intConnect()加入中断,ppc860IntrDeMux()相应中断并分解响应.
四: 设备相关
12.DL_LIST iosDvList
所有已安装的device表, 由iosDevAdd()添加一个表项, iosDelete()删除一个表项.表项为:
typedef struct /* DEV_HDR - device header for all device structures */
{
    DL_NODEnode;/* device linked list node */
    shortdrvNum;/* driver number for this device,指向drvTable[]相应的位置 */
    char *name;/* device name */
} DEV_HDR;
 
13.DRV_ENTRY drvTable[NUM_DRIVERS] /* max 20 drivers in drvTable */
所有硬件驱动表.由iosDrvInstall()添加表项.其中表项为:
typedef struct/* DRV_ENTRY - entries in driver jump table */
    {
    FUNCPTRde_create;
    FUNCPTRde_delete;
    FUNCPTRde_open;
    FUNCPTRde_close;
    FUNCPTRde_read;
    FUNCPTRde_write;
    FUNCPTRde_ioctl;
    BOOLde_inuse;
    } DRV_ENTRY;
 
14.FD_ENTRY fdTable[NUM_FILES] /* max 50 files open simultaneously */
所有打开的文件描述符表.又fopen()添加一个表项,fclose()删除一个表项.其中表项为:
typedef struct/* FD_ENTRY - entries in file table */
    {
    DEV_HDR *pDevHdr;/* device header for this file */
    int value;/* driver's id for this file */
    char *name;/* actual file name */
    BOOL inuse;/* active entry */
} FD_ENTRY;
五: 其他
15.
#define BOOT_LINE_OFFSET 0x4200
#define BOOT_LINE_ADRS((char *) (LOCAL_MEM_LOCAL_ADRS+BOOT_LINE_OFFSET))
#define DEFAULT_BOOT_LINE "ide=0,0(0,0)host:/vxWorks.dat  f=0x8 tn=HC3600 o=cpm"
启动时,如果用户没有输入boot参数,系统便把DEFAULT_BOOT_LINE拷贝到BOOT_LINE_ADRS供 整个系统使用.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kukumouse/archive/2008/04/09/2270375.aspx
阅读(1192) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~