我试图了解C中的低级内存管理器,特别是Stack.据我所知,当一个函数被调用时,一个返回地址被推入堆栈.然后是局部变量.
所以我写了一个小程序来调查这个.这是我的计划:
#include <stdio.h>
void TestStack();
void DoTestStack() {
char x1 = 1;
char x2 = 2;
char x3 = 3;
char x4 = 4;
char *x = &x4;
printf("TestStack: %08X\n", (&TestStack));
printf("\n");
int i;
x = &x4;
for(i = 0; i < 32; i++)
printf("%02d: %08X : %08X\n", i, *(x + i), *(x - i));
printf("\n");
printf("x1: %02X\n", x1);
printf("x2: %02X\n", x2);
printf("x3: %02X\n", x3);
printf("DONE!!!\n");
}
void TestStack() {
DoTestStack();
}
void main() {
TestStack() ;
}
Run Code Online (Sandbox Code Playgroud)
基本上,它调查位置x4之前和之后的所有内存.这应该很好地覆盖了返回地址的位置. …
我可以使用 Python 编写 8051 吗?
我没有得到任何在 python 环境中编程 8051 的东西。
如果有人知道,请帮助我。
我在Jon Erickson的书" 黑客:剥削的艺术"中找到了这个来源,
userid = getuid(); // get the real user ID
// Writing data
if(write(fd, &userid, 4) == -1) // write user ID before note data
fatal("in main() while writing userid to file");
write(fd, "\n", 1); // terminate line
Run Code Online (Sandbox Code Playgroud)
我试着编译这段代码,发现在我写的文件中,userid(这是我在上面的代码中编写的)是不对的; 他们只是写了一些奇怪的角色(我认为在这里写它并不重要).所以问题是我试图传递int给一个需要的函数char *,因为我想写的文件结果是假的.
所以这是一个错误,对吗?
我想编写一个获得数字X的函数,如果X = 5则返回7,如果X = 7则返回5,否则返回其他内容.有一些简单的方法 - 使用"if"块另一种方式 - 使用地图(5映射到7,7映射到5)第三种方式 - 写出匹配的线性数学方程式但是我正在寻找第4种方式这样做(再次 - 根本不使用"if"块).
感觉我需要使用位操作,但我在这方面不占优势,所以我需要帮助.
有任何想法吗?
谢谢!
为什么所有低级都是用C语言编写的?
我的意思是内核代码,驱动程序,运行时库,编译器,嵌入式系统s/w主要是用C/C++编写的.
为什么不使用Fortran,COBOL,Pascal甚至Java/C#或其他第三代编程语言来生成与机器无关的代码,同时也让您可以自由地进行低级,调整和优化.
我的问题是为什么开发人员和公司最终主要使用C来实现这些目的.
编辑:你们大多数人都在谈论表现.那么,没有其他通用低级语言比C更快的原因是什么?
我知道在 C 中,每次调用 malloc() 或 calloc() 时检查 NULL 指针是一种很好的做法。我必须对数组初始化做同样的事情吗?例如:
int sigcheck[5];
if (sigcheck == NULL) {return;}
Run Code Online (Sandbox Code Playgroud)
2号线有必要吗?如果我没记错的话,数组初始化的工作原理就像在后台调用 calloc() 一样,这个底层功能是否考虑了 NULL 的可能性,或者我们自己做这件事是否有必要/好的做法。
我有几个执行mmap()特定大小(0x8000)的进程。我只想在这些进程之间共享部分内存空间,如下图所示:
0x0 0x2000-0x3000 0x8000
p1: [MEM. PRIVATE] [MEM. SHARING] [MEM. PRIVATE]
p2: [MEM. PRIVATE] [MEM. SHARING] [MEM. PRIVATE]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,分配的内存mmap()必须仅在 0x2000-0x3000 范围之间共享。其他部分是私有的(MEM.PRIVATE)。
调用后是否有系统调用来执行共享mmap()?我事先尝试过shm_open(),但整个范围都是共享的。
有没有办法在java中检查特定对象是否在CPU缓存中?有没有办法测试读/写其中一个字段是否会导致缓存未命中?
我以前编写过java程序,但不是复杂程序,现在我必须在java中做一些学术研究.
如果这是不可能的,有没有一种通用的方法来模拟这种事情?这在低级编程中是否可行,例如C?
所以我开始了一个编程项目,我发现如果我可以在不声明指针的情况下制作指针char*,int*那么它会使一切变得更容易,等等,只需在其他地方指定大小即可.我四处搜寻但找不到任何有用的东西.
现在我的想法是将所有东西都变成一个char*并且只是将它们与位移和/或操作联合起来(如果它不是字符串).如果这对C来说太低了,我用什么语言来做这个,我宁愿不使用汇编,因为它不够平台.
编辑: 所以我忘了提到它应该在运行时分配内存,并且不要浪费太多内存我想根据大小分配内存.例如,我想为char大小的值分配1个字节,为int大小的值分配2个字节,依此类推.大小是在文件中预定义的,但在读取文件之前是不知道的,应该在运行时读取而不是编译时间.
想象一下,我们有一台计算机,除了从网络等待数据外什么都不做,并在收到数据时进行计算.
现在我认为除了定期检查一些指示数据准备就绪然后进行计算的处理器寄存器之外,没有别的方法可以做到这一点.在我的理解下,网卡接收数据,把它放到内存中,并自己写入cpu寄存器,cpu可以做计算.在下一次定期检查后,处理器将计算内容.您能否详细解释实际发生的事情(在硬件和操作系统中).这个问题让我担心多年了!
也很高兴看到有关它的任何材料!