linux面试题解答_NOTE

C语言部分:

1、C语言中sizeof和strlen的区别

答:sizeof:计算所占内存空间的大小,不受存储内容的影响。strlen:计算字符串的长度,以”\0“结束不计入字符串长度。sizeof是运算符,在编译时计算,参数是数组、指针、类型、对象、函数等;strlen是函数,在调用时计算,参数只能是字符型指针。

2、C语言中的malloc和free与c++中的new及delete有什么区别

答:linux面试题解答_NOTE_第1张图片

3、static有何作用?

答:摘抄
C语言中:
定义全局静态变量 :在全局变量前面加上关键字static
定义局部静态变量:在局部静态变量前面加上关键字static
定义静态函数:在函数的返回类型加上static关键字 分别从作用时间 作用领域分析
c++中添加新的:

.定义静态数据成员
(1)       内存分配:在程序的全局数据区分配
(2)       初始化和定义:静态数据成员定义时要分配空间,所以不能在类声明中初始化。
 二.静态成员函数。静态成员函数与类相联系,不与类的对象相联系。静态成员函数不能访问非静态数据成员。原因很简单,非静态数据成员属于特定的类实例,静态成员函数主要用于对静态数据成员的操作。
(1)       静态成员函数没有this指针。

4、volatile关键字有什么用途?一般用在那种场合?

答:volatile的本意是“易变的” 由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化,但有可能会读脏数据。当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。
精确地说就是,优化器在用到这个变量时必须每次都小心地重新从内存里读取这个变量的值,而不是使用保存在寄存器里的备份。
一般说来,volatile用在如下的几个地方:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;

5、C语言函数传参有哪些方法?各有何特色?(引用)

提到函数传参,必然就会面对“传值”和“传址”问题,C++中还会涉及到“传引用”。

C语言中所有传递给函数的参数都是传值方式进行的,也就是说“传值”和“传址”本质上是相同的,执行函数调用时都是将主调函数实参的副本压栈,因此被调用函数中对形参的操作实际上只作用于这个实参副本之上,不影响实参。(“传址”也就是形参为指针时,由于形参和实参都是地址,它们指向同一内存区域,因此通过指针解引用可以影响到实参)

C++中的“传引用”方式,是真正的“以地址的方式传递参数”。函数调用时,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,压栈的是引用的副本, 这里的引用实际上也是指向实参的指针。在被调函数内部访问形参变量时,大多数情况下与“传址”一样,采用间接寻址方式;但编译器在实现的时候可以对“传引用”进行优化,使其采用直接寻址方式。所以可以得到下面的结论:
引用传递和指针传递的效率上比,引用传递的效率始终不低于指针传递。

6、局部变量能否和全局变量重名?

在程序中如果出现了相同的两个变量,一个是局部变量,一个是全局变量,编译可以通过,但是打印出的值是局部变量的值,如果想打印全局变量的值的话,在全局变量之前加上“::”就可以了。(c++环境下) 一般是用所谓就近原则

7、静态全局变量和普通全局变量有何区别?

(a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。
(b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享,即:全局静态变量对组成该程序的其它源文件是无效的。
©具有外部链接的静态;可以在所有源文件里调用;除了本文件,其他文件可以通过extern的方式引用;

8、解释一下语句的含义:

**const int a;
int const a;
const int *a;
int cons ta;
int const a const;
就近原则 const离谁近就修饰哪一个
在这里插入图片描述

9、在计算机系统中,越外层的存储,容量越大价格越低,请列举从cpu内部到离线存储,各个存储层次的设备名称

linux面试题解答_NOTE_第2张图片
各内存总结

10、有哪些寻址方式,各种寻址方式的主要目的,寻址取操作数最慢的是?

计算机系统中有七种基本的寻址方式:立即寻址方式、寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址加变址寻址方式和相对基址加变址寻址方式。

立即寻址方式 操作数作为指令的一部分。
寄存器寻址方式 操作数存放在寄存器中,通过指定寄存器来获取数据。
直接寻址方式 指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址。
寄存器间接寻址方式 操作数有效地址在 si 、 di 、 bx 、 bp 这四个寄存器之一中。在不使用段超越前缀的情况下,如果有效地址在 si 、 di 、 bx 中,则以段寄存器 ds 中的内容为段值。如果有效地址在 bp 中,则以段寄存器 ss 中的内容为段值。
寄存器相对寻址方式 操作数的有效地址是一个基址寄存器( bx 、 bp )或变址寄存器( si 、 di )的值加上指令中给定的8位或16位偏移量之和。在不使用段超越前缀的情况下,如果有效地址在 si 、 di 、 bx 中,则以段寄存器 ds 中的内容为段值。如果有效地址在 bp 中,则以段寄存器 ss 中的内容为段值。
基址加变址寻址方式 操作数的有效地址由基址寄存器( bx 、 bp )之一的值与变址寄存器( si 、 di )之一的值相加得到。在不使用段超越前缀的情况下,如果 bp 中的值作为有效地址的一部分,则以 ss 中的值为段值,否则以 ds 中的值为段值。
相对基址加变址寻址方式 基本同上,只是增加了偏移量

越复杂越难搞

11、如何判断处理器的位数?如何判断大小端?高低字节如何放置

CPU是16位,32位,还是64位,主要指的是数据总线(data bus)有多少位,16位数据总线表示CPU一次可以从内存取2个byte的数据,32位数据总线表示CPU一次可以从内存取4byte数据,而64位数据总线表示CPU一次可以从内存取8byte的数据
大端字节序:高字节存放在低地址,低字节存放在高低址
小端字节序:低字节存放在高低址,高字节存放在低地址

linux面试题解答_NOTE_第3张图片

12、CPU数据为什么要字节对齐有什好处

需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取从0x00000004-0x00000005的一个short然后组合得到所要的数据,如果变量在0x00000003地址上的话则要访问三次内存,第一次为char,第二次为short,第三次为char,然后组合得到整型数据。而如果变量在自然对齐位置上,则只要一次就可以取出数据。一些系统对对齐要求非常严格,比如sparc系统,如果取未对齐的数据会发生错误,

13、保护现场由什么完成?

保护现场就是:当出现中断时,把CPU现在的状态,也就是中断的入口地址保存在寄存器中,随后转向执行其他任务,当任务完成,从寄存器中取出地址继续执行。保护现场其实就是保存中断前一时刻的状态不被破坏。

14、队列和栈有什么区别?

linux面试题解答_NOTE_第4张图片

15、指针与引用的区别

linux面试题解答_NOTE_第5张图片

Linux部分:

1、Linux中的文件包括哪些?

普通文件类型
Linux中最多的一种文件类型, 包括 纯文本文件(ASCII);二进制文件(binary);数据格式的文件(data);各种压缩文件.第一个属性为 [-]
目录文件
就是目录, 能用 # cd 命令进入的。第一个属性为 [d],例如 [drwxrwxrwx]
块设备文件
块设备文件 : 就是存储数据以供系统存取的接口设备,简单而言就是硬盘。例如一号硬盘的代码是 /dev/hda1等文件。第一个属性为 [b]
字符设备
字符设备文件:即串行端口的接口设备,例如键盘、鼠标等等。第一个属性为 [c]
套接字文件
这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。第一个属性为 [s],最常在 /var/run目录中看到这种文件类型
管道文件
FIFO也是一种特殊的文件类型,它主要的目的是,解决多个程序同时存取一个文件所造成的错误。FIFO是first-in-first-out(先进先出)的缩写。第一个属性为 [p]
链接文件
类似Windows下面的快捷方式。第一个属性为 [l],例如 [lrwxrwxrwx]

2、IPv6的IP长度是几位?

IPv6 位址大小是 128 位元。偏好的 IPv6 位址表示法为 x❌x❌x❌x:x,其中每一个 x 都是十六进位值,共 8 个 16 位元位址片段。IPv6 位址范围从 0000:0000:0000:0000:0000:0000:0000:0000 到 ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff

3、E类网IP的起始地址?

linux面试题解答_NOTE_第6张图片
linux面试题解答_NOTE_第7张图片

4、已知IP获取mac地址问题,协议?

linux面试题解答_NOTE_第8张图片

5、用户进程间通信主要哪几种方式?

# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
# 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
# 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

6、Linux中的用户模式和内核模式是什么含意?

在内核模式下用户可以访问所有的内存和硬件资源。
在用户模式下访问受到限制,例如用户访问了禁区,则用户进程将被杀死。用户模式必须通过系统调用或库函数切换至内核模式后,才允许访问硬件资源。

7、Linux的内核空间和用户空间是如何划分的(以32位系统为例)?

Linux将4G的地址划分为用户空间和内核空间两部分。在Linux内核的低版本中(2.0.X),通常0-3G为用户空间,3G-4G为内核空间。

8、用户程序使用malloc()申请到的内存空间在什么范围?

0~0xBFFFFFFF

9、Linux虚拟文件系统的关键数据结构有哪些?(至少写出四个)

  • 超级块结构(struct super_block {…} )
    该结构保存了一个被安装在linux系统上的文件系统的信息。对于基于磁盘的文件系统,该结构一般和保存在磁盘上的"文件系统控制块"对应。也就是说如果是磁盘文件系统,该结构保存的磁盘文件系统的控制信息。
  • inode结构( struct inode {…} )
    该结构中存储的是一个特定文件的一般信息,对于一个基于磁盘的文件系统,该结构对应磁盘上的"文件数据控制块"。每一个inode结构都对应一个inode节点号,这个节点号是唯一的,它也唯一标识一个文件系统中的文件。
  • file结构( struct file {…} )
    该结构中存储的是一个打开的文件和打开这个文件的进程间的交互信息。该结构保存在kernel的内存区,在打开文件时被创建,关闭文件时被释放。
  • dentry结构( struct dentry {…} )
    该结构存储的是目录实体和对应的文件的关联信息。
    粘贴一个链接吧 vfs主要数据结构以及相关关系

10、内核中对文件或设备的操作函数保存在那个数据结构中?

file_operations

11、创建进程的系统调用有那些?

创建进程的调用:
启动新进程:int system(const char *string) 【include
替换进程映像:int execl();int execlv();int execlp()
int execv();execvp();int execve() 【include
复制进程 fork

12、如何加载、卸载一个模块?

insmod 加载模块,需要指定完整的路径和模块名字 模块依赖及路径信息,这样子才可以成功加载需要模块。查看模块依赖关系可用modinfo查看
rmmod 卸载模块,但是内核会认为卸载模块不安全,可以添加命令强制卸载。

13、模块和应用程序分别运行在什么空间?

模块通过insmod安装到内核,在内核执行 应用程序当然就在用户空间了

14、模块程序能否使用可链接的库函数?

不能,模块是内核中操作运行

15、浮点运算属于内机级还是用户级

内机

16、Linux中有哪几种设备?

linux面试题解答_NOTE_第9张图片

17、如何唯一标识一个设备?

主次设备号

18、Linux通过什么方式实现系统调用?

linux面试题解答_NOTE_第10张图片

19、用shell脚本写程序,判断该文件是否为字符设备文件,如果是的话,就拷贝到/dev目录下。

#! /bin/bash
echo  -e "please input filename /n"
read FILENAME
if[ -c $FILENAME ]
then
    cp $FILENAME /dev
else
    echo "It's not Charactor device file"
fi

20、接触过的bootloader有几种。

UBOOT

21、接触过的架构有几种,例如;x86

精简指令级与复杂指令集

arm 与 x86
ARM与X86架构对比区别

22、uboot引导内核时,传的参数是什么

还没学 看看链接吧

23、uboot的启动过程。

之前的文章

你可能感兴趣的:(嵌入式驱动学习)