2016面试总结

来源:互联网 发布:shift更新会数据吗 编辑:程序博客网 时间:2024/05/08 11:23

一.驱动

1.什么是驱动

驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息。有了此信息,计算机就可以与设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。

2.Linux设备驱动的分类

(1)字符设备:指那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标

2) 块设备:块设备可以用任意顺序进行访问,以块为单位进行操作,如硬盘、软驱等
3) 网络设备:Linux的网络系统主要是基于BSD unix的socket 机制

3.为什么要做驱动

驱动程序扮演沟通的角色,把硬件的功能告诉电脑系统,并且也将系统的指令传达给硬件,让它开始工作。

4.mknod命令结合设备的主设备号和次设备号,可创建一个设备文件。

查看驱动模块中打印信息的命令:dmesg

查看字符设备信息可以用lsmod 和modprobe,lsmod可以查看模块的依赖关系,modprobe在加载模块时会加载其他依赖的模块。
显示当前使用的中断号cat /proc/interrupt

添加驱动:insmod module.ko

5.insmod 一个驱动模块,会执行模块中的哪个函数?rmmod呢?这两个函数在设计上要注意哪些?遇到过卸载驱动出现异常没?是什么问题引起的?
insmod调用init函数,rmmod调用exit函数。这两个函数在设计时要注意什么?卸载模块时曾出现卸载失败的情形,原因是存在进程正在使用模块,检查代码后发现产生了死锁的问题。

6.在Linux C中,ls这个命令是怎么被执行的?

使用fork创建一个进程或exec函数族覆盖原进程

7.什么是哈希表

哈希表是种数据结构,它可以提供快速的插入操作和查找操作

如果是驱动的话:
8.请描述一下字符驱动的实现过程
1.申请主次设备号(主设备号表示一类设备,此设备号表示这类设备的第几个设备), 

2.实现fops,里面有open(), read(), write(), ioctl(), close()等系统调用的钩子函数,我们主要是实现ioctl();

3,分配cdev并将fops添加到cdev里, 

4,调用cdev_add() 将字符设备注册到内核里去;

9.如何控制LED亮,灭

1.应用程序空间调用open()系统调用获取文件描述符fd, 然后调用ioctl(fd, cmd, args)传入命令和参数表示灯亮/灭和第几个灯; 用完后 close();

2.驱动层: open()系统调用将会进入到驱动fops里的.open()钩子函数里去,ioctl()系统调用将会进入到.unlocked_ioct()指向的钩子函数里去, close()系统调用将会进入到.release()对应的钩子函数里去;

3.ioctl()里,控制S3C2440上连接LED的相应GPIO口,将模式寄存器配置为GPIO OUTPUT模式,然后将数据寄存器的相应管脚对应的位设置位为0,CPU将会输出低电平。这样灯就亮了

10.中断

指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。

11.中断服务程序

,处理器处理"急件",可理解为是一种服务,是通过执行事先编好的某个特定的程序来完成的,这种处理"急件"的程序被称为--中断服务程序。

12.上半部的功能是"登记中断",当一个中断发生时,它进行相应地硬件读写后就把中断例程的下半部挂到该设备的下半部执行队列中去。因此,上半部执行的速度就会很快,可以服务更多的中断请求。但是,仅有"登记中断"是远远不够的,因为中断的事件可能很复杂。因此,Linux引入了一个下半部,来完成中断事件的绝大多数使命。下半部和上半部最大的不同是下半部是可中断的,而上半部是不可中断的,下半部几乎做了中断处理程序所有的事情,而且可以被新的中断打断!下半部则相对来说并不是非常紧急的,通常还是比较耗时的,因此由系统自行安排运行时机,不在中断服务上下文中执行。

13.Linux实现下半部的机制

内核中存在三种不同形式的下半部实现机制:软中断,tasklet和工作队列
下面将比较三种机制的差别与联系。
14.软中断: 1、软中断是在编译期间静态分配的。
     2、最多可以有32个软中断。
     3、软中断不会抢占另外一个软中断,唯一可以抢占软中断的是中断处理程序。
     4、可以并发运行在多个CPU上(即使同一类型的也可以)。所以软中断必须设计为可重入的函数(允许多个CPU同时操作), 因此也需要使用自旋锁来保护其数据结构。
     5、目前只有两个子系直接使用软中断:网络和SCSI。
     6、执行时间有:从硬件中断代码返回时、在ksoftirqd内核线程中和某些显示检查并执行软中断的代码中。
tasklet: 1、tasklet是使用两类软中断实现的:HI_SOFTIRQ和TASKLET_SOFTIRQ。
          2、可以动态增加减少,没有数量限制。
          3、同一类tasklet不能并发执行。
          4、不同类型可以并发执行。
          5、大部分情况使用tasklet。
15.工作队列: 1、由内核线程去执行,换句话说总在进程上下文执行。2、可以睡眠,阻塞。

16.中断下半部可以由哪些方法实现(软件定时器,tasklet, 等待队列,内核线程等

17.自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分

编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。

18.在多道程序系统中,一组进程中的每一个进程均无限期的等待另一组进程所占有的且不会释放的资源,这种现象称为死锁

19.进程死锁的原因

答案:资源竞争及进程推进顺序非法

20.死锁的条件
互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
循环等待条件(Circular wait):系统中若干进程组成环路,改环路中每个进程都在等待相邻进程正占用的资源。
21.处理死锁的策略
1.忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。
2.检测死锁并且恢复。
3.仔细地对资源进行动态分配,以避免死锁。
4.通过破除死锁四个必要条件之一,来防止死锁产生。

22.临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性。

23.什么是进程(Process):普通的解释就是,进程是程序的一次执行,而什么是线程(Thread),线程可以理解为进程中的执行的一段程序片段。

24.进程与线程的区别:

1.一个程序至少有一个进程,一个进程至少有一个线程.
2.线程的划分尺度小于进程,使得多线程程序的并发性高。
3.进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

4.每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

25.进程间通信方式 :管道,消息队列,信息量,共享内存,信号,套接字(socket) 

26.请列出你所知道的Linux内核同步机制:

Linux内核中包含了几乎所有现代的操作系统具有的同步机制,这些同步机制包括:原子操作、信号量(semaphore)、读写信号量(rw_semaphore)、自旋锁(spinlock)、大内核锁(Big Kernel Lock)rwlockbrlock(只包含在2.4内核中)、RCU(只包含在2.6内核中)和seqlock(只包含在2.6内核中)。

27.操作系统中进程调度策略有哪几种?

答案:FCFS(先来先服务),优先级,时间片轮转,多级反馈

28.Socket:

服务器:1.创建一个socket,2.bind一个句柄(端口和地址)3.listen设置监听客户数4.accept客户端的句柄5.读写

客户机;1. 创建一个socket,2.connect到服务器 3.读写操作      

29.进程的创建:   

fork创建的新进程被称为子进程(child process)。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新进程(子进程)的进程 id。将子进程id返回给父进程的理由是:因为一个进程的子进程可以多于一个,没有一个函数使一个进程可以获得其所有子进程的进程id。对子进程来说,之所以fork返回0给它,是因为它随时可以调用getpid()来获取自己的pid;也可以调用getppid()来获取父进程的id(进程id 0总是由交换进程使用,所以一个子进程的进程id不可能为0 )

fork之后,操作系统会复制一个与父进程完全相同的子进程,虽说是父子关系,但是在操作系统看来,他们更像兄弟关系,这2个进程共享代码空间,但是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,子进程拥有父进程当前运行到的位置(两进程的程序计数器pc值相同,也就是说,子进程是从fork返回处开始执行的),但有一点不同,如果fork成功,子进程中fork的返回值是0,父进程中fork的返回值是子进程的进程号,如果fork不成功,父进程会返回错误。

 30.TCP/IP通信建立的过程怎样,端口有什么作用?

答案:三次握手,确定是哪个应用程序使用该协议

31.tcp/udp是属于哪一层?tcp/udp有何优缺点?

答案:应用层表示层会话层运输层网络层物理链路层物理层 tcp /udp属于运输层TCP服务提供了数据流传输、可靠性、有效流控制、全双工操作和多路复用技术等。与TCP不同,UDP并不提供对IP协议的可靠机制、流控制以及错误恢复功能等。由于UDP比较简单,UDP头包含很少的字节,比TCP负载消耗少。tcp:提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好udp:不提供稳定的服务,包头小,开销小 。

二.C语言总结:

1引用与指针的区别是什么?

 1) 引用必须被初始化,指针不必。

2) 引用初始化以后不能被改变,指针可以改变所指的对象。

3) 不存在指向空值的引用,但是存在指向空值的指针。

2.结构与联合有和区别?

(1). 结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了一个被选中的成员(所有成员共用一块地址空间),而结构的所有成员都存在(不同成员的存放地址不同)。 
 (2). 对于联合的不同成员赋值将会对其它成员重写原来成员的值就不存在了,而对于结构的不同成员赋值是互不影响的。

3描述内存分配方式以及它们的区别?

1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。
3) 从堆上分配,亦称动态内存分配。程序在运行的时候用mallocnew申请任意多少的内存,程序员自己负责在何时用freedelete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。

4.h头文件中的ifndef/define/endif的作用?

答:防止该头文件被重复引用。

5.请说出const#define相比,有何优点?

Const作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被Const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。

6.堆(heap)和栈(stack)的区别

1、栈区(stack由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。
4、文字常量区常量字符串就是放在这里的。程序结束后由系统释放。
5、程序代码区存放函数体的二进制代码。

7.申请方式
stack:由系统自动分配。例如,声明在函数中一个局部变量int b;系统自动在栈中为b开辟空间
heap:需要程序员自己申请,并指明大小,在cmalloc函数

8.关键字static的作用是什么?

C语言中,关键字static有三个明显的作用:

1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用

9.队列和栈有什么区别?

队列先进先出,栈后进先出

10.请说明volatile关键字的作用

  volatile的本意是“易变的”。由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化,但有可能会读脏数据。当要求使用volatile声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

下面是volatile变量的几个例子:

1). 并行设备的硬件寄存器(如:状态寄存器)

2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

3). 多线程应用中被几个任务共享的变量

嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。

11..数组和链表的区别

答案:数组:数据顺序存储,固定大小连表:数据可以随机存储,大小可动态改变

12.一些函数的操作

Itoa整数转换成字符函数,strstr从字符串string中寻找某字符第一次出现的位置

13.什么是预编译,预编译主要完成哪些工作

预编译又称为预处理 , 是做些代码文本的替换工作。处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等,就是为编译做的预备工作的阶段,主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。

编译系统在对程序进行通常的编译之前,先进行预处理。 c提供的预处理功能主要有以下三种: 1 )宏定义  2)文件包含  3)条件编译

14.指针数组与数组指针的区别

指针数组:首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身的大小决定,每一个元素都是一个指针,在32 位系统下任何类型的指针永远是占4 个字节。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。在32 位系统下任何类型的指针永远是占4 个字节,至于它指向的数组占多少字节,不知道,具体要看数组大小。它是“指向数组的指针”的简称。

15.如何创建一个链表

建立一个链表,新加入一个新的结点,这里需要进行判断,当向头结点之前进行插入时,是将新的结点的next值指向head,然后再将head指向pnew这个新的结点,

如果是插入到这个链表的末尾,则需要用while找到链表的最后一个结点,将它的next值指向pnew,再将pnewnext指向null,

最后是插入到链表中的结点,先while找出需要插入的结点(用for循环i=0则指向的是本身,i=1指向的是它前一个结点),然后用pnewnext值指向找到结点的next的值,最后用找到的结点的next指向pnew结点。

删除一个结点先找到需要删除的结点,用它上一个结点的next指向下下一个结点(就是将删除的结点跳过去),再将需要删除的结点d4elete

单向链表的逆序新建三个指针,分别指向头结点,头结点的下一个结点,和第三个结点,第一步,将第三个结点用指针保存起来,然后,第二个结点的next指向第一个结点,再将第一,二,三个结点后移,直到第一个结点为null结束。

 

三.Fl2440开发板参数:

Fl2440是由飞凌嵌入式技术有限公司设计生产的一款嵌入式开发平台,它基于三星公司的ARM9处理器S3C2440A,内部带有全性能的MMU(内存处理单元)。

内存:标配64MB字节DDR内存

CPU:Samsung S3C2440处理器,主频533MHZ

FLASH:256字节NAND Flash

电压:支持3.3V或5V电压供电

4个用户按键,4路LED,一路4位拨码开关

主机操作系统:centos 6.7 交叉编译器环境:arm-linux-gcc-4.5.4

Linux内核版本:linux-3.0

嵌入式系统硬件层、中间层、系统软件层和应用软件层组成

开发板烧录:(协议:serial  波特率:115200)

1.bootstrap初始化cpu内部SDRAM,用J-link下载到SRRAM地址上运行

2.u-boot启动linux系统,用J-link将它加载到0x33f8000地址上运行

3.nand write命令烧到nandflash的0地址上,u-boot运行时,用tftp命令将linuxroom下载到SDRAM的0x30008000地址上,记住写之前一定要使用nand erase命令擦除

交叉编译器:在计算机环境中运行的编译程序,能编译出另一种环境下运行的代码

文件系统的制作:1.添加内核对文件系统的支持,2制作映像文件,

3添加U-boot对文件系统的支持,4.启动引导

Initramfs:内存中跑的,不需要制作映像文件

Ubifs:nandflash运行的,占用内存小,挂载快

Jffs2:主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。

RTC驱动:使系统处于关机状态下也能够正常工作

触摸屏:触摸屏按下,产生x,y两方向上的模拟信号,进入AD转换器,再触发相应中断进行处理,在中断程序处理程序中来上报数据。

PWM(脉冲宽度调制)改变脉冲宽度来控制输出电压,改变周期来控制输出频率,改变频率可发出不同的声音

四.GPRS:

1.GPRS模块是怎么跟开发板连接的,通过串口RS232,串口有几根弦,用到了那几根线(9根,用到三根txd, rxd, gnd),还有哪些线以及是干嘛的,

a) 管脚1为:数据载波检测: DCD

b) 管脚2为:接收数据: RXD

c) 管脚3为:发送数据: TXD

d) 管脚4为:数据终端设备: DTR

e) 管脚5为:地线: GND

f) 管脚6为:数据设备准备好: DSR

g) 管脚7为:请求发送: RTS

h) 管脚8为 :清除发送: CTS

i) 管脚9为:振铃指示: DELL

1、 初始化串口:

a) 波特率: 串口收发的速度

b) 数据位: 实际传输的时候的顺序是这样:1位起始位、数据0、数据1...、数据71位偶校验、1位停止位

c) 奇偶校验位: 奇偶校验用在数据通信中来保证数据的有效性,传输过程中包括校验位在内的奇数个或偶数个数据位发生改变,那么奇偶校验位将出错表示传输过程有错误发生,但是无法确定哪个一数据位发生错误,所以不能纠正错误,把数据全部丢掉,重新传

d) 停止位

串口名称

拨号的实现过程:

1, 内核make menuconfig使能ppp协议;

2, AT命令查SIM卡在位,信号强度,注册情况,配置APN;

检查SIM卡是否注册上: AT+CPIN?   返回值 READY   

检查信号的强度: AT+CSQ    返回值 +CSQ 2999

检查模块版本: AT+CGMR 返回值为模块的版本

发送短信 AT+CMGF=1PS1是文本模式0PDU模式) 然后AT+CMGS=”号码”

》要发送短信的内容    (若要发中文短信要进行PDU编码 )

然后按 Ctrl+Z发送

ATD号码;为拨打电话  ATA为接电话    ATH为挂断电话

 

拨号上网:  使用的是内置协议栈还是外置协议栈,描述ppp拨号的过程:

我们使用的是外置协议栈,Linux内核自带的ppp协议; 内置的协议栈直接用GPRS模块的AT命令作数据的收发;

3, 移植并运行pppd命令和chat命令开始拨号;

4, 拨号成功会产生ppp0网络设备

 

五.关于串口

1、 我们所用的串口为9个管脚

a) 管脚1为:数据载波检测: DCD

b) 管脚2为:接收数据: RXD

c) 管脚3为:发送数据: TXD

d) 管脚4为:数据终端设备: DTR

e) 管脚5为:地线: GND

f) 管脚6为:数据设备准备好: DSR

g) 管脚7为:请求发送: RTS

h) 管脚8为 :清除发送: CTS

i) 管脚9为:振铃指示: DELL

2、 初始化串口:

a) 波特率: 串口收发的速度

b) 数据位: 实际传输的时候的顺序是这样:1位起始位、数据0、数据1...、数据71位偶校验、1位停止位

c) 奇偶校验位: 奇偶校验用在数据通信中来保证数据的有效性,传输过程中包括校验位在内的奇数个或偶数个数据位发生改变,那么奇偶校验位将出错表示传输过程有错误发生,但是无法确定哪个一数据位发生错误,所以不能纠正错误,把数据全部丢掉,重新传

d) 停止位

e) 串口名称  

如何用硬件测试一段程序的运行时间

单片机有自带捕获功能,程序运行,计算开始时,引脚输出高电平,结束时,引脚输出低电平,STM32定时器输入捕获功能,可精确地测出高电平脉宽,然后通过串口发送给电脑显示,写个测脉宽程序,测量一个PWM波,硬件连好,选个采样周期即可计算出时间

六.WIFI:

1、 WIFIAP模式分为硬AP和软AP,其中硬AP为路由器,在这里我们使用的是软AP需要移植hostapd这个软件

2、 WIFI Station模式需要移植wpa_supplicant这个工具包  工具包里有wpa_passphrase、wpa_supplicant、wpa_cli 这几个工具,用wpa_passphrase来生产wpa_supplicant.conf配置文件里面有WiFi名称、密码、认证方式、加密方式等(生成的命令为:wpa_passphrase ssid psk>>wpa_supplicant.conf 然后用 wpa_supplicant来连接路由器(连接命令为:wpa_supplicant -Dwext -iwlan0 -c/apps/wpa_supplicant.conf &),然后硬ifconfig来配置无线网卡的IP地址ifcofnig wlan0  192.168.1.2   配置好后就可以ping自己的主机了   

3、 若要想上外网就得给开发板添加域名解析服务   创建一个叫resolv.conf的文件   在里面写nameserver 4.2.2.2   nameserver 8.8.8.8    然后用sourcce命令 使能文件

4、 添加默认网关 route add default gw 192.168.1.1   这样就能ping百度啦

动态分配IP   Busybox配置  udhcpd就是终端设备作为DHCP服务器 ;udhcpc就是终端设备作为DHCP客户端;  udhcpc  -i wlan0    启动网卡 就可以了

STA模式:笔记本上无线网卡模式,用来连接到无线路由器上网,通俗点即客户端模式

1.配置linux内核支持wireless无线上网,使能内核,make menuconfig配置使能RT3070驱动,将cfg80211选项选上。

2.WIFI Station模式需要移植wpa_supplicant这个工具包  工具包里有wpa_passphrase、wpa_supplicant、wpa_cli 这几个工具,用wpa_passphrase来生产wpa_supplicant.conf配置文件里面有WiFi名称、密码、认证方式、加密方式等(生成的命令为:wpa_passphrase ssid psk>>wpa_supplicant.conf)然后用 wpa_supplicant来连接路由器(连接命令为:wpa_supplicant -Dwext -iwlan0 -c/apps/wpa_supplicant.conf &),然后硬ifconfig来配置无线网卡的IP地址ifcofnig wlan0  192.168.1.2   配置好后就可以ping自己的主机了

3.若要想上外网就得给开发板添加域名解析服务   创建一个叫resolv.conf的文件   在里面写nameserver 4.2.2.2   nameserver 8.8.8.8    然后用sourcce命令 使能文件

4.添加默认网关 route add default gw 192.168.1.1   这样就能ping百度啦

注:动态模式即板子自己去动态随机获取ip联网,即可不给wlan0的ip完成此功能,动态分配IPBusybox配置  udhcpd就是终端设备作为DHCP服务器 ;udhcpc就是终端设备作为DHCP客户端;  udhcpc  -i wlan0    启动网卡  就可以了

AP模式:即作为无线路由器,提供其他用户接入(路由器)

实现过程:

1.Linux内核make menuconfig要选上RT3070驱动和nl80211的支持

2.一直hostapd程序并配置,主要用vim hostapd.cofig中设置

ssid:无线路由器发射的wifi名称

hw_mode:指定802.11协议,一般工作在2.4GHZ的频段内,为什么不用5G,因为2.4GHZ穿墙能力强,但5GHZ速度快。

 802.11 (原始标准:工作在2.4GHz  2Mbps

 802.11a(物理层补充:5GHz 54Mbps

 802.11b(物理层补充:2.4GHz 11Mbps

 802.11g(物理层补充:2.4GHz 54Mbps

 802.11n09年通过的正式标准:2.4GHz 600Mbps

IEEE 802.11是现今无线局域网通用的标准,它是由国际电机电子工程学会(IEEE)所定义的无线网络通信的标准。在以下标准中,使用最多的应该是802.11n标准,工作在2.4GHz频段,可达600Mbps(理论值)。

认证方式:开放web(不需密码),WEP,WPA          加密方式:TKIP,AES

3.iptables做NAT表和开启LINUX内核IP数据转发

默认的规则链有:INPUT,OUTPUT,NAT,POSTROUTING,PREROUTING;
iptables -F清除指定链和表中的所由规则,假如不指定链,那么所有链都将被清空.

-A在所选链尾加入一条或多条规则 
-D在所选链尾部删除一条或者多条规

Iptables作为防火墙时打开或者关闭某个端口怎么操作

开启端口,以22号端口为例:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
关闭端口,以22号端口为例:
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A OUTPUT -p tcp --sport 22 -j DROP

4.DHCP服务器使能和配置

如何修改MAC地址:1.首先必须关闭网卡设备,否则会报告系统忙,无法更改,命令为ifconfig eth0 down

2.修改MAC地址,命令为ifcofig eth0 hw ether +地址

3.重新启用网卡,命令为ifconfig eth0 up 这样网卡的MAC地址更改就完成了

七. nandflashnorflash的区别

Flash编程原理都是只能将1写为0,而不能将0写成1.所以在Flash编程之前,必须将对应的块擦除,而擦除的过程就是将所有位都写为1的过程,块内的所有字节变为0xFF.因此可以说,编程是将相应位写0的过程,而擦除是将相应位写1的过程,两者的执行过程完全相反.

(1)闪存芯片读写的基本单位不同
       应用程序对NorFlash芯片操作以为基本单位.为了方便对大容量NorFlash闪存的管理,通常将NOR闪存分成大小为128KB64KB的逻辑块.读写时需要同时指定逻辑块号和块内偏移.应用程序对NandFlash芯片操作是以为基本单位.NAND闪存的块比较小,一般是8KB,然后每块又分成页,页大小一般是512字节.要修改NandFlash芯片中一个字节,必须重写整个数据块.


(2)NorFlash闪存是随机存储介质,用于数据量较小的场合;NandFlash闪存是连续存储介质,适合存放大的数据.


(3)由于NorFlash地址线和数据线分开,所以NorFlash芯片可以像SDRAM一样连在数据线上.NOR芯片的使用类似于通常内存芯片,传输效率高,可执行程序可以在芯片内执行(XI P, eXecute In Place),这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM.由于NorFlash的这个特点,嵌入式系统中经常将NOR芯片做启动芯片使用.NandFlash共用地址和数据总线,需要额外联结一些控制的输入输出,所以直接将NAND芯片做启动芯片比较难.

 
(4)NandFlash闪存芯片因为共用地址和数据总线的原因,不允许对一个字节甚至一个块进行的数据清空,只能对一个固定大小的区域进行清零操作;NorFlash芯片可以对字进行操作.所以在处理小数据量的I/O操作的时候的速度要快与NorFlash的速度.

 
(5)NandFlash闪存的容量比较大,最大容量己达到8G字节.为了方便管理,NandFlash的存储空间使用了块和页两级存储体系,也就是说它的存储空间是二维的.在进行写操作时,NandFlash闪存每次将一个字节的数据放入内部的缓存区,然后再发出写指令进行写操作.由于对NandFlash闪存的操作都是以块和页为单位的,所以在向NandFlash闪存进行大量数据的读写时,NAND的速度要快于NOR闪存.


(6)NorFlash闪存的可靠性要高于NandFlash闪存,是因为NorFlash型闪存的接口简单,数据操作少,位交换操作少,因此可靠性高,极少出现坏区块,一般用在对可靠性要求高的地方.NandFlash型闪存接口和操作均相对复杂,位交换操作也很多,因此出现问题的几率要大得多,坏区块也是不可避免的,而且由于坏区块是随机分布的,连纠错也无法做到.

补充:linux下查看CPU使用率的命令?

1.top

使用权限:所有使用者

使用方式:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]

说明:即时显示process的动态

d :改变显示的更新速度,或是在交谈式指令列( interactive command)按s

q :没有任何延迟的显示速度,如果使用者是有superuser的权限,则top将会以最高的优先序执行

c :切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称S :累积模式,会将己完成或消失的子行程( dead child process )的CPU time累积起来

s :安全模式,将交谈式指令取消,避免潜在的危机

i :不显示任何闲置(idle)或无用(zombie)的行程

n :更新的次数,完成后将会退出top

b :批次档模式,搭配"n"参数一起使用,可以用来将top的结果输出到档案内

 

范例:

显示更新十次后退出;

top -n 10

 

使用者将不能利用交谈式指令来对行程下命令:

top -s

 

将更新显示二次的结果输入到名称为top.log的档案里:

top -n 2 -b < top.log   

另附一个命令简介linux traceroutewindows tracert两个命令相当,跟踪网络路由

 

2.vmstat

正如我们之前讨论的任何系统的性能比较都是基于基线的,并且监控CPU的性能就是以上3点,运行队列、CPU使用率和上下文切换。以下是一些对于CPU很普遍的性能要求:

1.对于每一个CPU来说运行队列不要超过3,例如,如果是双核CPU就不要超过6;

2.如果CPU在满负荷运行,应该符合下列分布,

a) User Time:65%~70%

b) System Time:30%~35%

c) Idle:0%~5%

3. mpstat

对于上下文切换要结合CPU使用率来看,如果CPU使用满足上述分布,大量的上下文切换也是可以接受的。

常用的监视工具有:vmstat, top,dstat和mpstat.

# vmstat 1

procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----

r b swpd free buff cache si so bi bo in cs us sy id wa

0 0 104300 16800 95328 72200 0 0 5 26 7 14 4 1 95 0

0 0 104300 16800 95328 72200 0 0 0 24 1021 64 1 1 98 0

0 0 104300 16800 95328 72200 0 0 0 0 1009 59 1 1 98 0

r表示运行队列的大小,

b表示由于IO等待而block的线程数量,

in表示中断的数量,

cs表示上下文切换的数量,

us表示用户CPU时间,

sys表示系统CPU时间,

wa表示由于IO等待而是CPU处于idle状态的时间,

id表示CPU处于idle状态的总时间。

dstat可以给出每一个设备产生的中断数:

# dstat -cip 1

----total-cpu-usage---- ----interrupts--- ---procs---

usr sys idl wai hiq siq| 15 169 185 |run blk new

6 1 91 2 0 0| 12 0 13  | 0 0 0

1 0 99 0 0 0| 0    0  6 | 0 0 0

0 0 100 0 0 0| 18 0  2 | 0 0 0

0 0 100 0 0 0| 0    0  3 | 0 0 0

我们可以看到这里有3个设备号15,169和185.设备名和设备号的关系我们可以参考文件/proc/interrupts,这里185代表网卡eth1.

# cat /proc/interrupts

CPU0

0: 1277238713 IO-APIC-edge timer

6: 5 IO-APIC-edge floppy

7: 0 IO-APIC-edge parport0

8: 1 IO-APIC-edge rtc

9: 1 IO-APIC-level acpi

14: 6011913 IO-APIC-edge ide0

15: 15761438 IO-APIC-edge ide1

169: 26 IO-APIC-level Intel 82801BA-ICH2

185: 16785489 IO-APIC-level eth1

193: 0 IO-APIC-level uhci_hcd:usb1

mpstat可以显示每个CPU的运行状况,比如系统有4个CPU。我们可以看到:

# mpstat –P ALL 1

Linux 2.4.21-20.ELsmp (localhost.localdomain) 05/23/2006

05:17:31 PM CPU %user %nice %system %idle intr/s

05:17:32 PM all 0.00 0.00 3.19 96.53 13.27

05:17:32 PM 0 0.00 0.00 0.00 100.00 0.00

05:17:32 PM 1 1.12 0.00 12.73 86.15 13.27

05:17:32 PM 2 0.00 0.00 0.00 100.00 0.00

05:17:32 PM 3 0.00 0.00 0.00 100.00 0.00

总结的说,CPU性能监控包含以下方面:

检查系统的运行队列,确保每一个CPU的运行队列不大于3.

确保CPU使用分布满足70/30原则(用户70%,系统30%)。

如果系统时间过长,可能是因为频繁的调度和改变优先级。

CPU Bound进程总是会被惩罚(降低优先级)而IO Bound进程总会被奖励(提高优先级)。

 

4.prstat命令

要显示系统上当前运行的进程和项目的各种统计信息,请使用带有-J选项的prstat命令:%prstat -J

要显示系统上当前运行的进程和任务的各种统计信息,请使用带有-T选项的prstat命令:%prstat -T


注–

-J-T选项不能一起使用。



0 0