高分求教外企linux嵌入式笔试答案!

时间:2022-05-05 16:16:13
1.解释命令ls -amore具体含义.



2.LINUX中的管道指什么重定向又指什么



3.GCC -g -o test.elf test.c的具体含义.



4.浅述GCC编译器在编译时都有哪几个过程



5,在题3的基础上编写一MAKEFILE文件,要求能自动完成编译和清除功能



6.说明uclinux 和linux的区别



7解释下面一组GDB命令的含义.



break 94



run



info line 121



8.什么是链接脚本其作用是什么请编写一个简单的链接脚本



9.编写一个SHELL脚本程序,将当前目录及其子目录中所有后缀为.O类型文件的文件名输出到用户指定的文件中.



10.请写出5个LINUX基本系统调用的函数名称.



11.描述LINUX中字符设备驱动的基本编成框架.



12.编写一个hello world程序,要求以创建进程的方式打印hello world.



13.浅谈bootloader,kelnel,filesystem三者之间的关系.











3. Linux系统下.ko文件是什么文件?.so文件是什么文件?
4. 二维数组AA [ 3 ][ 7 ]的另外一种表示方法:
5. 请写出下列代码的输出内容
#include “stdio.h”
  main()
  {
   int a,b,c,d;
   a=10;
   b=a++;
   c=++a;
   d=10a++;
   printf(b,c,d:%d,%d,%d,b,c,d);
   return 0;
  }  
二、 编程题:
1. 写出两个排序算法,并说明哪个好?
2. 打开一个文件,并读取从第100字节开始的50字节数据。
3. 编写一个函数,输入一个的整型数字,可以选择按照81016进制输出字符串。
4. 如果有一个简单的helloworld项目目录如下:
# tree helloworld
helloworld
– file2.h
– file1.cpp
– file2.cpp
请编写一个Makefile文件。
三、 简答题:
ARM-linux启动分几部分,简述流程:

18 个解决方案

#1


哪个外企出这么多题目考啊?

#2


》。。。继续等待!

#3


1.解释命令ls -amore具体含义.
 还是ls -a|more

#4


1.解释命令ls -a | more具体含义.(题目我改了下,不然我实在无法理解)

   ls -a会从它的标准输出(STDOUT_FILENO)输出当前目录下的所有文件名,然而它的标准输出重定向到了一个管道的写端,more程序的标准输入(STDIN_FILENO)重定向到了这个管道的读端,这样ls -a程序的所有输出(当然是正确的输出,如果是错误输出,则继续输出到STDERR_FILENO上面)都成了more程序的标准输入

2.LINUX中的管道指什么重定向又指什么
  管道是进程间通信的一种方式(当然也可以是同一进程),具体定义可以上网查查。
  重定向,怎么说呢?这个我也不知道怎么去描述,题目1中就用到了管道和重定向,它可能会用到系统调用  dup or dup2


3.GCC -g -o test.elf test.c的具体含义.
   把test.c编译成test.elf,并加上调试信息


4.浅述GCC编译器在编译时都有哪几个过程
   预编译->编译成目标文件(词法分析,语法分析,语义分析等等)->连接目标文件


5,在题3的基础上编写一MAKEFILE文件,要求能自动完成编译和清除功能

   这个我就不写了

6.说明uclinux 和linux的区别
 
   uclinux我也没接触过,这个好像是不带mmu,但是我有疑问的地方就是不带mmu能实现多任务吗??

7解释下面一组GDB命令的含义.



break 94
   设置断点在有入口n函数文件的第94行


run
  开始跑起来


info line 121

  

8.什么是链接脚本其作用是什么请编写一个简单的链接脚本

 

9.编写一个SHELL脚本程序,将当前目录及其子目录中所有后缀为.O类型文件的文件名输出到用户指定的文件中.

  find ./ -name *.o > 用户指定的文件

10.请写出5个LINUX基本系统调用的函数名称.
    open,read,write,ioctl,mmap


11.描述LINUX中字符设备驱动的基本编成框架.
  VFS,cdev,struct file_operation


12.编写一个hello world程序,要求以创建进程的方式打印hello world.
   


13.浅谈bootloader,kelnel,filesystem三者之间的关系.
    bootloader会将kernel加载到内存(也有可能不会,如kernel在nor flash上面),然后跳转到kernel的入口点把控制权转给kernel。filesystem是kernel的一部分,其代码实在kernel中实现的(Linux中是这样的)









3. Linux系统下.ko文件是什么文件?.so文件是什么文件?
   其实Linux下面文件名根本不代表什么。但是从常识上讲,.ko代码是驱动编译成的格式,就像是目标文件(当然不是),里面还有很多符号尚未解决(引用kernel导出的符号)
   .so文件一般是动态库文件
4. 二维数组AA [ 3 ][ 7 ]的另外一种表示方法:
    
5. 请写出下列代码的输出内容
#include “stdio.h”
  main()
  {
   int a,b,c,d;
   a=10;
   b=a++;
   c=++a;
   d=10a++;
   printf(b,c,d:%d,%d,%d,b,c,d);
   return 0;
  }   
二、 编程题:
1. 写出两个排序算法,并说明哪个好?
2. 打开一个文件,并读取从第100字节开始的50字节数据。
3. 编写一个函数,输入一个的整型数字,可以选择按照81016进制输出字符串。
4. 如果有一个简单的helloworld项目目录如下:
# tree helloworld
helloworld
– file2.h
– file1.cpp
– file2.cpp
请编写一个Makefile文件。
三、 简答题:
ARM-linux启动分几部分,简述流程:

#5


好多。。

#6


在百度上查询,大多数可以解决,LZ有点懒哦

#7


引用 3 楼 keywie007 的回复:
1.解释命令ls -amore具体含义.
 还是ls -a|more


对喔。

#8


该回复于2011-04-07 08:37:14被版主删除

#9


该回复于2011-04-07 13:33:56被版主删除

#10


最后一题自己的理解 不一定对。分4部分,内部rom的boot启动,uboot启动,kernel启动,rootfs启动。

#11


这些都很基本,基本上工作中都会遇到。

#12


看似乎都是平时遇到的遇到的问题,要答好还挺难的

#13


该回复于2011-04-18 09:01:05被版主删除

#14


该回复于2011-04-18 14:55:23被版主删除

#15


对于这些问题我大体整理了一下,算是复习一下吧,希望对大家有帮助
1.解释命令ls -a | more具体含义.
   ls -a 是将当前目录下的文件名输出到终端,而加入后面的| more 是将输出结果分页显示
   
2.LINUX中的管道指什么重定向又指什么
管道命令操作符是:”|”,它仅能处理经由前面一个指令传出的正确输出信息,也就是 standard output 的信息,对于 stdandard 
error 信息没有直接处理能力。然后,传递给下一个命令,作为标准的输入
Linux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作。

区别是:
1)、左边的命令应该有标准输出 | 右边的命令应该接受标准输入
   左边的命令应该有标准输出 > 右边只能是文件
   左边的命令应该需要标准输入 < 右边只能是文件 
2)、管道触发两个子进程执行"|"两边的程序;而重定向是在一个进程内执行
3.GCC -g -o test.elf test.c的具体含义
  将test.c 文件编译输出为test.elf 带上调试信息,可以用GDB调试用
4.浅述GCC编译器在编译时都有哪几个过程
要经历四个相互关联的步骤:预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。

预处理(Preprocessing):命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。

编译(Compilation):接着调用cc进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。

汇编(Assembly):汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.s为后缀的汇编语言源代码文件和汇编.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。

连接(Linking):当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。



6.说明uclinux 和linux的区别
uclinux不具有的功能:
1).   没有虚存管理 
2).   不能运行时增加进程栈 
3).   不支持分页 
4).   可执行程序不是elf,   而是flat 
5).   不能用fork,   而是用vfork 
6).   RAMDISK
7解释下面一组GDB命令的含义.
break 94 设置断定,让程序在执行到第94行之前停止
run  运行准备调试的程序
info line 121 查看第121行设置的断点的信息
8.什么是链接脚本其作用是什么请编写一个简单的链接脚本
链接脚本主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局. 
实例:
以下脚本将输出文件的text section定位在0×10000, data section定位在0×8000000:
SECTIONS
{
. = 0×10000;
.text : { *(.text) }
. = 0×8000000;
.data : { *(.data) }
.bss : { *(.bss) }
}
解释一下上述的例子:
. = 0×10000 : 把定位器符号置为0×10000 (若不指定, 则该符号的初始值为0).

.text : { *(.text) } : 将所有(*符号代表任意输入文件)输入文件的.text section合并成一个.text section, 该section的地址由定位器符号的值指定, 即0×10000.

. = 0×8000000 :把定位器符号置为0×8000000
.data : { *(.data) } : 将所有输入文件的.data section合并成一个.data section, 该section的地址被置为0×8000000.

.bss : { *(.bss) } : 将所有输入文件的.bss section合并成一个.bss section,该section的地址被置为0×8000000+.data section的大小.

连接器每读完一个section描述后, 将定位器符号的值*增加*该section的大小. 注意: 此处没有考虑对齐约束.
9.编写一个SHELL脚本程序,将当前目录及其子目录中所有后缀为.O类型文件的文件名输出到用户指定的文件中.
ls -a | *.o >result.txt
10.请写出5个LINUX基本系统调用的函数名称.
包括与设备文件的交互和与普通文件的交互的系统调用(open, close, ioctl, create, unlink, . . . );与进程相关的系统调用又包括进程控制系统调用(fork, exit, getpid, . . . ),
11.描述LINUX中字符设备驱动的基本编写框架.
根据struct file_operations 的数据结构,填充里面的如:open,write,close,ioctl等函数
并进行模块的初始化和退出
12.编写一个hello world程序,要求以创建进程的方式打印hello world.
编写hello.c文件如下
 #include ""stdio.h "

 int main()
 {
 fork();
 printf("hello world!\n");
 exit(0);
 }
编译hello.c生成hello可执行文件
在shell中执行#fork hello
便可以看到打印结果
13.浅谈bootloader,kelnel,filesystem三者之间的关系.
嵌入式是linux启动过程如下。  
bootloader->kernel->filesystem->application
先是bootloader,它是linux-kernel移植的基石,Bootloader是在系统启动之后、Kernel运行之前所执行的第一段代码,其任务是为调用Kernel准备必要的软硬件环境。
完成bootlaoder的移植后,就是kernel的移植。主要包括添加特定模块的驱动,针对具体要求对内核进行配置。这里有两点要注意:一是有些参数要与所用的bootloader向对应,如nand的分区参数。二是bootlaoder对特定模块的驱动在进入kernel后便会有kernel接管,并有kernel重新驱动
文件系统主要是建立根文件和一些系统功能的实现,如bash。用busybox很容易搞定。


3. Linux系统下.ko文件是什么文件?.so文件是什么文件?
  Linux下面文件名不代表什么。但是从常识上讲,.ko代码是驱动编译成的格式,  .so文件一般是动态库文件
4. 二维数组AA [ 3 ][ 7 ]的另外一种表示方法:
  我想可以用指针来表示,如果数组元素为int型,则可以用int (*p)[7]来表示,p++后移动向下一行。
5. 请写出下列代码的输出内容
#include “stdio.h”
  main()
  {
   int a,b,c,d;
   a=10;
   b=a++;
   c=++a;
   d=10a++;
   printf("b,c,d:%d,%d,%d",b,c,d);
   return 0;
  } 
输出结果为:b, c, d: 10, 12, 130
 







#16


呵呵,这些问题都是实际问题啊,看有没有经验了。
借贴招嵌入式软件开发工程师,上海,联系我qq165捌067九65

#17


支持一下,回答的挺完整的

#18


...........15L !! 

#1


哪个外企出这么多题目考啊?

#2


》。。。继续等待!

#3


1.解释命令ls -amore具体含义.
 还是ls -a|more

#4


1.解释命令ls -a | more具体含义.(题目我改了下,不然我实在无法理解)

   ls -a会从它的标准输出(STDOUT_FILENO)输出当前目录下的所有文件名,然而它的标准输出重定向到了一个管道的写端,more程序的标准输入(STDIN_FILENO)重定向到了这个管道的读端,这样ls -a程序的所有输出(当然是正确的输出,如果是错误输出,则继续输出到STDERR_FILENO上面)都成了more程序的标准输入

2.LINUX中的管道指什么重定向又指什么
  管道是进程间通信的一种方式(当然也可以是同一进程),具体定义可以上网查查。
  重定向,怎么说呢?这个我也不知道怎么去描述,题目1中就用到了管道和重定向,它可能会用到系统调用  dup or dup2


3.GCC -g -o test.elf test.c的具体含义.
   把test.c编译成test.elf,并加上调试信息


4.浅述GCC编译器在编译时都有哪几个过程
   预编译->编译成目标文件(词法分析,语法分析,语义分析等等)->连接目标文件


5,在题3的基础上编写一MAKEFILE文件,要求能自动完成编译和清除功能

   这个我就不写了

6.说明uclinux 和linux的区别
 
   uclinux我也没接触过,这个好像是不带mmu,但是我有疑问的地方就是不带mmu能实现多任务吗??

7解释下面一组GDB命令的含义.



break 94
   设置断点在有入口n函数文件的第94行


run
  开始跑起来


info line 121

  

8.什么是链接脚本其作用是什么请编写一个简单的链接脚本

 

9.编写一个SHELL脚本程序,将当前目录及其子目录中所有后缀为.O类型文件的文件名输出到用户指定的文件中.

  find ./ -name *.o > 用户指定的文件

10.请写出5个LINUX基本系统调用的函数名称.
    open,read,write,ioctl,mmap


11.描述LINUX中字符设备驱动的基本编成框架.
  VFS,cdev,struct file_operation


12.编写一个hello world程序,要求以创建进程的方式打印hello world.
   


13.浅谈bootloader,kelnel,filesystem三者之间的关系.
    bootloader会将kernel加载到内存(也有可能不会,如kernel在nor flash上面),然后跳转到kernel的入口点把控制权转给kernel。filesystem是kernel的一部分,其代码实在kernel中实现的(Linux中是这样的)









3. Linux系统下.ko文件是什么文件?.so文件是什么文件?
   其实Linux下面文件名根本不代表什么。但是从常识上讲,.ko代码是驱动编译成的格式,就像是目标文件(当然不是),里面还有很多符号尚未解决(引用kernel导出的符号)
   .so文件一般是动态库文件
4. 二维数组AA [ 3 ][ 7 ]的另外一种表示方法:
    
5. 请写出下列代码的输出内容
#include “stdio.h”
  main()
  {
   int a,b,c,d;
   a=10;
   b=a++;
   c=++a;
   d=10a++;
   printf(b,c,d:%d,%d,%d,b,c,d);
   return 0;
  }   
二、 编程题:
1. 写出两个排序算法,并说明哪个好?
2. 打开一个文件,并读取从第100字节开始的50字节数据。
3. 编写一个函数,输入一个的整型数字,可以选择按照81016进制输出字符串。
4. 如果有一个简单的helloworld项目目录如下:
# tree helloworld
helloworld
– file2.h
– file1.cpp
– file2.cpp
请编写一个Makefile文件。
三、 简答题:
ARM-linux启动分几部分,简述流程:

#5


好多。。

#6


在百度上查询,大多数可以解决,LZ有点懒哦

#7


引用 3 楼 keywie007 的回复:
1.解释命令ls -amore具体含义.
 还是ls -a|more


对喔。

#8


该回复于2011-04-07 08:37:14被版主删除

#9


该回复于2011-04-07 13:33:56被版主删除

#10


最后一题自己的理解 不一定对。分4部分,内部rom的boot启动,uboot启动,kernel启动,rootfs启动。

#11


这些都很基本,基本上工作中都会遇到。

#12


看似乎都是平时遇到的遇到的问题,要答好还挺难的

#13


该回复于2011-04-18 09:01:05被版主删除

#14


该回复于2011-04-18 14:55:23被版主删除

#15


对于这些问题我大体整理了一下,算是复习一下吧,希望对大家有帮助
1.解释命令ls -a | more具体含义.
   ls -a 是将当前目录下的文件名输出到终端,而加入后面的| more 是将输出结果分页显示
   
2.LINUX中的管道指什么重定向又指什么
管道命令操作符是:”|”,它仅能处理经由前面一个指令传出的正确输出信息,也就是 standard output 的信息,对于 stdandard 
error 信息没有直接处理能力。然后,传递给下一个命令,作为标准的输入
Linux重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过Linux重定向来进行这项工作。

区别是:
1)、左边的命令应该有标准输出 | 右边的命令应该接受标准输入
   左边的命令应该有标准输出 > 右边只能是文件
   左边的命令应该需要标准输入 < 右边只能是文件 
2)、管道触发两个子进程执行"|"两边的程序;而重定向是在一个进程内执行
3.GCC -g -o test.elf test.c的具体含义
  将test.c 文件编译输出为test.elf 带上调试信息,可以用GDB调试用
4.浅述GCC编译器在编译时都有哪几个过程
要经历四个相互关联的步骤:预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。

预处理(Preprocessing):命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。

编译(Compilation):接着调用cc进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。

汇编(Assembly):汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.s为后缀的汇编语言源代码文件和汇编.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。

连接(Linking):当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。



6.说明uclinux 和linux的区别
uclinux不具有的功能:
1).   没有虚存管理 
2).   不能运行时增加进程栈 
3).   不支持分页 
4).   可执行程序不是elf,   而是flat 
5).   不能用fork,   而是用vfork 
6).   RAMDISK
7解释下面一组GDB命令的含义.
break 94 设置断定,让程序在执行到第94行之前停止
run  运行准备调试的程序
info line 121 查看第121行设置的断点的信息
8.什么是链接脚本其作用是什么请编写一个简单的链接脚本
链接脚本主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局. 
实例:
以下脚本将输出文件的text section定位在0×10000, data section定位在0×8000000:
SECTIONS
{
. = 0×10000;
.text : { *(.text) }
. = 0×8000000;
.data : { *(.data) }
.bss : { *(.bss) }
}
解释一下上述的例子:
. = 0×10000 : 把定位器符号置为0×10000 (若不指定, 则该符号的初始值为0).

.text : { *(.text) } : 将所有(*符号代表任意输入文件)输入文件的.text section合并成一个.text section, 该section的地址由定位器符号的值指定, 即0×10000.

. = 0×8000000 :把定位器符号置为0×8000000
.data : { *(.data) } : 将所有输入文件的.data section合并成一个.data section, 该section的地址被置为0×8000000.

.bss : { *(.bss) } : 将所有输入文件的.bss section合并成一个.bss section,该section的地址被置为0×8000000+.data section的大小.

连接器每读完一个section描述后, 将定位器符号的值*增加*该section的大小. 注意: 此处没有考虑对齐约束.
9.编写一个SHELL脚本程序,将当前目录及其子目录中所有后缀为.O类型文件的文件名输出到用户指定的文件中.
ls -a | *.o >result.txt
10.请写出5个LINUX基本系统调用的函数名称.
包括与设备文件的交互和与普通文件的交互的系统调用(open, close, ioctl, create, unlink, . . . );与进程相关的系统调用又包括进程控制系统调用(fork, exit, getpid, . . . ),
11.描述LINUX中字符设备驱动的基本编写框架.
根据struct file_operations 的数据结构,填充里面的如:open,write,close,ioctl等函数
并进行模块的初始化和退出
12.编写一个hello world程序,要求以创建进程的方式打印hello world.
编写hello.c文件如下
 #include ""stdio.h "

 int main()
 {
 fork();
 printf("hello world!\n");
 exit(0);
 }
编译hello.c生成hello可执行文件
在shell中执行#fork hello
便可以看到打印结果
13.浅谈bootloader,kelnel,filesystem三者之间的关系.
嵌入式是linux启动过程如下。  
bootloader->kernel->filesystem->application
先是bootloader,它是linux-kernel移植的基石,Bootloader是在系统启动之后、Kernel运行之前所执行的第一段代码,其任务是为调用Kernel准备必要的软硬件环境。
完成bootlaoder的移植后,就是kernel的移植。主要包括添加特定模块的驱动,针对具体要求对内核进行配置。这里有两点要注意:一是有些参数要与所用的bootloader向对应,如nand的分区参数。二是bootlaoder对特定模块的驱动在进入kernel后便会有kernel接管,并有kernel重新驱动
文件系统主要是建立根文件和一些系统功能的实现,如bash。用busybox很容易搞定。


3. Linux系统下.ko文件是什么文件?.so文件是什么文件?
  Linux下面文件名不代表什么。但是从常识上讲,.ko代码是驱动编译成的格式,  .so文件一般是动态库文件
4. 二维数组AA [ 3 ][ 7 ]的另外一种表示方法:
  我想可以用指针来表示,如果数组元素为int型,则可以用int (*p)[7]来表示,p++后移动向下一行。
5. 请写出下列代码的输出内容
#include “stdio.h”
  main()
  {
   int a,b,c,d;
   a=10;
   b=a++;
   c=++a;
   d=10a++;
   printf("b,c,d:%d,%d,%d",b,c,d);
   return 0;
  } 
输出结果为:b, c, d: 10, 12, 130
 







#16


呵呵,这些问题都是实际问题啊,看有没有经验了。
借贴招嵌入式软件开发工程师,上海,联系我qq165捌067九65

#17


支持一下,回答的挺完整的

#18


...........15L !!