Chinaunix

标题: 如何对系统内存进行读操作? [打印本页]

作者: frompinge    时间: 2003-01-22 14:44
标题: 如何对系统内存进行读操作?
使用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( &amp;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] ), &amp;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 = *_video_ram_addr;
                fprintf( fp, "HEX:[0x%x]CHAR:[%c]\n", buf, buf );
        }

         fclose( fp );
}
作者: frompinge    时间: 2003-01-22 14:53
标题: 如何对系统内存进行读操作?
我使用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
标题: 如何对系统内存进行读操作?
你这么做,我觉得不行,你说的那块数据属于内核管理范围的东西,用户态没有读写的权力。OSR5又不好象LINUX容易修改系统调用,因此我建议做个驱动程序吧,利用驱动程序完成在内核和用户态通讯。
作者: menp9999    时间: 2003-01-25 10:17
标题: 如何对系统内存进行读操作?
原帖由 "frompinge" 发表:
我使用SCO UNIX 5.0.5;
使用adb跟踪程序,到进行赋值时,会提示memory fault;
关于对系统inode/file/proc三个结构的访问,各位如有其它的办法访问(比如直接读/dev/kmem,好像系统提供的pstat/ps就是这么做的),..........

哈哈,我也有这个爱好,我的QQ是50163813。
作者: frompinge    时间: 2003-01-25 12:21
标题: 如何对系统内存进行读操作?
多谢,顺便问问有没有关于SCO下驱动程序开发的相关资料?
我没有这方面的经验,请多指教!
作者: menp9999    时间: 2003-01-26 13:41
标题: 如何对系统内存进行读操作?
原帖由 "frompinge" 发表:
多谢,顺便问问有没有关于SCO下驱动程序开发的相关资料?
我没有这方面的经验,请多指教!

我没有电子文档资料。你可以在SCO的站点看。

http://docsrv.caldera.com/下有个“Hardware and Driver Development ”,你可以去找找。
作者: menp9999    时间: 2003-01-27 08:52
标题: 如何对系统内存进行读操作?
原帖由 "frompinge" 发表:
我使用SCO UNIX 5.0.5;
使用adb跟踪程序,到进行赋值时,会提示memory fault;
关于对系统inode/file/proc三个结构的访问,各位如有其它的办法访问(比如直接读/dev/kmem,好像系统提供的pstat/ps就是这么做的),..........

0x7:0x0是一个调用门选择子和偏移量(后者不用),你可以参见(/usr/include/seg*.h),USER_SCALL定义的就是0x7,表示LDT的第零项(7=000000111b,表示的意思是LDT,3级的特权),通过CALL,系统控制转移到了内核态,这里的CALL就是操作系统原理讲的访管指令。由于LDT表虽然可以说是用户的数据,但是管理还是归系统管理的,所以用ADB修改肯定是出错的。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2