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

这篇博客详细探讨了Linux 64位系统如何兼容32位程序,主要涉及结构体ioctl_trans在粘合64位和32位数据中的作用,32位系统调用在64位系统上的路由方式,以及通过int 0x80和syscall指令的转换。文章还介绍了64位和32位程序执行系统调用的差异,并通过一个简单的测试程序展示了这一过程。
摘要由CSDN通过智能技术生成

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中找具体的系统调用处理函数,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值