Articles of 32位

ioctl命令从32位用户代码在64位系统中错误

我正在将设备驱动程序从32位RHEL 2.6.32升级到64位RHEL 2.6.33.9。 我有一个使用ioctl与该驱动程序交谈的程序。 当驱动程序和程序都是64位或32位时,它可以很好地工作。 但是,当驱动程序是64位,而我的程序是32位时,驱动程序接收到的ioctl命令(在compat_ioctl中)与_IOR和_IOWmacros定义的值不匹配。 在我的驱动程序switch语句中,默认情况下打印出所有有效命令的值,即1-12。 32位ioctl命令远不及那些值。 有人能告诉我什么会导致来自一个32位用户程序的命令在64位驱动程序接收时被搞砸了吗? 这里有一些代码:我必须input它; 该代码是在没有互联网访问的安全系统上,所以请原谅任何错误。 它实际上是确认和运行! // IOCTL commands from the include file – most omitted // … #define PORTIO_GET_IRQ_CNT_CMD 10 #define PORTIO_CLR_IRQ_CNT_CMD 11 #define PORTIO_GET_IRQ_TIME_CMD 12 #define PORTIO_IOCTL 'k' // magic number for ioctl // IOCTL Macros #define PORTIO_GET_IRQ_CNT_IOCTL _IOR(PORTIO_IOCTL, PORTIO_GET_IRQ_CNT_CMD, unsigned long) #define PORTIO_CLR_IRQ_CNT_IOCTL _IOR(PORTIO_IOCTL, PORTIO_CLR_IRQ_CNT_CMD, unsigned […]

在64位CENTOS上安装32位Java:错误java / lang / Object

我有一个CENTOS盒*发布6.5最终*内核Linux 2.6.32-431.el6.x86_64 * GNOME 2.28.2 *处理器Intel Xeon * 64位 安装中包含64位版本的Java,就像Firefox一样。 我想在我的CENTOS盒子上运行我在Windows上testing的32位Java应用程序,但却遇到了一个问题。 我去了java 下载页面,下载了Java的32位RPM版本,jre-7u45-linux-i586.rpm。 我通过打开一个terminal窗口,执行su并inputroot密码来安装软件包,并安装了RPM软件包。 安装顺利进行。 我尝试从terminal窗口(普通用户或苏没有区别)执行“java -version”,并收到某种精灵错误,这导致了一个堆栈溢出问题,说从su'edterminal窗口执行“百胜安装glibc.i686“。 我这样做了,但现在遇到了: 错误信息 [root@sarah-linux Downloads]# /usr/java/jre1.7.0_45/bin/java -version Error occurred during initialization of VM java/lang/NoClassDefFoundError: java/lang/Object path /usr/java/default/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/jmr/bin CLASSPATH和JAVA_HOME not defined 我也尝试设置这两个环境variables /usr/java/jre1.7.0_45/bin 但没有骰子,同样的问题。 思考?

不能用64位gcc在32位build立boost库

我试图在64位Linux机器上以32位格式构buildBoost C ++库。 运行bootstrap.sh后,我运行: ./b2 address-model=32 所有我得到的输出是g ++输出的负载说编译终止。 并没有编译库的结果,都跳过了。 对于我来说,这是非常令人沮丧的,因为我无法find任何其他有同样问题的人。 所有的答案似乎指向使用“address-model = 32”选项,这根本不工作。 如果我指定没有选项,只是运行: ./b2 那么一切都很好,build立成功。 但是,这个build立64位的图书馆呢? 当我的目标是32位系统时,这不是我想要的。 我使用的是Ubuntu 13.10 64位,并试图build立升压1.55.0。 任何帮助表示赞赏。 谢谢!

java的OutOfMemory问题 – 堆转储800 MB比configuration的最大堆小

我有一个在Oracle App Server 10.1.3中部署的Web应用程序,在一个oc4j中,以32位RHEL上的1Gb初始堆和2 Gb最大堆开始,configuration为查看32 Gb的RAM。 最近我遇到了OutOfMemory错误,所以我configuration了应用程序在OutOfMem上创build堆转储。 所以我有4-5个堆转储,每个转储大小不超过1.2Gb(因此比最大堆大小小800Mb)。 另外,平均每小时在机器上免费使用约20Gb的免费内存。 这是否意味着应用程序试图一次性分配800 Mb? 或者如果有两个或更multithreading同时尝试分配内存,那么它们都会失败,即使我们假设每个内存都有内存,但是两者的总和却不一样? 可能有一个与Linux机器的PB,也许它不能给内存到Java? 内存是否可以被分割,也许32位机器能够看到32G内存的configuration有一个pb? (我应该提到,应用程序最近没有变化,但在该机器上一个新的oc4j和一个新的应用程序被部署了,并且吃了1-2g的ram)

在64位linux上编译32位python模块(例如numpy)

在一个pythontesting框架中,我们通过Tkinter与一个用于思博伦testcenter的tcl API进行交互。 这个spirent testcenter API只有32位可用,这意味着我们的tcl解释器需要32位。 我们使用Python中的Tkinter来引导tcl API。 (我最近知道一个Python驱动程序是为testcenter发布的,但这也只是32位)。因为Tkinter被集成在python中,python安装也需要是32位的。 我想在CentOS x86_64工作站上运行这个框架。 我已经设法安装testing中心驱动程序,ActiveTcl和python所有在32位,这个工程。 但是,testing框架也依赖于一些python包(例如numpy),它们也需要被构build在32位以便能够使用它们。 我不知道如何在32位构build这些包。 我已经尝试传递编译器选项-m32到distutils构build命令(即python setup.py构build),但是这是愉快地被忽略。 似乎有一个-p选项来通过平台,但这只适用于Windows。 我也研究过使用一个32位只编译器,但distutils似乎有一个可用编译器的静态列表,只有英特尔编译器(即商业…)是32位只,我相信。 有没有人有一个好主意,如何在64位的Linux架构32位构buildpython模块,或者如何构buildpython本身的64位,使软件包安装很容易,但集成tcl / tk在32位? 干杯。 维姆

为什么我不能在这里使用注册?

如果我使用寄存器而不是内存,为什么不打印字符? 这里是代码: mov eax,97 mov ebp,eax call print_char print_char: pusha mov eax,4 mov ebx,1 mov ecx,ebp mov edx,1 int 80h popa ret

离开指令返回一个seg错误

我有一个例程,执行一个例程的值到ebp寄存器的值预计。我在例程中多次改变。所以,我不能这样做: mov ebp,esp在代码顶部。我试着保存在另一个寄存器中的esp地址,并在leave指令之前,把这样的地址进入ebp但我仍然得到segmentaion故障。 如何解决这个问题? 代码是非常巨大的(在这里发布,但我可以发布如果需要),但是这个想法是这样的: ;a lot of arguments are passed in stack foo: xor ebx,ebx mov ecx,esp loop0: sub edx,1 jz end ;etc mov eax,[esp+ebx] mov ebp,eax call routinex ;etc.. ;… mov ebp,edx call printx add ebx,4 jmp loop0 end: mov ebp,ecx leave ret 我希望这个代码就足以让你明白了。我也喜欢解释。

内联汇编 – cdecl和准备堆栈

我最近一直试图通过使用缓冲区和不同assembly操作符的RAWhex等价物来实现C ++中的dynamic函数。 为了说明一个简单的跳跃: byte * buffer = new buffer[5]; *buffer = '0xE9'; // Hex for jump *(uint*)(buffer + 1) = 'address destination'; 我在assembly方面没有经验,但是我知道足够创造非常简单的function。 现在我正在原始内存中创buildcdecl函数。 问题是,我不知道有多less我想推栈(内存)与sub 。 我们以这个函数为例: int MyTest(int x, int y) { return x + y; } long TheTest(int x, int y) { return MyTest(x, 5); } 08048a20 <_Z6TheTestii>: _Z6TheTestii(): 8048a20: 55 push %ebp […]

什么是C等价物?

我怎样才能把这个程序集翻译成C代码? 部件: foo: dd 1 dd 2 dd 3 dd baa – foo dw 5 dw 6 ; …. baa: db 00 db 00 ;… C struct foo { int a; int b; int c; int d; short e; shot f; }; struct baa { int a; int b; }; 接着: foo f; baa b; […]

编译器C在全局variables的地址,静态和string文字的位置在哪里?

首先我读的地址是在.data和.text保存string文字(加上机器代码,我想)之后,在别的文章有人说,它已经改变,而较长的string文字居住在.text但是.rodata而不是(这是真的我的铿锵声编译器输出)。 但是.data内容不匹配我C程序中的printf地址。 假设这个C程序: static int a; int main() { printf("my address = %p\n", &a); return 0; } 这个C程序的输出: $ ./a.out my address = 0x804a01c 然后.data部分的内容: $ objdump -s -j .data a.out a.out: file format elf32-i386 Contents of section .data: 804a00c 00000000 00000000 这个内容没有0x804a01c 。 地址在哪里?