嵌入式面试题(一)

时间:2022-04-21 11:57:54

1、linux 上应用程序开发(用户空间)不能使用物理地址这个说法对吧?那么怎么见到有些 c 程序里使用二进制的地址值呢? 物理地址,二进制地址给我绕的有点晕,老师能帮我解答一下么?C 语言编程里也可以操纵寄存器,那这样用 C 编写的应用程序里面也有寄存器地址啊,这样来讲应用程序里不是就有物理地址了么?

解答:物理地址和二进制没有关系,二进制只是表示数据的方式而已。c 语言是可以操作地址, 但是在操作系统中有虚拟地址的概念,你在 linux 下编写的程序操作的地址可不是物理地址,是进程的虚拟地址,如果你写裸机程序, c 语言当然可以操作物理地址啦。


2、老师,你好,请问一下平台设备驱动与字符设备驱动是怎么分的?字符设备驱动我可以这样来写驱动模块编写,设备文件创建,编写应用程序来调用,但平台设备驱动的编写是什么样的流程,该从哪里入手?谢谢!

解答:平台设备其实是只挂接在虚拟总线上的设备,区别于USB\IIC\SPI等实体总线,平台设备并不是与字符设备、块设备和网络设备并列的>概念,通常平台总线用于管理 SOC 上的外设, 如 RTC\LCD\WATCHDOG 等。平台设备驱动是基于 linux 的设备、总线、驱动模型,总线就是
platform bus,设备通常用于管理平台驱动要使用的资源,比如一些寄存器、和中断,总线部分不需要管,因为内核帮我们做了,设备部分需要根据资源注册平台设备,驱动部分主要是注册平台设备驱动,需要实现一些主要的操作,比如probe,probe里面主要是提供获取平台资源,并注册真正的设备(字符设备或者其他形式如混杂设备).


3、空指针相关概念

什么是空指针常量(null pointer constant)?

An integer constant expression with the value 0, or such an expression cast to type void , is called a null pointer constant.
这里告诉我们: 0、 0L、 '\0'、 3 - 3、 0
17 (它们都是―integer constantexpression‖)以及 (void)0等都是空指针常量(注意 (char) 0 不叫空指针常量,只是一个空指针值)。至于系统选取哪种形式作为空指针常量使用,则是实现相关的。一般的 C 系统选择 (void)0 或者 0 的居多(也有个别的选择 0L);至于 C++ 系统,由于存在严格的类型转化的要求,void 不能象 C 中那样*转换为其它指针类型,所以通常选 0 作为空指针常量,而不选择 (void*)0。

2. 什么是空指针(null pointer)?

If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.
因此,如果 p 是一个指针变量,则 p = 0;、 p = 0L;、 p = '\0';、 p = 3 - 3;、
p = 0 * 17; 中的任何一种赋值操作之后(对于 C 来说还可以是p=(void*)0;),p都成为一个空指针,由系统保证空指针不指向任何实际的
对象或者函数。反过来说,任何对象或者函数的地址都不可能是空指针。

3. 什么是 NULL?

The macro NULL is defined in “stddef.h” (and other headers) as a null pointer constant.

即 NULL 是一个标准规定的宏定义,用来表示空指针常量。因此,除了上面的各种赋值方式之外,还可以用 p = NULL; 来使 p 成为一个空指针。

4. 空指针(null pointer)指向了内存的什么地方(空指针的内部实现)?

标准并没有对空指针指向内存中的什么地方这一个问题作出规定,也就是说用哪个具体的地址值(0x0 地址还是某一特定地址)表示空指针取决于系统的实现。我们常见的空指针一般指向 0 地址,即空指针的内部用全 0来表示(zero null pointer,零空指针);也有一些系统用一些特殊的地址值或者特殊的方式表示空指针(nonzero null pointer,非零空指针),具
体请参见 C FAQ。幸运的是,在实际编程中不需要了解在我们的系统上空指针到底是一个zero null pointer 还是 nonzero null pointer,我们只需要了解一个指针是否是空指针就可以了——编译器会自动实现其中的转换,为我们屏蔽其中的实现细节。注意:不要把空指针的内部表示等同于整数 0 的对象表示,有时它们是不同的.

5. malloc 函数在分配内存失败时返回 0 还是 NULL?

malloc 函数是标准 C 规定的库函数。在标准中明确规定了在其内存分配失败时返回的是一个 ―null pointer(空指针):
If the space cannot be allocated, a null pointer is returned.
对于空指针值,一般的文档(比如 man)中倾向于用 NULL 表示,而没有直接说成 0。但是我们应该清楚:对于指针类型来说,返回 NULL 和 返回 0 是完全等价的,因为 NULL 和 0 都表示 ―null pointer(空指针).