Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5224778
  • 博文数量: 1696
  • 博客积分: 10870
  • 博客等级: 上将
  • 技术积分: 18357
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-30 15:16
文章分类
文章存档

2017年(1)

2016年(1)

2015年(1)

2013年(1)

2012年(43)

2011年(17)

2010年(828)

2009年(568)

2008年(185)

2007年(51)

分类: C/C++

2010-06-08 02:54:16

周末一直在想笔试题目有点难,考得不太好,结果凌晨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 <>. */
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的实现 看来还是比较简单,不过这样比较,每次移动一位,貌似效率低点

阅读(829) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~