1. 为什么一块芯片上需要那么多VDD或者VSS?
2. 我们的内核无法使用共享中断(IRQF_SHARED)?(使用cat proc/interrupts可以看见已经注册的中断)
(我的模块中需要申请某中断,而内核驱动中加载时就申请了该驱动,由于不能中断共享,不得已将内核中申请中断的语句屏蔽。)
3. 无法rmmod?
可以选上强制模块删除的选项。
4. 试图用dma_free_coherent释放非连续空间时出现
WARNING: at mm/vmalloc.c:1367
Trying to vfree() nonexistent vm area (32027000)
?
5.1 何为引用?
引用能起到指针的部分作用,但是比指针安全.
一个引用可以看作是某个变量的一个"别名"。对引用进行操作就像对原变量进行操作一样。
主要用于函数的参数传递时使用。因为C语言没有类似VB的“传引用调用”这个功能,所以C++的引用填补了这个空白。从此即使需要改动参数,也直接传递一个变量过去即可。这在操作符重载中有更重要的意义。等你学到以后才会明白。
int a; //声明变量a
int& ra = a; //声明一个引用,名字是ra,ra引用了a
注意,ra声明的时候必须同时给出它到底引用了谁
int& ra; //只声明不指明是不对的。
还有,引用一旦声明,就不能再修改到其他变量上了,这与指针不同。
ra = b; //这是不行的,因为已经int &ra = a了
5.2 引用和指针的异同?
★ 相同点:
1. 都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名。
★ 区别:
1. 指针是一个实体,而引用仅是个别名;
2. 引用使用时无需解引用(*),指针需要解引用;
3. 引用只能在定义时被初始化一次,之后不可变;指针可变;
引用“从一而终” ^_^
4. 引用没有 const,指针有 const,const 的指针不可变;
5. 引用不能为空,指针可以为空;
6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
typeid(T) == typeid(T&) 恒为真,sizeof(T) == sizeof(T&) 恒为真,
但是当引用作为成员时,其占用空间与指针相同(没找到标准的规定)。
7. 指针和引用的自增(++)运算意义不一样;
★ 联系
1. 引用在语言内部用指针实现(如何实现?)。
2. 对一般应用而言,把引用理解为指针,不会犯严重语义错误。引用是操作受限了的指针(仅容许取内容操作)。
6 如何判断栈的增长方向?
对于一个用惯了i386系列机器的人来说,这似乎是一个无聊的问题,因为栈就是从高地址向低地址增长。不过,显然这不是这个问题的目的,既然把这个问题拿出来,问的就不只是i386系列的机器,跨硬件平台是这个问题的首先要考虑到的因素。对于arm体系结构中的栈在存储器空间中就可能是向上生长或向下生长的。(STMFD,STMFA可见,D表示Descdening,A表示Ascending)
在一个物质极大丰富的年代,除非无路可退,否则我们坚决不会使用汇编去解决问题,而对于这种有系统编程味道的问题,C是一个不错的选择。那接下来的问题就是如何用C去解决这个问题。
C在哪里会用到栈呢?稍微了解一点C的人都会立刻给出答案,没错,函数。我们知道,局部变量都存在于栈之中。似乎这个问题立刻就得到了解答,用一个函数声明两个局部变量,然后比较两个变量的地址,这样就可以得到答案。
等一下,怎么比较两个变量的地址呢?
先声明的先入栈,所以,它的第一个变量的地址如果是高的,那就是从上向下增长。“先声明的先入栈”?这个结论从何而来?一般编译器都会这么处理。要是不一般呢?这种看似正确的方法实际上是依赖于编译器的,所以,可移植性受到了挑战。
那就函数加个参数,比较参数和局部变量的位置,参数肯定先入栈。那为什么不能局部变量先入栈?第一反应是怎么可能,但仔细想来又没有什么不可以。所以,这种方法也依赖于编译器的实现。
那到底什么才不依赖于编译器呢?
不妨回想一下,函数如何调用。执行一个函数时,这个函数的相关信息都会出现栈之中,比如参数、返回地址和局部变量。当它调用另一个函数时,在它栈信息保持不变的情况下,会把它调用那个函数的信息放到栈中。
似乎发现了什么,没错,两个函数的相关信息位置是固定的,肯定是先调用的函数其信息先入栈,后调用的函数其信息后入栈。那接下来,问题的答案就浮出了水面。
比如,设计两个函数,一个作为调用方,另一个作为被调用方。被调用方以一个地址(也就是指针)作为自己的入口参数,调用方传入的地址是自己的一个局部变量的地址,然后,被调用方比较这个地址和自己的一个局部变量地址,由此确定栈的增长方向。
给出了一个解决方案之后,我们再回过头来看看为什么之前的做法问题出在哪。为什么一个函数解决不了这个问题。前面这个大概解释了函数调用的过程,我们提到,函数的相关信息会一起送入栈,这些信息就包括了参数、返回地址和局部变量等等,在计算机的术语里,有个说法叫栈帧,指的就是这些与一次函数调用相关的东西,而在一个栈帧内的这些东西其相对顺序是由编译器决定的.
7. 一小菜问强哥 汇编代码和C代码;强哥答 一个串口模块,完全用汇编实现,基本不可能O(∩_∩)O
8. linux内核中调试驱动时较常见的出错信息:
Unable to handle kernel NULL pointer dereference at virtual address XXXXXXXX
阅读(1917) | 评论(1) | 转发(0) |