我正在为没有内存保护的嵌入式系统编写系统级代码(在ARM Cortex-M1上,使用gcc 4.3编译)并且需要直接读/写到内存映射寄存器.到目前为止,我的代码看起来像这样:
#define UART0 0x4000C000
#define UART0CTL (UART0 + 0x30)
volatile unsigned int *p;
p = UART0CTL;
*p &= ~1;
Run Code Online (Sandbox Code Playgroud)
有没有使用指针的更短路(代码更短,我的意思是)?我正在寻找一种方法来编写实际的赋值代码(如果我不得不使用更多的#defines,那就没关系):
*(UART0CTL) &= ~1;
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试过的任何东西最终都是因为gcc抱怨它无法为左值分配东西......
我花了最后几天阅读手册页,文档和谷歌提出的任何其他内容,但我想我现在比起初时更加困惑.
这就是我想要做的事情:我希望通过带有C/C++的Linux系统上的无线接口(802.11)使用我自己的3-x协议发送和接收数据包.到现在为止还挺好.我不需要信标,关联或任何AP/SSID相关的东西.然而,对于数据传输,我希望MAC层"像往常一样",这意味着单播数据包是ACK,重传,退避等.我还想享受扩展的QoS功能(802.11e有4个队列和不同的访问类别).另一方面,混杂模式不是一个问题,我只需要广播数据包和发送到特定站的数据包.
什么是正确的方法呢?关于原始套接字访问的大多数文档似乎都集中在网络嗅探上,但这并没有帮助.我一直在玩监控模式已经有一段时间了,但从我到目前为止所读到的内容来看,收到的数据包在监控模式下没有确认等.如果没有监控模式,会有什么替代方案?使用ad hoc模式和unix原始套接字?或者我是否必须摆弄司机?
我不是在寻找一个完整的解决方案,只是一些好的想法,从哪里开始.我通读了socket(2),socket(7)和packet(7)的手册页,但这对于不同模式下MAC层的行为没有帮助.
提前致谢.
linux network-programming network-protocols raw-sockets systems-programming
好的,伙计们,我认为这是提出问题的正确位置,因为这都是关于开发的(如果我错了或者是重复的问题,请告诉我).
所以,我想深入了解Android,了解系统如何运行到内核(并了解root和其他黑客行为背后的原因).我应该从哪里出发?Linux书?VM架构?
只是下载源代码没有帮助,因为我不明白这一切是如何工作的.
我有一些关于僵尸进程的问题
提前致谢
我有一个包含我想要运行的命令行的文件.该文件包含大约2,000行.
我有8个核心可用.是否可以解析文件并启动8个进程,然后在其中一个程序完成时从文件中执行另一个进程?我希望这一直持续到文件结束.
我有第三方控制台应用程序.我需要从我的应用程序运行它,但我不能将它作为一个单独的进程运行(因为我需要使用它的依赖项:手动填充导入表,设置挂钩等).所以我可能应该main手动调用此可执行文件的功能.这是我试图这样做的方式:
auto hMod = LoadLibrary("console_app.exe")我坚持到最后一步.
以下是我试图调用入口点的方法:
void runMain(HINSTANCE hInst)
{
typedef BOOL(WINAPI *PfnMain)(int, char*[]);
auto imageNtHeaders = ImageNtHeader(hInst);
auto pfnMain = (PfnMain)(DWORD_PTR)(imageNtHeaders->OptionalHeader.AddressOfEntryPoint + (DWORD_PTR)hInst);
char* args[] = { R"(<console_app_path>)", R"(arg1)", R"(arg2)" };
pfnMain(3, args);
}
Run Code Online (Sandbox Code Playgroud)
有用.但它就好像没有争论一样.
我哪里错了?如何在我的进程中使用参数运行可执行文件?谢谢.
我已经调查过我的特定第三方exe如何获取cmd参数并发现:
GetCommandLine,也不调用它call _initterm电话argc和argv参数进行调查(见下图)
cs:argccs:argv
您能解释一下,_initterm实际存在的CMD参数究竟存在了什么?
c++ program-entry-point systems-programming portable-executable entry-point
现在我在理解fork()系统调用的工作方面遇到了问题.我写了一个代码如下:
#include<stdio.h>
int main()
{
int a, b;
b=fork();
printf("\n the value of b = %d",b);
}
Run Code Online (Sandbox Code Playgroud)
此代码的输出如下:
现在我不明白为什么输出是这样的?
之后,我只是在我的代码中添加一行,输出完全不同.我的代码如下:
int main()
{
int a, b;
b=fork();
Run Code Online (Sandbox Code Playgroud)
当我运行代码输出跟随2389我的名字是manish
the value of b = 0
Run Code Online (Sandbox Code Playgroud)
现在我对fork()通话的工作感到很困惑.
我的问题如下:
fork()?fork()通话结束后的位置?b在不同位置发生的输出意味着在第一个代码中输出b = 2260就在输出之前,b = 0而值b = 2389不在...之前b = 0?请解释我在问题中编写的代码中的fork的工作,以便我可以正确地学习它.
posix标准指定当写入少于PIPE_BUF字节到管道或FIFO被授予原子时,也就是说,我们的写入不会与其他进程混合.但是我没有找到关于常规文件的标准规范.我的意思是,当我们写的少于PIPE_BUF时,它也会被授予原子性.但我想知道常规文件有这样的限制吗?我的意思是,管道有容量,所以当写入管道并超出其容量时,内核会让编写器进入休眠状态,因此其他进程将有机会写入,但是常规文件似乎没有这样的限制,我是对的?
我正在做的是几个进程生成一个文件的日志.当然,设置O_APPEND.
我用了
readelf --dyn-sym my_elf_binary | grep FUNC | grep UND
Run Code Online (Sandbox Code Playgroud)
my_elf_binary从动态符号表中.dynsym精确显示动态符号表中的动态导入函数.示例输出将是:
[...]
3: 00000000 0 FUNC GLOBAL DEFAULT UND tcsetattr@GLIBC_2.0 (3)
4: 00000000 0 FUNC GLOBAL DEFAULT UND fileno@GLIBC_2.0 (3)
5: 00000000 0 FUNC GLOBAL DEFAULT UND isatty@GLIBC_2.0 (3)
6: 00000000 0 FUNC GLOBAL DEFAULT UND access@GLIBC_2.0 (3)
7: 00000000 0 FUNC GLOBAL DEFAULT UND open64@GLIBC_2.2 (4)
[...]
Run Code Online (Sandbox Code Playgroud)
假设与这些符号相关联的名称(例如tcsetattr或access)始终是唯一的,是否安全?或者是否有可能或合理的*),有一个动态符号表(过滤为FUNC和UND),其中包含两个具有相同关联字符串的条目?
我问的原因是我正在寻找动态导入函数的唯一标识符...
*)动态链接器不会将UND FUNC具有相同名称的所有" 符号" 解析为相同的函数吗?
我想在不使用任何POSIX库的情况下在C中实现多线程.任何帮助,将不胜感激.
不:不要使用fork()或vfork().
c ×5
linux ×3
c++ ×2
posix ×2
unix ×2
android ×1
architecture ×1
bash ×1
elf ×1
entry-point ×1
fork ×1
gcc ×1
process ×1
raw-sockets ×1
system ×1