如何对系统内存进行读操作?
使用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 = *_video_ram_addr;
fprintf( fp, "HEX:[0x%x]CHAR:[%c]n", buf, buf );
}
fclose( fp );
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
0x7:0x0是一个调用门选择子和偏移量(后者不用),你可以参见(/usr/include/seg*.h),USER_SCALL定义的就是0x7,表示LDT的第零项(7=000000111b,表示的意思是LDT,3级的特权),通过CALL,系统控制转移到了内核态,这里的CALL就是操作系统原理讲的访管指令。由于LDT表虽然可以说是用户的数据,但是管理还是归系统管理的,所以用ADB修改肯定是出错的。
我没有电子文档资料。你可以在SCO的站点看。
http://docsrv.caldera.com/下有个“Hardware and Driver Development ”,你可以去找找。
多谢,顺便问问有没有关于SCO下驱动程序开发的相关资料?
我没有这方面的经验,请多指教!
哈哈,我也有这个爱好,我的QQ是50163813。
你这么做,我觉得不行,你说的那块数据属于内核管理范围的东西,用户态没有读写的权力。OSR5又不好象LINUX容易修改系统调用,因此我建议做个驱动程序吧,利用驱动程序完成在内核和用户态通讯。
我使用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都可以。