linux的64位操作系统对32位程序的兼容-全面分析

    技术2022-05-19  39

    1.结构体ioctl_trans: struct ioctl_trans {     unsigned long cmd;     ioctl_trans_handler_t handler;     struct ioctl_trans *next; }; 该结构体提供了一个粘合层,用户可以动态注册一个ioctl_trans以便其提供64位和32位的粘合: extern int register_ioctl32_conversion(unsigned int cmd,                 ioctl_trans_handler_t handler); extern int unregister_ioctl32_conversion(unsigned int cmd); 整个系统的ioctl_trans连接成一个哈希表,放在ioctl32_hash_table变量中。每一个ioctl_trans的handler都是一个回调函数,在其中将64位的数据和32位的数据类型进行统一,统一成64位可以正确识别和处理的,以防在后续的64位代码中出错,比如一个32位的signed int为-1,需要将之转化成64个1而不是32个0加上32个1。 2.一套完整的系统调用: 如果不这样的话,32位程序的系统调用如何被路由到通过ioctl_trans们进行粘合的代码就成了问题,要知道x86-64已经不使用int 0x80作为触发系统调用的机制了,而使用syscall指令来触发。那么原来的32位程序都是用int 0x80来触发的,这下怎么办?办法就是仍然保留0x80号中断号,将其处理程序设置成ia32_syscall,它在ia32_sys_call_table中找具体的系统调用处理函数,具体在arch/x86_64/ia32/ia32entry.S中: ENTRY(ia32_syscall)         CFI_STARTPROC         swapgs         sti         movl

    转载请注明原文地址: https://ibbs.8miu.com/read-2215764.html

    最新回复(0)