Articles of x86

你如何在Linux中将文件转换为大写的x86汇编程序?

我find了一个名为ProgrammingGroundUp-1-0-booksize.pdf的pdf文件,其中一个项目是制作一个汇编程序,它接收文件并将其转换为大写, .section .data #######CONSTANTS######## #system call numbers .equ SYS_OPEN, 5 .equ SYS_WRITE, 4 .equ SYS_READ, 3 .equ SYS_CLOSE, 6 .equ SYS_EXIT, 1 #options for open (look at #/usr/include/asm/fcntl.h for #various values. You can combine them #by adding them or ORing them) #This is discussed at greater length #in "Counting Like a Computer" .equ O_RDONLY, 0 […]

NASM参数的长度

我正在编写一个简单的程序来显示用户提供的名称。 结果是我应该可以input命令并获得预期的结果。 命令 ./hello John 结果 Hello, John. 然而,当程序转到显示名称时,它不会。 我相信这与计算论证的长度有关。 请大家看看我的代码,告诉我你的想法? ; hello.asm ; ; Assemble: nasm -f elf hello.asm ; Link: ld -o hello hello.o ; Run: ./hello <name> section .data period: db ".", 10 periodLen: equ $-period helloMsg: db "Hello, " helloMsgLen: equ $-helloMsg usageMsg: db "Usage: hello <name>", 10 usageMsgLen: equ $-usageMsg […]

如何实现x86 linux的GPIO中断处理程序?

我正在为x86 linux的设备驱动程序工作。 该器件的引脚连接到PCH上的GPIO以产生中断。 如何请求与该GPIO引脚相关的IRQ并安装中断处理程序?

导致缓冲区溢出,segfault

我试图在下面,非常简单的程序导致缓冲区溢出: #include <stdio.h> #include <stdint.h> void badf(int n, char c, char* buffer) { char mycode[] = { 0xeb, 0x0f, 0xb8, 0x0b, 0x00, 0x00, 0x00, 0x8b, 0x1c, 0x24, 0x8d, 0x0c, 0x24, 0x31, 0xd2, 0xcd, 0x80, 0xe8, 0xec, 0xff, 0xff, 0xff, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x6c, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; […]

为什么Linux在执行上下文切换时保存%ebp?

在进行上下文切换时,x86 Linux(非常巧妙地)避免了保存和恢复EAX,EBX,ECX,EDX,ESI和EDI。 当然,切换到内核模式时,用户等级值保存在内核堆栈中。 但是内核代码中的值不会被保存,而是使用GCC指令来告诉编译器不要在交换机发生的地方保留这些寄存器所需的任何值。 自然,ESP必须被保存和恢复。 但这是我不明白的:在ESP切换之前,EBP被推入内核堆栈。 我认为EBP被用作帧指针,但在我的内核debugging器中,值肯定不是这样的: (gdb) print $esp $22 = (void *) 0xc0025ec0 (gdb) print $ebp $23 = (void *) 0xcf827f3c EBP在这里是一个框架指针的区别太大了。 在代码中的评论说,“EBP是显式保存/恢复wchan访问”,但我正在寻找代码,并不能弄清楚是怎么回事。 谷歌也没有帮助。 一些内核向导可以进来帮忙吗?

为setjmp / longjmp使用volatile的性能开销

要使setjmp / longjmp正常工作,您需要将局部variables声明为volatile。 如果有人用-O3编写代码,挥发性variables对性能的影响是多less。 在x86多核平台上它会很大还是很小? 在我看来,它只会增加一点点的开销,因为这个volatilevariables仍然可以被caching,而且从caching中读取/写入也是非常快的。 意见?

Linux内核模块ABI(x86)

我正在寻找用于在x86上的内核模块中调用ABI的官方定义。 我最近看了一个编译模块,惊讶地发现: 它使用寄存器来传递前三个参数( eax , edx和ecx )。 它不像GCC文档中描述的那样fastcall 。 文档说 fastcall使用ecx和edx(微软风格)。 我能find的唯一有点相关的信息就是这个 ,但是这个信息并不多。 所以: 1)是否有内核模块中使用的ABI官方文档(不是系统调用ABI,而不仅仅是函数列表 – 我find了)。 2)编译器产生这个奇怪的fastcall是怎么回事? 有没有我错过的开关?

我可以发送信号到不同的线程

说我有一个线程A,它想要发送信号给线程B,C和D.我可以做这样的事情。 SendSignalTo( ThreadB, SIGUSR1 ); SendSignalTo( ThreadC, SIGUSR1 ); SendSignalTo( ThreadD, SIGUSR1 ); 使用SIGUSR1信号处理程序,线程B,C和D的定义不同,如下所示。 void SIGUSR1_Handler_for_ThreadB(…){…} void SIGUSR1_Handler_for_ThreadC(…){…} void SIGUSR1_Handler_for_ThreadD(…){…} 如果不是的话,还有什么select。

在Linux系统调用机制中的疑问

我们使用'int'或新的'syscall / sysenter'指令从ring3转换到ring0。 这是否意味着需要为内核修改的页表和其他内容由“int”指令自动完成,或者“int 0x80”的中断处理程序将执行所需的内容并跳转到相应的系统调用。 另外从系统调用返回时,我们再次需要去用户空间。 为此,我们需要知道用户空间中的指令地址以继续用户应用程序。 该地址在哪里存储。 'ret'指令是否自动将ring3从ring3更改为ring0,或者在哪里/如何发生这种换环机制? 然后,我看到,从ring3到ring0的变化并不像从ring0到ring3那样昂贵。 为什么这样? 谢谢,巴拉

未定义的引用sync_fetch_and_add_4

每当我尝试在64位机器上使用带有-m32的__sync_fetch_and_add时,出现以下错误,而使用正常的64位编译正常。 我正在使用gcc编译器4.1.2。 这里有什么问题,解决scheme是什么? replication.cpp:(.text+0xb3b): undefined reference to `__sync_fetch_and_add_4' replication.cpp:(.text+0xb82): undefined reference to `__sync_fetch_and_add_4' replication.cpp:(.text+0xcc2): undefined reference to `__sync_fetch_and_add_4' /tmp/cc7u9FLV.o: In function `potential_barrier_leader(unsigned int, pthread_barrier_t*)': replication.cpp:(.text+0xd3f): undefined reference to `__sync_fetch_and_add_4' replication.cpp:(.text+0xd54): undefined reference to `__sync_fetch_and_add_4' /tmp/cc7u9FLV.o:replication.cpp:(.text+0xdb0): more undefined references to `__sync_fetch_and_add_4' follow collect2: ld returned 1 exit status make: *** [all] Error 1