linux驱动面试题2

1.什么是GPIO?

general purpose input/output  

GPIO是相对于芯片本身而言的,如某个管脚是芯片的GPIO脚,则该脚可作为输入或输出高或低电平使用,当然某个脚具有复用的功能,即可做GPIO也可做其他用途。 

也就是说你可以把这些引脚拿来用作任何一般用途的输入输出,例如用一根引脚连到led的一极来控制它的亮灭,也可以用一根(一些)引脚连到一个传感器上以获得该传感器的状态,这给cpu提供了一个方便的控制周边设备的途经。如果没有足够多的gpio管脚,在控制一些外围设备时就会力有不逮,这时可采取的方案是使用CPLD来帮助管理。

2.触摸屏的硬件原理?
触摸屏的主要三大种类是:电阻技术触摸屏、 表面声波技术触摸屏、 电容技术触摸屏。

电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏, 这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,表面图有一层透明氧化金属 (ITO氧化铟,透明的导电电阻) 导电层,上面在盖有一层外表面硬化处理、光滑防擦的塑料层 、它的内表面也涂有一层ITO涂层 、在他们之间有许多细小的(小于1/1000英寸)的透明隔离点把两层导电层隔开绝缘 。当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,控制器侦测到这一接触并计算出(X,Y )的位置,再根据模拟鼠标的方式运作。这就是电阻技术触摸屏的最基本的原理。

表面声波技术是利用声波在物体的表面进行传输,当有物体触摸到表面时,阻碍声波的传输,换能器侦测到这个变化,反映给计算机,进而进行鼠标的模拟。

电容技术触摸屏利用人体的电流感应进行工作 。用户触摸屏幕时 ,由于人体电场,用户和触摸屏表面形成以一个耦合电容, 对于高频电流来说,电容是直接导体,于是手指从接触点吸走一个很小的电流


3. 在Linux C中,ls这个命令是怎么被执行的?
使用fork创建一个进程或exec函数族覆盖原进程。

4.在一个只有128M内存并且没有交换分区的机器上,说说下面两个程序的运行结果
1,
#define MEMSIZE 1024*1024
int count = 0;
void *p = NULL;
while(1) {
  p = (void *)malloc(MEMSIZE);
  if (!p) break;
  printf("Current allocation %d MB\n", ++count);
}

2,
while(1) {
  p = (void *)malloc(MEMSIZE);
  if (!p) break;
  memset(p, 1, MEMSIZE);
  printf("Current allocation %d MB\n", ++count);
}

第一道程序分配内存但没有填充,编译器可能会把内存分配优化掉,程序死循环;第二道,程序分配内存并进行填充,系统会一直分配内存,直到内存不足,退出循环。

5.请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句
搞的比较复杂。主要思想就是a-b的值的最高位是否为0;但是又得考虑整数溢出的问题,所以很复杂。不知道哪位大侠有更好的办法,指点指点。

  1. #include<stdio.h>

  2. #define ZHENG(i)((i>> 31)== 0)
  3. #define FU(i)((i>> 31)!= 0)
  4. #define COMPARE(a,b)((ZHENG(a)&& FU(b))||(((ZHENG(a)&& ZHENG(b))||(FU(a)&& FU(b)))&&((((a)-(b))>> 31)== 0)))

  5. void main()
  6. {
  7.     int a = 0x80000001;
  8.     int b = 0x6FFFFFFF;

  9.     if(COMPARE(a,b))
  10.     {
  11.         printf("a >= b\n");
  12.     }
  13.     else
  14.     {
  15.         printf("a < b\n");
  16.     }
  17. }

 

 

 

1、LINUX下的Socket套接字和Windows下的WinSock有什么共同点?请从C/C++语言开发的角度描述,至少说出两点共同点。(10分,说得好的每点加5分,没有上限。精通SOCK编程者破格录用。)



本题的目的就是考考应试者的SOCK功底,以及应用能力。答案可谓是五花八门,但是答对的少得可怜。其实答案很多,也很好回答。可见面试者功底确实一般,对SOCK编程只是一知半解。更有甚者,把TCP/IP的原理搬出来讲了一大堆,却无一条符合要求。



参考答案:

第1题,答中一个得5分,答出其它正确答案的,也得5分。

a)都基于TCP/IP协议,都提供了面向连接的TCP SOCK和无连接的UDP SOCK。

b)都是一个sock结构体。

c)都是使用sock文件句柄进行访问。

d)都具有缓冲机制。



2、请编写一个标准Shell脚本testd,实现如下功能:

A、在Linux操作系统启动的时候,自动加载/mnt/test/test程序。

B、当test异常退出之后,自动重新启动。

C、当test程序重启次数超过100次,自动复位操作系统。

假设你所拥有的资源:

A、目标机器是一台具有标准shell的嵌入式计算机,CPU为ARM7 56MB,内存16MB,软件环境基于Linux2.6.11和BusyBox1.2构建。

B、当前已有11个用户进程在运行,占用了大部分的CPU时间和内存,你可使用的内存只有2MB左右,CPU时间由系统分派。

(本题满分20分,程序15分,注释5分。程序不能运行的0分,能够运行但有BUG的10分,能够正确无误的运行的15分。清楚编写注释的5分。)



本题是考查LINUX和嵌入式编程功底的,写出程序来的不少,但是95%以上的人竟无视我假设的资源,不知道在重启test程序的时候需要加上一个适当的
掩饰时间,以便资源紧张的操作系统有时间回收资源。85%的人不知道写完testd之后,要在init里边加载这个脚本,才能实现启动时自动加载的功能。
有人甚至在脚本开头使用bash作为脚本解析器,我已经清清楚楚说明了用“标准shell”!用sh不就完了吗?是习惯作祟吗?



参考答案:

########################################

#testd is a daemon script to start an watch the program test

########################################

#!/bin/sh



#load *.so that may need

if [ -r /sbin/ldconfig ]; then

ldconfig

fi



#add the libs PATH that may need

export LD_LIBRARY_PATH="/lib"



#count is the counter of test started times

count=0



#main loop

while [ 1 ] ;do

#add execute property for /mnt/test/test

chmod +x /mnt/test/test

#start test

/mnt/test/test

#the running times counter

let count=count+1

echo "test running times is $count"

#Is test running too many times?

if [ "$count" -gt 100 ]; then

echo "Will reboot because of test running too many times"

reboot

fi

#wait for test stoping...

sleep 3

done

#########################################

 

 


就业模拟测试题-LINUX驱动、系统底层工程师职位   1.你平常是怎么用C写嵌入式系统的死循环的? [3分]  2.写一条命令,实现在dir以及其子目录下找出所有包含“hello world”字符串的文件[2分] 

 

3.下面的两段程序中,循环能否执行?为什么?

A: unsigned short i; unsigned short index = 0; for(i = 0; i <index-1; i++){     printf(“a\n”); }
                       B: unsigned short i; unsigned long index = 0; for(i = 0; i <index-1; i++){      printf(“b\n”); }  
                

4.一个计划跑LINUX系统的ARM系统把bootloader烧录进去后,上电后串口上没有任何输出,硬件和软件各应该去检查什么?   

 提示: 1.跑LINUX的系统一般都需要外扩DRAM,一般的系统也经常有NOR或NAND FLASH          

 

2.bootloader一般是由汇编和C编写的裸奔程序[5分] 

 

 

 5.列举最少3种你所知道的嵌入式的体系结构,并请说明什么是ARM体系结构。[7分] 

 

6.请简述下面这段代码的功能 mov r12, #0x0        ldr r13, =0x30100000 mov r14, #4096 loop:   ldmia      r12!, {r0-r11}  stmia      r13!, {r0-r11}    cmp       r12, r14   blo          loop  [2分]

 

 


 7.嵌入式中常用的文件系统有哪些?说出它们的主要特点和应用场合?[5分] 

 Ext2/ Ext3   ,Romfs ,  Ramdisk,  Cramfs,Jffs/jffs2, Tmpfs, Yaffs

 

Ramdisk是通过将计算机的 RAM 用作设备来创建和挂装文件系统的一种机制,它通常用于无盘系统(当然包括微型嵌入式设备,它只包含作为永久存储媒质的闪存芯片)。

uClinux系统多采用Romfs文件系统,Romfs是一种相对简单、占用空间较少的文件系统。空间的节约来自于两个方面:首先内核支持Romfs文件系统比支持ext2文件系统需要更少的代码;其次romfs文件系统相对简单,在建立文件系统超级块(Superblock)需要更少的存储空间。Romfs是只读的文件系统,禁止写操作,因此系统同时需要虚拟盘(RAMDISK)支持临时文件和数据文件的存储。  只读文件系统,可以放在ROM空间,也可以在系统的RAM中,嵌入式linux中常用来作根文件系统。

 

JFFS2是比较常用的嵌入式日志文件系统。JFFS2 因为有以下这些优点而在无盘嵌入式设备中越来越受欢迎:
  JFFS2 在扇区级别上执行闪存擦除/写/读操作要比 Ext2 文件系统好。
  JFFS2 提供了比 Ext2fs 更好的崩溃/掉电安全保护。JFFS2 是专门为象闪存芯片那样的嵌入式设备创建的,所以它的整个设计提供了更好的闪存管理。

 

 8.某外设寄存器rGpioBase的地址是0x56000000,寄存器的0~15位有效,请写出给外设寄存器高八位(8~`15位)设置成0xc3的代码[7分] 

 

9.根据时序图和说明编写程序:


  GPIO已经设置好,只需要调用函数gpio_seet_level(int gpio, int level)即课使某个GPIO输出高电平或者低电平。图中用于产生时序的gpio已经分别定义为SSP_XCS,SSP_SCLK,SSP_DIN,level的定义分别为GPIO_LO和GPIO_HI,需要编写函数的原型为:void ssp_io_write_word(u32 command),该函数用来输出一个字(如上图中的A0到C0一组9位),这9个位是在参数command中的低9位. [5分]  10.简述LINUX系统从上电开始到系统起来的主要流程?  提示: 1.可以uboot、内核和文件系统的主要功能去总结         

 

 

时序图,肯定是从左到右,按照时间的流向看了,首先要明确各个信号的含义与他们之间的关系。控制线,地址线,数据线等等要分清楚,注意是边沿有效还是电平有效什么的,然后看着datasheet上与该时序图对应的文字及其详细参数说明,刚开始可以不去理会那些参数要求,除非时钟速率快,一般都能满足的。

 

看时序的时候要注意观察各种输入的上沿、下沿与输出的关系,在此之前要看清楚什么是使能信号。一般在使能信号有效的时候,各种输入的上下沿与输出的变化关系才存在,否则就不会存在。

 

9,观察简单时序图,分析

答:

是实际工作的时序图,斜坡表示信号的建立时间,此时逻辑状态是不稳定的,各个信号的时间配合要避开建立时间段。
如 CPU 把数据写入存储器的时序是:地址信号最早建立、输出数据、写入脉冲,一个嵌套着一个。
下图是A/D芯片0809的转换时序,也是地址先建立(C、B、A),然后选通(START)、等待转换完成(OE)、数据输出(D7~D0)。

 

10,Nand flash的时序图分析

 

11,分析下个简单的时序图

答:    两条线相交只是代表该时刻的数据变化,没什么意思
平行线代表数据线上的传输的数据,可以说是一个脉冲

 

 

2.这个题主要是在笔试之后的面试,需要在3~5分钟之内表述清楚[8分] 

 

 

11.如何编写一个LINUX驱动?

 

提示:主要说字符设备的编写过程 [7分]    12.简述LINUX驱动中字符设备和块设备的区别?[5分]   

 

 

13.试总结单片机底层开发与LINUX驱动开发有哪些异同?[4分] 

 

 

 14.请从网卡、USB HOST、LCD驱动器、NAND FLASH、WIFI 、音频芯片中选择一个或者2个(可以以具体的芯片为例),对下面的问题做答:
1.如果是外部扩展芯片,请说出你用的芯片的型号
                      [每空5分] 

 

15.画出上题中你选定相应硬件模块与CPU的主要引脚连线[5分]  16. 编写上题中你选定相应硬件模块相应LINUX驱动的流程?[6分] 

 

16,Yaffs与jffs2文件系统比较

 

Nand上yaffs文件系统的优势 • 专门为Nand flash设计的日志文件系统,提供磨损平衡和调电恢复的鲁棒性。 Yaffs将文件组织成固定大小(512B)的数据段,在进行文件修改时,总是先写入新的数据块,然后将旧的的数据块从文件中删除。
 jffs/jffs2文件系统的缺点:
  •不适合大容量的Nand flash
  • jffs的日志通过jffs_node建立在RAM中,占用RAM空间:对于128MB的Nand大概需要4MB的空间来维护节点
  • 启动的时候需要扫描日志节点,不适合大容量的Nand flash
 • FAT系统没有日志

 

17

嵌入式中软件访问硬件有两种方式。1.gpio寄存器操作引脚2.通过地址总线。请问:什么时候用gpio,什么时候用总线?

总线,比如SPI、I2C等,在芯片内部会有相应控制器去完成其大部分功能,只要配置好寄存器就能用。

而GPIO一般只是简单的高低电平控制,用来模拟总线是非常困难的。

用总线还是GPIO,肯定与硬件连线有关。也可以用软件模拟总线,但很麻烦且可能不稳定,除非是简单的信号。

 
int *ptr = (int *)0xaa66; *ptr = 0x67a9; 
我感觉自己写的应该不算错吧(自我感觉,还请达人指正),我写的适合裸机下用,当做寄存器用,而答案就是适合在操作系统下的写法。 
   
1. linux内核里面,内存申请有哪几个函数,各自的区别?  
2. IRQ和FIQ有什么区别,在CPU里面是是怎么做的?  

FIQ和IRQ是两种不同类型的中断,ARM为了支持这两种不同的中断,提供了对应的叫做FIQ和IRQ处理器模式(ARM有7种处理模式)。

系统更快响应,自身处理所耗时间也很短的中断设置为FIQ,否则就设置了IRQ。

FIQ比IRQ有更高优先级,如果FIQ和IRQ同时产生,那么FIQ先处理。

 

 

3.   
int *a;  
char *b;  
a 和 b本身是什么类型?  
a、b里面本身存放的只是一个地址,难道是这两个地址有不同么?    


4. 中断的上半部分和下半部分的问题:  
讲下分成上半部分和下半部分的原因,为何要分?讲下如何实现?  

要求中断服务程序的执行时间越短越好。我们必须有一个快速、异步而且简单的处理程序专门来负责对硬件的中断请求做出快速响应,与此同时也要完成那些对时间要求很严格的操作。而那些对时间要求相对宽松,其他的剩余工作则会在稍候的任意时间执行,也就是在所谓的下半部分去执行。
5. 内核函数mmap的实现原理,机制?  

将页面映射到进程的地址空间中, 也就是说首先通过简单的产生某些内存管理数据结构完成映射的创建. 当进程访问页面时产生一个缺页中断, 内核将页面读入内存并且更新页表指向该页面。

先通过文件系统定位要映射的文件; 
权限检查, 映射的权限不会超过文件打开的方式, 也就是说如果文件是以只读方式打开, 那么则不允许建立一个可写映射; 
创建一个vma对象, 并对之进行初始化; 
调用映射文件的mmap函数, 其主要工作是给vm_ops向量表赋值; 
把该vma链入该进程的vma链表中, 如果可以和前后的vma合并则合并; 
如果是要求VM_LOCKED(映射区不被换出)方式映射, 则发出缺页请求, 把映射页面读入内存中.


6. 驱动里面为什么要有并发、互斥的控制?如何实现?讲个例子?  
7. spinlock自旋锁是如何实现的?  
8. 任务调度的机制?  
【二、本人碰到】  
1. 嵌入式linux和wince操作系统的特点和特性?  
2. 嵌入式linux中tty设备驱动的体系结构?  
3. 嵌入式设备,为加快启动速度,可以做哪些方面的优化?  

 

 


 
4. USB设备的枚举过程?  
5. PSRAM、SDRAM、DDR、DDR2的时序特性?  
6. I2C触摸屏芯片与CPU的数据传输流程?画出相关图例?(这题目记得不是太清楚了,大概是考查I2C设备驱动的数据传输过程) 

 

 

1、linux驱动分类

2、信号量与自旋锁

3、platform总线设备及总线设备如何编写

4、kmalloc和vmalloc的区别

5、module_init的级别

6、添加驱动

7、IIC原理,总线框架,设备编写方法,i2c_msg

8、kernel panic

9、USB总线,USB传输种类,urb等

10、android boot 流程

11、android init解析init.rc

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值