基于arm9的嵌入式linux系统的webserver服务器计算机设计与科学专业毕业论文内容摘要:
忽略。 ⑷ 配置NFS服务器:编辑/etc/exports文件,设置如下: [root@localhost root]vi /etc/exports 在该空文件中添加如下行: / (rw)然后重新启动nfs服务,刚才的设置就生效了,如图36所示。 注意:在使用nfs服务的请大家确认防火墙没有限制nfs服务,并且,在系统服务中portmap服务是启动运行的。 图36现在我们测试一下nfs服务。 然后用超级用户执行下列命令:[root@localhost root]mount :/tftpboot /home/tmp 这样,“/tftpboot”“/home/tmp”上,“/home/tmp” 上目录“/tftpboot”里面的内容完全一样,确定NFS服务可用。 ⑸ 设置mini在Linux操作系统下,使用mini作为超级终端,因此首先必须正确配置超级终端。 在宿主机端Linux下执行: [root@localhost root]mini –s结果如图37所示。 图37第一次使用时需要对串口进行配置,在该菜单下选择“Serial port setup”,然后回车将出现如图38配置菜单:图38参照上面的配置,相应输入左边的”A”、”B”等字符将出现配置各自参数的界面,分别配置成上述设置。 设置完成后回车退出,并选择保存,如图39所示:图39然后选择Exit菜单,将启动mini程序,此时请将JXARM92410的UART0连接到PC机串口并将JXARM92410重新上电,在mini中,将出现如图310所示界面:图310此时表示mini已经配置正确,当下次使用mini –s进入mini时,如果已经将设置保存,请直接选择Exit菜单进入到mini即可。 ⑹ 安装Linux编译环境交叉编译是指利用运行在某台计算机上的编译器编译某个源程序生成在另一种结构计算机上运行的目标代码的过程。 编译器的生成依赖于相应的函数库,而这些函数库又得依靠编译器来编译。 建立交叉编译环境就是将ARM使用的编译器(如:armlinuxgcc)和函数库(如:glibc)安装到指定目录,并使用configure配置好Makefile文件。 网络通信模块开发本系统采用realtek的RTL8091AS网卡芯片,该芯片是ne2000兼容的网卡芯片。 网络通信模块主要是由RTL8019AS以太网控制芯片和网络滤波器、数据缓冲器、收发器、RJ45接口构成。 RTL8019AS有8位和16位两种工作模式,通过JP引脚来改变(接高为8位数据模式,接低为16位数据模式)。 RTL8019AS的8位数据线D0~D7通过一个8位双向总线转换器74LVCC4245A与S3C2410A的低8位数据位相连;RTL8019AS的低5位地址线通过一个8位三态数据缓冲器,与S3C2410A的低5位地址线相连。 为了提高网络通信的抗干扰能力,使用引脚TPIN+、TPIN、TPOUT+和TPOUT—连接GPOUP—TEK公司的20F01网络滤波器,利用RJ45插头实现与以太网的连接。 Linux网络设备驱动的结构分析Linux网络设备驱动程序的体系结构如图311所示,从上到下可以划分为4层,依次为网络协议接口层、网络设备接口层、设备驱动功能层以及网络设备与媒介层。 ⑴ 网络协议接口层向网络层协议提供统一的数据包收发接口,不论上层协议为ARP还是IP,都通过devqueue_xmit()函数发送数据,并通过netif_rx()函数接收数据。 这一层的存在使得上层协议独立于具体的设备。 ⑵ 网络设备接口层向协议接口层提供统一的用于描述具体网络设备属性和操作的结构体net_device,该结构体是设备驱动功能层中各函数的容器。 实际上,网络设备接口层从宏观上规划了具体操作硬件的设备驱动功能层的结构。 ⑶ 设备驱动功能层各函数是网络设备接口层net_device数据结构的具体成员,是驱动网络设备硬件完成相应动作的程序,它通过hard_start_xmit()函数启动发送操作,并通过网络设备上的中断触发接收操作。 ⑷ 网络设备与媒介层是完成数据包发送与接收的物理实体,包括网络适配器和具体的传输媒介,网络适配器被设备驱动功能层中的函数物理上驱动。 图311 Linux网络设备驱动程序体系结构图在设计具体的网络设备驱动程序时,需要完成的主要工作是编写设备驱动功能层的相关函数以填充net_device数据结构的内容并将net_device注册入内核[7]。 嵌入式Linux下网口驱动程序的实现网卡驱动程序设计主要包括以下内容:⑴ 填充RTL8019AS网卡的私有信息结构体,把特定的数据放入这个私有结构体中。 在ne2000驱动程序中,这个数据结构为struct net_local。 ⑵ 填充设备初始化模版,初始化net_device结构体,将其注入内核。 net_device的注册于注销模块加载于注销函数中完成。 在ne2000驱动程序中,与此相关的函数有:int ethdev_init(struct net_device *dev);int init_module(void);//初始化设备函数int ethdev_init(struct net_device *dev){ if (ei_debug 1) printk(version)。 //设备私有数据区 if (devpriv == NULL) { struct ei_device *ei_local。 devpriv = kmalloc(sizeof(struct ei_device), GFP_KERNEL)。 if (devpriv == NULL) return ENOMEM。 memset(devpriv, 0, sizeof(struct ei_device))。 ei_local = (struct ei_device *)devpriv。 spin_lock_init(amp。 ei_localpage_lock)。 } //设置设备的成员函数指针 devhard_start_xmit = amp。 ei_start_xmit。 devget_stats = get_stats。 devset_multicast_list = amp。 set_multicast_list。 ether_setup(dev)。 //初始化以太网设备的公用成员 return 0。 }⑶ 填充设备发送数据包函数模块。 在驱动程序层次上的发送和接收数据都是通过低层对硬件的读/写来完成的。 数据发送时由dev_dev_start_xmit函数指针对应的函数为ei_start_xmit ()函数,由它来完成数据包的发送。 在函数ethdev_init ()中,把net_device结构的hard_start_xmit指针初始化为ei_start_xmit。 在ne2000驱动程序中,于此相关的函数有:static int ei_start_xmit(struct sk_buff *skb, struct net_device *dev);static void ei_tx_intr(struct net_device *dev);⑷填充设备驱动程序的中断处理程序和具体的数据包接收函数。 当网络上的数据到来时,将触发硬件中断,根据注册的中断向量表确定处理函数,然后进入中断向量处理程序,将数据送到上层协议进行处理。 数据接收过程是在ne_probe ()函数中的中断处理函数ei_interrupt ()来完成的,在进入ei_interrupt ()之后,通过ei_receive ()从网卡的接收缓冲区获得数据,并组合成sk_buffer结构,再通过netif_rx ()函数将接收到的数据存放在系统的接收队列中。 在ne2000驱动程序中,于此相关的函数有:static void ei_receive(struct net_device *dev);void ei_interrupt(int irq, void *dev_id, struct pt_regs * regs);⑸ 填充设备打开与释放函数代码。 网络接口设备打开就是激活网络接口,使它能接受来自网络的数据并且传递到网络协议栈上面,也可以将数据发送到网络上。 设备关闭就是停止操作。 在ne2000网络驱动程序中网络设备打开由dev_open ()和ne_open完成,设备关闭由dev_close ()和ne_close ()完成。 它们相应调用底层函数ei_open ()和ei_close ()来完成。 与此相关的函数有:static int ne_open(struct net_device *dev);static int ne_close(struct net_device *dev);int ei_open(struct net_device *dev);int ei_close(struct net_device *dev); 操作系统移植嵌入式开发板操作系统就是嵌入式Linux,它指的是标准Linux操作系统的内核,把标准Linux操作系统的进行适当的裁剪,加入一些特定的功能,形成一个小巧、高效的满足特定需要的专用操作系统,然后移植到ARM体系结构的开发板系统上,移植主要包括修改内核源码、内核裁剪和内核编译3个环节。 内核源码 Linux核心源程序安装在/home/cvtch/jx2410/linux下。 核心源程序的文件按树形结构进行组织在源程序树的最上层,即目录/ home/cvtch/jx2410/linux下有一些目录和文件:Makefile:第一个Makefile文件,用来组织内核的各模块,记录了各个模块间的相互之间的联系和依赖关系,编译时使用。 仔细阅读各子目录下的Makefile文件对弄清各个文件之间的联系和依赖关系很有帮助。 README:内核及其编译配置方法简单介绍;:各种Makefi1e所使用的一些共同规则;REPORTINGBUGS:内核程序Bug的一些报告;arch/:arch子目录包括了所有和体系结构相关的核心代码,它的每一个子目录都代表一种Linux支持的体系结构,例如arm就是关于arm体系结构及与之相兼容体系结构的子目录;include/:include子目录包括编译核心所需要的大部分头文件,与平台无关的头文件在include/linux子目录下,与体系结构相关的头文件在include/asm*子目录下,如arm体系结构相关的头文件在include/asmarm下;init/:这个目录包含核心的初始化代码(注:不是系统的引导代码),mm/:这个目录包括所有独立于CPU体系结构的内存管理代码,如页式存储管理等,而和体系结构相关的内存管理代码则位于arch/*/mm/,例如arch/ARM/mm/;kernel/:主要的内核代码,此目录下的文件实现了大部分内核函数,和体系结构相关的代码在arch/*/kernel中;drivers/:放置系统所有的设备驱动程序,每种驱动程序又各占用一个子目录:如/block目录下存放块设备驱动程序,;Documentation/:文档目录,没有内核代码,只是一套有用的文档;fs/:文件系统源代码和各种文件操作函数代码,每一个子目录存放一种文件系统的源代码,例如fat、ext2和jffs2;ipc/:这个目录包含进程间通讯的代码;lib/:一个标准C库的子集,主要是字符串和内存操作函数,和体系结构有关的一些函数的实现在arch/*/lib中;net/:内核与网络相关的代码;modules/:模块文件目录,是个空目录,用于存放编译时产生的模块目标文件;scripts/:和内核的配置工具有关的文件;在每个存放源代码的子目录下,一般都有一个Makefile文件维护内核源代码的编译。 另外,为了在源代码级对Linux内核进行剪裁,在源代码的各个目录下还有一个用配置菜单语言(CML,Configuration Menu Language),该文件详细定义了内核中每一个功能模块和它们之间的依赖关系。 内核裁减和编译Linux内核的裁剪支持三种配置方式,即make confg、make menuconfig、make xconfg,一般采用菜单式用命令make menuconfig (基于curses的全屏幕配置界面)对系统进行裁剪样较为简单。 内核裁剪之后,最后要进行交叉编译后在arch/arm目录下生成内核映象文件zImage,分别使用命令如下:make clean(清理编译环境);make dep(编译依赖文件);make zImage(编译内核)进行内核编译。 make ,并为每一个菜单建立一个shell函数,然后导入并以用户驱动方式执行这些shell函数。 Menuconfig使用lxdialog(一种使用了可以控制字符屏幕的图形库curses的C程序)执行绘制菜单等实际屏幕输出[2]。 对每一个配置选项,用户有三种选择,它们分别代表的含义如下:“Y”——将该功能编译进内核;“N”——不将该功能编译进内核;“M”——将该功能编译成可以在需要时动态插入到内核中的模块。 在源代码目录执行命令make menuconfig:[root@localhost linux]make menuconfig图312出现如图312界面,可以根据自己系统所实现的功能选择内核配置选项及删改。 Linux内核裁剪的重要步骤:⑴ Code maturity level options 代码成熟等级选。基于arm9的嵌入式linux系统的webserver服务器计算机设计与科学专业毕业论文
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。