First, you can find libaio source in http://libaio.sourcearchive.com/

Second,download the libaio_0.3.109.orig.tar.gz version source,unzip it

Than you can find the real source in src directory.

But there is lack of mips architecture support.

So I just write some ugly patch about it.

The key is a .h file.You can name it syscall-mips.h

here is the code :

/****************BEGIN*************************/

#define __SYSCALL_CLOBBERS "$1", "$3", "$10", "$11", "$12", "$13", \
    "$14", "$15", "$24", "$25", "memory"


 
#define io_syscall1(type,fname,sname,type1,arg1)
\
type fname (type1 arg1)
\
{
\
    long _sys_result;                     \
    register long __v0 asm("$2");         \
    register long __a0 asm("$4") = arg1;  \
    register long __a1 asm("$7");         \
    __asm__ __volatile__(             \
        ".set push\n\t"               \
        ".set noreorder\n\t"          \
        "li   %0, %2\n\t"             \
        "syscall\n\t"                 \
        ".set pop\n\t"                \
        :"=r"(__v0),"=r"(__a1)        \
        :"i" (__NR_##sname),"r"(__a0) \
        : __SYSCALL_CLOBBERS          \
    );                                \
    _sys_result = __v0;               \
    _sys_result;                      \
}

 
 
#define io_syscall2(type,fname,sname,type1,arg1,type2,arg2)
\
type fname (type1 arg1,type2 arg2)
\
{
\
    long _sys_result;                     \
    register long __v0 asm("$2");         \
    register long __a0 asm("$4") = arg1;  \
    register long __a1 asm("$5") = arg2;  \
    register long __a2 asm("$7");         \
    __asm__ __volatile__(             \
        ".set push\n\t"               \
        ".set noreorder\n\t"          \
        "li   %0, %2\n\t"             \
        "syscall\n\t"                 \
        ".set pop\n\t"                \
        :"=r"(__v0),"=r"(__a2)        \
        :"i" (__NR_##sname),"r"(__a0),"r"(__a1) \
        : __SYSCALL_CLOBBERS          \
    );                                \
    _sys_result = __v0;               \
    _sys_result;                      \
}


 
#define io_syscall3(type,fname,sname,type1,arg1,type2,arg2,type3,arg3)
\
type fname (type1 arg1,type2 arg2,type3 arg3)
\
{
\
    long _sys_result;                     \
    register long __v0 asm("$2");         \
    register long __a0 asm("$4") = arg1;  \
    register long __a1 asm("$5") = arg2;  \
    register long __a2 asm("$6") = arg3;  \
    register long __a3 asm("$7");         \
    __asm__ __volatile__(             \
        ".set push\n\t"               \
        ".set noreorder\n\t"          \
        "li   %0, %2\n\t"             \
        "syscall\n\t"                 \
        ".set pop\n\t"                \
        :"=r"(__v0),"=r"(__a3)        \
        :"i" (__NR_##sname),"r"(__a0),"r"(__a1),"r"(__a2)  \
        : __SYSCALL_CLOBBERS          \
    );                                \
    _sys_result = __v0;               \
    _sys_result;                      \
}



#define io_syscall5(type,fname,sname,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
  type5,arg5)
\
type fname (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5)
\
{
\
    long _sys_result;                     \
    register long __v0 asm("$2");         \
    register long __a0 asm("$4") = arg1;  \
    register long __a1 asm("$5") = arg2;  \
    register long __a2 asm("$6") = arg3;  \
    register long __a3 asm("$7") = arg4;  \
    register long __a4 asm("$8") = arg5;  \
    register long __a5 asm("$9");         \
    __asm__ __volatile__(             \
        ".set push\n\t"               \
        ".set noreorder\n\t"          \
        "li   %0, %2\n\t"             \
        "syscall\n\t"                 \
        ".set pop\n\t"                \
        :"=r"(__v0),"=r"(__a5)        \
        :"i" (__NR_##sname),"r"(__a0),"r"(__a1),"r"(__a2),"r"(__a3) ,"r"(__a4)   \
        : __SYSCALL_CLOBBERS          \
    );                                \
    _sys_result = __v0;               \
    _sys_result;                      \
}

/****************END*************************/

That is All.They are the most important part. The rest is just relsove compile problem.

Like somewhere is missing the mips definition, somewhere is missing the .h name.

Remeber change the CC in Makefile, use mips-gcc.

Finally,just run make command,you will get a static lib which is named "libaio.a"

I use it to work with fio tools,it's work for me.Hope it's useful to you.

今天想用一下fio在mips架构下,修改fio代码,将mips相关的地方补全,主要是缺少mips定义,还有一些头文件方面的问题。

最后发现链接的时候提示找不到libaio库。搜索了一下,在http://libaio.sourcearchive.com/下载了libaio的代码。

然后解压准备编译一个mips版本,结果悲剧的发现libaio不支持mips架构,简单的分析了一下源码,发现原来就差一个头文件,用来

定义在mips架构下,用户态如何进入内核的翻译,这个是和架构强相关的。

简单开始google和stackoverflow了一把,没有什么有用的发现。分析了一下x86和x86_64架构的头文件,发现还算简单。

于是准备自己写一下,google一下mips的ABI接口,然后又搜索了一下系统调用的实现,然后就完成了上面的头文件的主要内容。

主要就是利用系统调用的接口,是linux内核支持的aio相关的调用,通过寄存器传入多个参数到内核。

剩下的就是解决libaio本身的编译问题,注意一下,这部分代码会有编译告警,分析一下,主要是类型转换方面的,我决定不管了^_^

编译得到了libaio.a。下一步是将libaio.a拷贝到库目录中去。编译通过后,到mips环境下试了一下,ok成功了。

libaio under MIPS architecture /在mips架构下使用的libaio的更多相关文章

  1. OpenGL Insights 阅读有感 - Tile Based架构下的性能调校 翻译

    Performance Tunning for Tile-Based Architecture Tile-Based架构下的性能调校 by Bruce Merry GameKnife译 译序 在大概1 ...

  2. Spring Security Architecture and Implementation(架构和实现)学习笔记

    Spring Security 关于spring-security的官网文档学习笔记,主要是第8章 Architecture and Implementation(架构和实现)内容 参考: https ...

  3. CI Weekly #5 | 微服务架构下的持续部署与交付

    CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...

  4. MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构

    在"MVC项目实践,在三层架构下实现SportsStore-02,DbSession层.BLL层"一文的评论中,博友浪花一朵朵建议用类图来理解本项目的三层架构.于是就有了本篇: I ...

  5. [Architecture Design] 跨平台架构设计

    [Architecture Design] 跨平台架构设计 跨越平台 Productivity Future Vision 2011 在开始谈跨平台架构设计之前,请大家先看看上面这段影片,影片内容是微 ...

  6. MVC项目实践,在三层架构下实现SportsStore-02,DbSession层、BLL层

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  7. MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  8. MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  9. MVC项目实践,在三层架构下实现SportsStore-04,实现分页

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

随机推荐

  1. SpringMVC(三)——其他知识

    这篇博客,看一下在Controller类中,进行结果的跳转方式,对于SpringMVC框架中异常,如何统一捕捉,还有就是S(SpringMVC)SH的整合. 一,框架默认情况下是通过转发进行跳转的,如 ...

  2. SQL Serve数据库排序空值null始终前置的方法

    [转:http://blog.knowsky.com/233986.htm] [sqlserver]: sqlserver 认为 null 最小. 升序排列:null 值默认排在最前. 要想排后面,则 ...

  3. java二维码开发

    之前就写过很多关于二维码的东西,一直没有时间整理一下,所以呢今天就先来介绍一下如何利用java开发二维码.生成二维码有很多jar包可以实现,例如Zxing,QRcode,前者是谷歌的,后者日本的,这里 ...

  4. java与.net比较学习系列(7) 属性

    文章摘自:http://www.cnblogs.com/mcgrady/p/3411405.html 说起属性,实际上java中没有属性这个概念,只有字段和方法,但是可以通过私有字段和声明get,se ...

  5. 解开Android应用程序组件Activity的"singleTask"之谜

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6714543 在Android应用程序中,可以配 ...

  6. 关于select元素的一些基本知识

    为select元素绑定值的几个方法: 一.通过字符串拼接,让后追加到select元素下, 二.通过DOM创建option元素,为其绑上value值和文本: function loadProvinve( ...

  7. Struts2学习笔记 国际化(Internationalization)

    概述 国际化(Internationalization),通途的讲,就是让软件实现对多种语言的支持.可以通过简单的设置就可以从一种语言切换到另一种语言.用的最多的地方就是在应用程序的界面表示上.我们经 ...

  8. PHP PSR-2 代码风格规范 (中文版)

    代码风格规范 本篇规范是 PSR-1 基本代码规范的继承与扩展. 本规范希望通过制定一系列规范化PHP代码的规则,以减少在浏览不同作者的代码时,因代码风格的不同而造成不便. 当多名程序员在多个项目中合 ...

  9. Eloquent ORM 学习笔记

    最近在学习Laravel,觉得ORM功能很强大,我这里只是简单探索了一点,如果有更好的笔记,还请分享. 因为重点在于Eloquent ORM,所以路由设置,控制器就不详细描述了,这里直接进入Model ...

  10. MySQL用户管理语句001

    总的来说mysql的用户管理方法可以分为如下两种: 1.直接对mysql.user 表进行[insert | update | delete] + flush privileges 这种方式主要针对那 ...