【转】 中兴技术面试心得
时间:2010-06-08 来源:sinodragon21
周末一直在想笔试题目有点难,考得不太好,结果凌晨1点发来通知,早上到实验室 发现大家都收到面试通知了。
下午面试,地点就在学校附近的酒店房间,基本一层楼被包下作为面试点,两位HR,一男一女。
上来基本没时间做自我介绍,直接看简历,提问。
可能是我的简历写了很多嵌入式Linux开发,多数为这方面问题。
1、写出尽量多的linux命令
ps、mv、cp、ls、top、vim、gedit、top、git、man,其他的忘了,总之写了有十来个。
接着问列出所有用户进程的命令,直觉应该是ps命令加参数,但没用过,只能老实回答必须要看命令帮助才能答出,可以用ps --help或者man ps查看命令的参数。
2、谈谈Linux驱动开发流程
貌似我也不懂正确的流程,就把我做驱动的流程说了下:
1)裸机调通硬件(比如ARM先用ADS调试)
2)熟悉驱动框架,需要完成哪些函数
3)建立起驱动dummy框架,使得上层可以正确调用
4)逐个完成驱动具体需要完成的函数(比如write函数,read函数等等)
5)整体测试
6)Debug
7)Codereview等等
说到codereview HR似乎很熟悉这个,问我们使用的什么标准,我还真不懂用的什么标准,我们的codereview就是大家坐在一起,看看代码有没有明显的bug,比如格 式不好,内存泄露一类的,最后回答了C用的是ANSI C标准,估计HR想问的是我们的CMM等级吧(貌似没有?)。
3、第三个问题是字符串编程
可惜了这个字符串问题,明明知道会考,这次中兴来的太早,还没开始准备,不过说来平时做驱动里面还真是用不到,做应用可能会用到。
一开始叫写strtok,可怜的我一脸茫然,没听过这个函数,然后换写strstr,找子串,头脑里大概蹦出用循环一个一个对比,但是当场写出来估计后面 也没有面其他问题的时间了,放弃吧,实话实说目前我就会写strcpy,平时项目中不用字符串。
4、字符串不会,于是问我汇编如何,当场冷汗,答能看懂,于是让我用汇编写个2的n次方出来,我都答能看懂了,还要写啊!
2的n次方,第一反应是用左移,左移貌似是LSL,最后憋出来三句汇编
ADR R0,N <--解释这个是地址
MOV R1,RO <--这个写错了,应该是MOV R1,[RO],这个是数值
LSL R2,R1
上面代码的结果应该是R2乘以2的n次方,那R2应该是1才对(忘写了,貌似当时写的也不是R2,记不清了)
不过HR貌似用X86架构,不用ARM,所以问我这是什么汇编,答曰ARM汇编,解释了半天寄存器,然后告诉HR目前所有工作都是基于ARM架构的。
还有继续问函数返回问题,问返回地址,当时在想汇编,答是sp,傻了,应该是lr,但这个和X86架构很不一样,所以应该不是HR想要的结果。
5、Linux内核裁剪流程<--这个俺长做
1)git 官网下Linux内核
2)添加特定处理器的架构代码(mach目录)<--应该说打个patch比较正规
3)选定使用的编译器,arm架构目前主要eabi的编译器
4)make menuconfig 配置内核<--漏了添加各种各样的驱动
5)make
6)大量的debug
7)生成内核
最后还问了问最新的linux内核版本(2.3.33)
4-5基本是穿插进行的,5结束后问我汇编写完没
总之,20分钟的面试很短,2个大题做的不好,估计勉强能及格吧,如果不要我也没关系,来练练手的,相信充分准备后是可以取得更好的成绩。
这次中兴来的这么早,正好让我们了解下笔试和面试的流程,这个暑假可以进行充分的准备,希望自己能找到满意的工作。
PS1:我个人目标魔都,虽然老妈一直想让我回家。。<--无奈的眼神
PS2:我可怜的1年Android底层开发经验,HR貌似不关心这个,当Linux底层开发经验好了。。
Rockie Cheng
=======================
附录
1)[kyon@SEP4020 /]$ ps --help
********* simple selection ********* ********* selection by list *********
-A all processes -C by command name
-N negate selection -G by real group ID (supports names)
-a all w/ tty except session leaders -U by real user ID (supports names)
-d all except session leaders -g by session OR by effective group name
-e all processes -p by process ID
T all processes on this terminal -s processes in the sessions given
a all w/ tty, including other users -t by tty
g OBSOLETE -- DO NOT USE -u by effective user ID (supports names)
r only running processes U processes for specified users
x processes w/o controlling ttys t by tty
*********** output format ********** *********** long options ***********
-o,o user-defined -f full --Group --User --pid --cols --ppid
-j,j job control s signal --group --user --sid --rows --info
-O,O preloaded -o v virtual memory --cumulative --format --deselect
-l,l long u user-oriented --sort --tty --forest --version
-F extra full X registers --heading --no-heading --context
********* misc options *********
-V,V show version L list format codes f ASCII art forest
-m,m,-L,-T,H threads S children in sum -y change -l format
-M,Z security data c true command name -c scheduling class
-w,w wide output n numeric WCHAN,UID -H process hierarchy
2)strtok
char *mystrtok(register char *s, register const char *delim) {
static char *last;
char *tok;
char *ucdelim;
/*(1)s为空,并且上次剩余值也为空,则直接返回NULL,否则s为last或当前值中有值的一方*/
/*if (s == NULL && (s = last) == NULL)
return NULL;*/
/*(2)以上内容与下面等价:
下面意为:如果s==NULL的时候,s则为last(上次执行该项的时候的剩余值);
若这时候s还为空(即上次没有剩余),则返回NULL。
*/
if (s == NULL)
s = last;
if(s == NULL)
return NULL;
/*(3)也意为:若后续值为NULL则不进行操作,否则继续操作。
其中,后续值的界定方法为: 若last不为空的时候,则s为last,否则为输入值
* */
/*
if(last != NULL)
s = last;
else if(s == NULL)
return NULL;*/
tok = s;
int found = 0;
while (!found && *s != '\0') {
ucdelim = (char *) delim;
while (*ucdelim) {
if (*s == *ucdelim) {
found = 1;
*s = '\0';
last = s + 1;
break;
}
ucdelim++;
}
if (!found)
s++;
}
return tok;
}
3 strstr
/* Written by Philippe De Muyter <[email protected]>. */
char *
strstr (buf, sub)
register char *buf;
register char *sub;
{
register char *bp;
register char *sp;
if (!*sub)
return buf;
while (*buf)
{
bp = buf;
sp = sub;
do {
if (!*sp)
return buf;
} while (*bp++ == *sp++);
buf += 1;
}
return 0;
}
strstr的实现 看来还是比较简单,不过这样比较,每次移动一位,貌似效率低点