我正在使用与UEFI驱动程序相关的代码,我遇到了这个:
/* EFI headers define EFI_HANDLE as a void pointer, which renders type
* checking somewhat useless. Work around this bizarre sabotage
* attempt by redefining EFI_HANDLE as a pointer to an anonymous
* structure.
*/
#define EFI_HANDLE STUPID_EFI_HANDLE
#include <ipxe/efi/Uefi/UefiBaseType.h>
#undef EFI_HANDLE
typedef struct {} *EFI_HANDLE;
Run Code Online (Sandbox Code Playgroud)
完整的源代码在此路径 http://dox.ipxe.org/include_2ipxe_2efi_2efi_8h_source.html
这是我第一次遇到匿名结构,我无法弄清楚重新定义void *指向匿名结构的指针的逻辑."古怪的破坏尝试"暗示什么样的黑客攻击?
我最近遇到了链接寄存器和叶函数的概念.
我从之前的SO读取中了解到,LR告诉代码在执行过程中的位置.我还知道叶子函数是一个函数,它位于函数调用层次结构的末尾.
链接寄存器支持快速叶函数调用.
为什么这个说法属实? 我查看了ARMARM(架构参考手册),链接寄存器的信息很少.
在阅读线程共享的所有内容的答案时,我偶然发现了"调用堆栈"这个术语.虽然我知道线程有自己的堆栈而不与其他线程共享,但我不明白什么是调用堆栈就线程而言意味着什么.我看到了一些答案,但不是很清楚.请详细说明调用堆栈的含义以及它在多任务处理中与堆栈的区别.问候
在今天的讨论中,我发现VxWorks和LynxOS中有检查,它告诉您为指针分配的地址来自有效范围.这是我第一次听到这个代码,就像我指定的那样int *i=&variable;.
我应该收到一个警告或错误,说明在我的应用程序中我无法将地址值分配给整数.
就像我做NULL检查一样,我只检查地址0x00000000.但地址可能就是这种情况0x00000001.如果它是未映射的区域并且可能无法访问,则这也是无效的情况.是否有人知道某些与Linux相似的东西,或者可以指导它在VxWorks或LynxOS中的完成情况.
有任何想法吗??
我一直在阅读C中的编码标准,并且大多数都不鼓励使用动态内存分配.但是在流行的使用中,动态内存分配会导致.这有一个可靠的原因.我问它使用的原因尽管它有它的缺点?这些是我的参考JPL标准:http://lars-lab.jpl.nasa.gov/JPL_Coding_Standard_C.pdf 10的力量:http://spinroot.com/gerard/pdf/P10.pdf
在《 ARM体系结构手册》中,提到了缓存可以是临时的也可以是非临时的,并且它是由实现定义的。我无法理解关于缓存的瞬时内存的概念和使用。我正在尝试编写用于启用MMU的软件,并且已经启用了L1和L2缓存。我正在使用LPAE。我知道MAIR寄存器控制此属性。我没有得到有关它的任何好的文档。
我想知道这个概念,以便检查将其应用于当前设计的可行性。
arm-v7-ar第134页
“对于包含大物理地址扩展名的ARMv7-A实现,将由IMPLEMENTATIONATION定义是否为可缓存的Normal内存区域支持Transient属性。如果实现支持此属性,则Normal内存区域的可能的可缓存性属性集将变为:
•直写式可缓存,非瞬态
•写回式可缓存,非瞬态
•直写式可缓存,瞬态
•回写式可缓存,瞬态
•不可缓存。”
我观察过堆栈粉碎并阅读了有关它的帖子,就像这个Stack smashing检测到的那样.我明白它就像我们试图超越边界一样,而gcc也有预防机制.但在我的情况下,当我更改行索引以跨越边界时,其打印值为0,但是当列索引超出边界时,它会导致堆栈粉碎.
以下是包含必要评论的计划
#include<stdio.h>
void main()
{
int i,j;
i=0;
j=0;
int d[2][2]={{0,0},{0,0}};
for(i=0;i<2;i++) //**when I put i<=2 there is no stack smashing**
{
for(j=0;j<2;j++) //**When I put j<=2 there comes the stack smashing**
{
if(i==j)
{
d[i][j]=1;
}
else
{
d[i][j]=0;
}
printf("%d ",d[i][j]);
}
printf("\n");
}
}
Run Code Online (Sandbox Code Playgroud)
矩阵$ ./a.out输出(i <= 2)和(j <2)
1 0
0 1
0 0
Run Code Online (Sandbox Code Playgroud)
输出(i <= 2)和(j <= 2)矩阵$ ./a.out
1 0 0
0 1 0
0 0 1
Run Code Online (Sandbox Code Playgroud)
*堆栈粉碎检测到*:./a.out终止中止(核心转储)
是否有任何固有的限制可以超过导致基于架构的堆栈粉碎的项目数量.或者这只是随机的?任何解释都会有所帮助,因为我无法想象
我遇到了序列化函数的实现细节,并且提到结构必须被解压缩和存储的目标内存需要是不透明的缓冲区.
维基百科说:
"某些语言,例如C,允许声明不透明的记录(结构),其大小和字段对客户端是隐藏的.客户端可以对这种类型的对象做的唯一事情是获取其内存地址,产生一个不透明的指针."
根据这个指向任何内存地址的指针都是不透明的,因为我们无法控制目标缓冲区将启动的内存地址.那么C中关于缓冲区的这种分类有什么意义呢?我已经看到,在C++中,对象可以是不透明的,这更有意义,因为我们可以创建可以防止更改和数据抽象的对象.
这个问题可能看起来很简单,但这是一个选择.我已经在相同的代码库中看到了这些,并且对这种方法感到有些困惑.
我们做一个空字符串初始化,所以我们不会得到解引用错误(我认为).
static char *name=(char *)"";
Run Code Online (Sandbox Code Playgroud)
和大多数情况我见过这个
static char *name=NULL;
Run Code Online (Sandbox Code Playgroud)
在极少数情况下也见过这个.
static char *name=(char *) 0;
Run Code Online (Sandbox Code Playgroud)
我们可以将这些做法中的任何一种称为标准并且是普遍推荐的吗?如果是的话是什么逻辑?