如何对系统内存进行读操作?

2008-04-09 04:04:16来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折


使用sysi86获取指定进程的user buffer,可以成功,但对取到的
如user_t.u_procp(进程信息结构)或是user_t.u_base(I/O address)指针无法进行读操作-- memcpy/printf都不行,直接执行会coredump.
下面是取进程I/O地址及内容的代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/sysi86.h>
#include <sys/user.h>

char*_video_ram_addr;

int
main( int argc, char *argv[] 
{

user_t user_buf;
char buf[ 2048 ];
FILE *fp;
int i, j, k = 0;

memset( &user_buf, 0x00, sizeof( user_t  ;
memset( buf, 0x00, sizeof( buf  ;
if( ( fp = fopen( "video.log", "w"   == NULL  {
perror( "open file error!" ;
exit( 1 ;
}
sysi86( RDUBLK, atoi( argv[1] , &user_buf, sizeof( user_t  ;

_video_ram_addr = user_buf.u_base;

printf( "video_ram_addr:[0x%p]\n", _video_ram_addr ;

for( i = 0 ; i < 2000; i , _video_ram_addr   {
buf[i] = *_video_ram_addr;
fprintf( fp, "HEX:[0x%x]CHAR:[%c]\n", buf[i], buf[i] ;
}

fclose( fp ;
}

frompinge 回复于:2003-01-22 14:53:38 我使用SCO UNIX 5.0.5;
使用adb跟踪程序,到进行赋值时,会提示memory fault;
关于对系统inode/file/proc三个结构的访问,各位如有其它的办法访问(比如直接读/dev/kmem,好像系统提供的pstat/ps就是这么做的),请指教。
对于这段程序,我的本意是取得指定进程的一些信息,如打开的文件、I/O地址,同时想对进程的I/O进行监控。
对外,对于SCO的系统调用反汇编出来最后都只能跟到call 0x7:0x0,如何反汇编0x7:0x0部分的代码,如果各位请楚,也请指教。

同时,欢迎大家与我交流frompinge@163.net/frompinge@163.com都可以。

menp9999 回复于:2003-01-25 10:16:33 你这么做,我觉得不行,你说的那块数据属于内核管理范围的东西,用户态没有读写的权力。OSR5又不好象LINUX容易修改系统调用,因此我建议做个驱动程序吧,利用驱动程序完成在内核和用户态通讯。

menp9999 回复于:2003-01-25 10:17:37 [quote:4de401ce21="frompinge"]我使用SCO UNIX 5.0.5;
使用adb跟踪程序,到进行赋值时,会提示memory fault;
关于对系统inode/file/proc三个结构的访问,各位如有其它的办法访问(比如直接读/dev/kmem,好像系统提供的pstat/ps就是这么做的),..........[/quote:4de401ce21]
哈哈,我也有这个爱好,我的QQ是50163813。

frompinge 回复于:2003-01-25 12:21:44 多谢,顺便问问有没有关于SCO下驱动程序开发的相关资料?
我没有这方面的经验,请多指教!

menp9999 回复于:2003-01-26 13:41:42 [quote:cc9adc5b53="frompinge"]多谢,顺便问问有没有关于SCO下驱动程序开发的相关资料?
我没有这方面的经验,请多指教![/quote:cc9adc5b53]
我没有电子文档资料。你可以在SCO的站点看。

http://docsrv.caldera.com/下有个“Hardware and Driver Development ”,你可以去找找。

menp9999 回复于:2003-01-27 08:52:13 [quote:5b737e75a4="frompinge"]我使用SCO UNIX 5.0.5;
使用adb跟踪程序,到进行赋值时,会提示memory fault;
关于对系统inode/file/proc三个结构的访问,各位如有其它的办法访问(比如直接读/dev/kmem,好像系统提供的pstat/ps就是这么做的),..........[/quote:5b737e75a4]
0x7:0x0是一个调用门选择子和偏移量(后者不用),你可以参见(/usr/include/seg*.h),USER_SCALL定义的就是0x7,表示LDT的第零项(7=000000111b,表示的意思是LDT,3级的特权),通过CALL,系统控制转移到了内核态,这里的CALL就是操作系统原理讲的访管指令。由于LDT表虽然可以说是用户的数据,但是管理还是归系统管理的,所以用ADB修改肯定是出错的。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:关于UNIX服务器集群监控系统的构想,gadfly请进

下一篇:利用 Rational Unified Process 达到 CMM 级别 2 和 3 ...