LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1197|回复: 11

[紧急求助]关于对I/O操作的问题(附代码)!!!

[复制链接]
发表于 2005-7-26 11:38:30 | 显示全部楼层 |阅读模式
请看代码:
#include<stdio.h>
#include<stdlib.h>
#include <sys/io.h>
#include <linux/ioport.h>

int base=0x210;              //base address
int x;
int main()
{
x=check_region(0x210,0x8);

if(x==0)
{
  request_region(0x210,0x8,"AC1082");
  int nDI;
  nDI=inb(0x216);
}
else printf("ERROR");

  return 0;
}

我想要对I/O进行操作,不知上面的方法是否正确?
在编译时,提示如下错误:
/tmp/ccqsb5EC.o(.text+0x1b): In function `main':
: undefined reference to `ioport_resource'
/tmp/ccqsb5EC.o(.text+0x20): In function `main':
: undefined reference to `__check_region'
/tmp/ccqsb5EC.o(.text+0x58): In function `main':
: undefined reference to `ioport_resource'
/tmp/ccqsb5EC.o(.text+0x5d): In function `main':
: undefined reference to `__request_region'
collect2: ld returned 1 exit status

这是怎么回事?难到不是#include <linux/ioport.h>这个头文件吗?
发表于 2005-7-26 18:09:56 | 显示全部楼层
搞笑! :beat

这位仁兄先学会编译内核模块,再搞其它的吧!
回复 支持 反对

使用道具 举报

发表于 2005-7-26 21:49:58 | 显示全部楼层
先看看操作系统原理
在现在的操作系统里,比如Linux或者windows nt/2000/xp,user space的程序不能直接对io port进行操作
只有操作系统内核才可以
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-27 09:28:49 | 显示全部楼层
Post by daemeon
搞笑! :beat

这位仁兄先学会编译内核模块,再搞其它的吧!


就是因为不懂才问,有什么搞笑的???

你解答不了就别说没用的!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-27 09:34:12 | 显示全部楼层
#include<stdio.h>
#include<stdlib.h>
#include <sys/io.h>

unsigned long start,len;
int nDI;

int main()
{
        start=0x210;//基地址
        len=8;//长度
       
        ioperm(start,len,1);//获得I/O控制权

//AC1082 DIO Test
        outb(0xff,0x216);
       
        nDI=inb(0x216);
       
        printf("nDI=%d\n",nDI);

        ioperm(start,len,0);//释放I/O控制权
          
        return 0;
}

现在利用ioperm登记后就可以直接对I/O进行操作了,运行正确!
前面用request_region错在什么地方了?
回复 支持 反对

使用道具 举报

发表于 2005-7-27 09:36:54 | 显示全部楼层
楼主是在编译一个module还是一个user space ap?

另外3楼的说法也稍有不对,linux userspace可以通过iopl取得访问权限进行io操作,windows估计也有类似的东西。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-27 09:48:38 | 显示全部楼层
Post by phyma
楼主是在编译一个module还是一个user space ap?

另外3楼的说法也稍有不对,linux userspace可以通过iopl取得访问权限进行io操作,windows估计也有类似的东西。


我只是对一块ISA接口的数据采集卡进行操作。
回复 支持 反对

使用道具 举报

发表于 2005-7-27 16:22:10 | 显示全部楼层
Post by zsddsz
#include<stdio.h>
#include<stdlib.h>
#include <sys/io.h>

unsigned long start,len;
int nDI;

int main()
{
        start=0x210;//基地址
        len=8;//长度
       
        ioperm(start,len,1);//获得I/O控制权

//AC1082 DIO Test
        outb(0xff,0x216);
       
        nDI=inb(0x216);
       
        printf("nDI=%d\n",nDI);

        ioperm(start,len,0);//释放I/O控制权
          
        return 0;
}

现在利用ioperm登记后就可以直接对I/O进行操作了,运行正确!
前面用request_region错在什么地方了?


check_region,request_region在内核中才能用.
回复 支持 反对

使用道具 举报

发表于 2005-7-27 16:29:38 | 显示全部楼层
Post by zsddsz
我只是对一块ISA接口的数据采集卡进行操作。

Kernel Space? User Space?

用来做什么反而不要紧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-27 16:37:44 | 显示全部楼层
Post by daemeon
check_region,request_region在内核中才能用.


我是在User Space中用的!

check_region,request_region只能在内核中是吗?

那要在User Space中对I/O操作就要用ioperm,是这意思吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表