阅读:3288回复:28
高分求救:小问题???!!!
我在给一块PCI卡在linux下写驱动(生成链接库),
期望生成静态库,指令如下: gcc -c drive.c -o librarydrive.o gcc test.c -o test static -L. -ldrive ./test 然后报错:segmentation fault 请问哪位大虾知道是什么原因,可以切磋一下吗? 谢谢!!! |
|
|
沙发#
发布于:2003-03-19 12:28
欢迎回复
分多的是,只要你有本事拿 ;) |
|
|
板凳#
发布于:2003-03-18 22:12
什么库无所谓,只要是binary code就达到目的了。但是注意别让别人反汇编出来。 一般怎么做呢 我不知道怎么防止别人反汇编啊 使用连接库应该没问题吧 要是被人反汇编就麻烦了 我玩单片机时,都是我反汇编别人的 不要这次让别人。。。 |
|
|
地板#
发布于:2003-03-18 21:52
什么库无所谓,只要是binary code就达到目的了。但是注意别让别人反汇编出来。
|
|
|
地下室#
发布于:2003-03-18 12:43
不给source code,给binary code.
|
|
|
5楼#
发布于:2003-03-18 11:51
快做完了
哦 再问一个问题: 一般在Linux下搞开发的话,不可能把驱动代码给用户的 那么是不是给:静态连接库和动态连接库呢 请教一下 谢谢 |
|
|
6楼#
发布于:2003-03-15 09:30
这个问题我以前也有想过,如果你想要使用iopl()指令的话,就必需具有root权限,这一点是无法避免的。其实这一点很好理解,因为在linux下,普通用户是不被允许访问I/O的。
另外还有另外一个方法来访问端口,它不需要root权限,就是用read/write来访问/dev/port这个设备文件,这个设备文件在默认情况下只有root可以读/写(其实也就是只允许root访问I/O),你可以先把它的权限改一下,然后再用非root的身份访问。不过这种方法不被推荐,因为它破坏了linux的系统规则,有可能对系统造成很大的危害。 |
|
|
7楼#
发布于:2003-03-14 22:41
Pharos,
你好! 我在google上查到了是这个问题。 非常感谢你啊 请你和hometown去另贴领分吧 但是我还是有个问题: iopl()存在访问权限的问题。 我想在用户权限下访问,该怎么办 不可能都在root权限下访问啊 是不是? |
|
|
8楼#
发布于:2003-03-14 18:55
zheng2002,
在你程序的入口处,如main()函数中,加入 iopl(3); 看看\"Segmentation fault\"错误,会不会消除。 Good Luck! |
|
|
9楼#
发布于:2003-03-14 17:13
waiting online.....
|
|
|
10楼#
发布于:2003-03-14 17:10
I find the error:
when i use the following sentence: outl(value,add); it says: segmentation fault. I have included the file : #include <sys/io.h> #include <stdio.h> thank you for your answer!!! |
|
|
11楼#
发布于:2003-03-14 15:37
thank you
let me see .... [编辑 - 3/14/03 by zheng2002] |
|
|
12楼#
发布于:2003-03-14 14:40
GDB -C CORE
然后 (gdb) where 看一下是哪儿的错! |
|
|
13楼#
发布于:2003-03-13 21:58
先给点分,表示感谢!
解决问题,一定另贴送分!! 这个世界热心人还是很多啊! 有其他高手也请发表意见,定送分。。 也想交个朋友。。。 等把这个项目做完,一定好好和你们聊聊,想认识一下。。 |
|
|
14楼#
发布于:2003-03-13 20:01
(1)sys/io.h 和 asm/io.h
这两个头文件有这样的关系, 前者在预编译时会把后者包含进来, 所以如果你程序中包含前者, readb()和writeb()就可以使用了 (2)readb() 和 writeb() 这两个宏一般是用做memory-mapped设备来使用的, 而PCI设备是通过IO端口来访问的, 因此你的程序中应该使用inb outb, inw outw等, 这几个宏实际对应的汇编用AT&T汇编可以写成: inb %dl(%dx, %edx), %al等, 不列举了。 对应的有延迟的是inb_p, outb_p, inw_p, outw_p等, 注意其中的参数的顺序。 参见本论坛中的The system halted, why?这个帖子, 我有回复其中不小心出现的问题。 你其中出现的SEGMENTATION FAULT很可能是因为你使用了readb, writeb的原因, 修改后看看还会不会出现这个问题。 ;) ;) |
|
|
15楼#
发布于:2003-03-13 19:24
用inb,outb, ..., inl, outl函数就可以访问到pci端口了,你在程序中要有下面这一行:
#include <sys/io.h> 在x86 PC上,如果你使用的是PCI机制1,那么PCI的端口是0xCF8, 0xCFC, 我以前写过这方面的代码,可以用。 Good Luck! |
|
|
16楼#
发布于:2003-03-13 17:16
其实我的drive.c是来配置PCI卡的。
我想把它做成一个链接库来供用户调用。 test是利用我得drive.c生成的连接库来控制PCI卡的。 drive.c中用readb()和writeb()等读写函数来配置PCI配置寄存器。 另外我包含的头文件是:/sys/io.h ,和/asm/io.h有什么区别吗 我的找不到/asm/io.h 请几位兄弟帮助,等解决了定高分相送 也非常希望能结为朋友 |
|
|
17楼#
发布于:2003-03-12 22:13
应该也算是驱动了 你的问题没说清楚, 很难回答问题在哪里, 因为你写了测试程序, 所以可能在测试程序里。 很难确定问题出在哪里。 关于你说的两个“函数”(实际上是两个宏, 看上去象函数), 在/LINUXSORUCE/INCLUDE/ASM/IO。H中, 通用目录是/usr/include/asm/io.h中 |
|
|
18楼#
发布于:2003-03-12 21:51
谢谢 楼上的兄弟
然我先试一下 。。。。 |
|
|
19楼#
发布于:2003-03-12 19:00
编译的时候带上-g 参数,用gdb调试,应该能找到错误在代码的
哪里,大部分情况应该是非法指针的问题,如果是驱动,就这么两句话肯定是不行的,你好好看看驱动模块的Makefile是怎么写的! |
|
|
上一页
下一页