专栏首页从零开始学 Web 前端嵌入式面试题(一)

嵌入式面试题(一)

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(空指针).

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数组和指针的区别

    Daotin
  • 从零开始学 Web 之 jQuery(一)jQuery的概念,页面加载事件

    JavaScript 开发的过程中,处理浏览器的兼容很复杂而且很耗时,于是一些封装了这些操作的库应运而生。这些库还会把一些常用的代码进行封装。

    Daotin
  • 从零开始学 Web 之 jQuery(八)each,多库共存,包装集,插件

    each 方法用来遍历 jQuery 对象的,它的参数是一个事件处理函数,这个事件处理函数有两个参数,第一个参数是索引,第二个参数时索引对应的 DOM 对象,使...

    Daotin
  • JDK1.8 LinkedList 源码解析

    tanoak
  • LinkedList 源码分析

    LinkedList 源码分析 1. 在阅读源码时做了大量的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限,并且代码阅读起来没有 IDE 方便,...

    lwen
  • 《javascript数据结构和算法》读书笔记(4):BitMap

    有n个整数,范围是[0,100]。试设计一种数据结构。储存这些数据,并提供两种方法。分别是

    一粒小麦
  • 不打开Wifi获取Mac地址

    今天遇到一个问题,要求不打开Wifi的前提下获取Mac地址,所以针对Android上Mac地址的获取做了总结。 MAC地址:每个接入网络的设备都有一个专门的序...

    用户7557625
  • 不知道怎么封装代码?看看这几种设计模式吧!

    我们经常听说:“写代码要有良好的封装,要高内聚,低耦合”。那怎样才算良好的封装,我们为什么要封装呢?其实封装有这样几个好处:

    coder_koala
  • JDK核心JAVA源码解析(7)- 集合相关(1) - LinkedList

    想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且...

    干货满满张哈希
  • RocketMQ学习第一步之源码构建

    最近溪源在学习dubbo的相关API机制实践,如:负载均衡、服务分组、本地存根等等…一方面是dubbo官网文档给出了详细的介绍和demo,另一方面由于自己时间方...

    沁溪源

扫码关注云+社区

领取腾讯云代金券