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. (史上最全的ios源码汇总)

    按钮类         按钮 Drop Down Control         http://www.apkbus.com/android-106661-1-1.html 按钮-Circular M ...

  2. 01串(dp)

    01串 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有“11”子串的这种长度的01串共有多少个, ...

  3. jquery的验证实例方法

    上一篇介绍了js的正则验证法,这一片就用jquery来实例运行一下其中的几个方法 Js部分 <script> $(function(){ var ok1=false; var ok2=fa ...

  4. Pull生成&解析

    开篇注意,由于解析有可能有大文件非常耗时,建议另开一个线程解析也可以不开具体视情况而定     Pull生成 1.通过xml获得序列化的实例 XmlSerializer nxs = Xml.newSe ...

  5. wince下写入数据到csv/txt文件中

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. QT TCP/IP

    QT 网络通信(TCP/IP) 服务端: 一.监听新的客户端接入(QTcpServer) 重写函数 incomingConnection(qintptr socketDescriptor) 二.服务端 ...

  7. Servlet开发(二)

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...

  8. [ofbiz]service中OUT的定义

    在service中返回的任何一个结果,比如map1,map2,然后这两个map又封装在另一个map中,则service的定义中,要将map1和map2定义为OUT类型 LOFTER:我们的故事   h ...

  9. C#解析JSON数据

    本篇文章主要介绍C#对Json数据的读取. 主要操作过程是: 发送Http请求获取Json数据 把获取的Json数据转换成C#中的类 下面我们以12306火车票余票的数据为例进行切入. 首先来看一下h ...

  10. Python之路第十三天,高级(7)-详述数据库一对多,多对多表关系的设计以及如何查询

    一对多表设计和查询方法 #!/usr/bin/env python3 # Author: Zhangxunan from sqlalchemy import create_engine from sq ...