摘要: 系统调用接口往往是通过中断来实现,比如Linux使用0x80号中断作为系统调用的入口,Windows采用0x2E号中断作为系统调用的入口。EAX名字C语言定义含义参数1exitvoid _exit(int status)退出进程EBX表示退出码2forkpid_t fork(void)复制进程EBX表示复制参数3readssize_t read( int fd,void *buf,size_t count)读文件EBX表示文件句柄,ECX表示读取缓冲地址,EDX表示读取的大小4writessize_t write( int fd,const void *buf,size_t count);写. 阅读全文
posted @ 2012-05-11 21:51 KingsLanding 阅读(1545) 评论(0) 推荐(0) 编辑
摘要: 程序从main开始的吗?在执行main之前全局变量已经初始化,main函数的两个参数也被正确传了进来,堆和栈的初始化也已经完成,一些系统I/O也被初始化。完成上面这些工作的函数称为入口函数(Entry Point)。一个典型的运行步骤大致如下:·操作系统在创建进程后,把控制权交到了程序的入口,这个入口往往是运行库中的某个函数。·入口函数对运行库和程序运行环境进行初始化,包括堆、I/O、线程、全局变量构造等。·入口函数在完成初始化之后,调用main函数,正是开始执行程序主体部分·main函数执行完毕以后,返回到入口函数,入口函数进行清理工作,包括全局变量的 阅读全文
posted @ 2012-05-11 21:25 KingsLanding 阅读(919) 评论(0) 推荐(0) 编辑
摘要: 注:这一章的内容比较经典,之前看“深入理解计算机系统”的时候,也有看到栈帧(Stack Frame),但是不是很清楚,通过这一章的讲解,更清楚了。如果能再结合讲讲GDB调试的话就更完美了。栈:栈用于维护函数调用的上下文,离开了站函数调用就没法实现。堆:堆是用来容纳应用程序动态分配的内存区域,当程序使用malloc或new分配内存时,得到的内存来自堆里。Linux进程地址空间内存布局:在操作系统中,栈总是向下增长的。在i386下,栈顶由称为esp的寄存器进行定位。压栈的操作使栈顶的地址减小,弹出的操作使栈顶的地址增大。 程序栈实例在栈底的地址是0xbfffffff,而esp寄存器表明了栈顶,地址 阅读全文
posted @ 2012-05-11 20:57 KingsLanding 阅读(1802) 评论(1) 推荐(1) 编辑
摘要: 第八章不是很感兴趣,直接跳到第九章。 DLL即动态链接库(Dynamic Link Library)的缩写. 一个DLL中有两个数据段,一个进程间共享,另一个私有. 当我们使用“__declspec(dllexport)”时表示该符号是从本DLL导出的符号。“__declspec(dllimport)”表示该符号是从别的DLL导入的符号。创建DLL:/*math.c*/__declspec(dllexport) double Add(double a, double b){return a+b;}__declspec(dllexport) double Sub(double a, doub.. 阅读全文
posted @ 2012-05-11 20:38 KingsLanding 阅读(530) 评论(0) 推荐(0) 编辑