13.程序员的自我修养---运行库实现

13.1 C 语言运行库
	13.1.1 开始
		1.程序运行的最初入口点不是 main 函数,而是由运行库为其提供的入口函数。它主要负责三部分工作:准备好程序运行环境以及初始化运行库,
		  调用 main 函数执行程序主题,清理程序运行后的各种资源。
		2.运行库为所有程序提供的入口函数应该相同,在链接程序时必须指定该入口函数名。

		入口函数:
			void mini_crt_entry(void)
			{
				//初始化部分
				int ret = main();
				//结束部分
				exit(ret);
			}

			这里的初始化主要负责准备好程序运行的环境,包括准备 main 函数的参数,初始化运行库,包括堆,IO等,结束部分主要负责清理程序运行资源。

		main 参数:
			我们知道 main 函数的原型为 : int main(int argc, char *argv[]);
			其中 argc 和 argv 分别是 main 函数的2个参数,它们分别表示程序运行时的参数个数和执行指向参数的字符串指针数组。在 Linux 下,当进程
		  被初始化时,它的堆栈结构中就保存着环境变量和传递给 main 函数的参数,我们可以通过 ESP 寄存器获得这2个参数。但是一旦进入到 mini_crt_entry
		  之后,ESP 寄存器就会随着函数的执行而被改变,我们知道EBP的内容就是进入函数后 ESP+4。那么可以推断 EBP-4 所执行的内容应该就是 argc,而 EBP-8 
		  就是 argv。

		CRT 初始化:
			完成了获取 main 函数参数的代码后,还一个在入口函数里对 CRT 进行初始化。需要初始化的主要是堆和 IO 部分。

		结束部分:
			Mini CRT 的结束部分很简单,它要完成2项任务:一个就是由调用 atexit() 注册的退出回调函数;另外一个就是实现结束进程。

	13.1.2 堆的实现
		有了 CRT 的入口函数,exit()函数之后,下一步的目标就是实现堆操作,即 malloc()函数和 free() 函数。
		brk 系统调用可以设置进程的数据段边界,而 sbrk 可以移动进程的数据段边界。显然,如果将数据段边界后移,就相当于分配了一定量的内存。

	13.1.3 IO与文件操作

	13.1.4 字符串相关操作

	13.1.5 格式化字符串

13.1 C 语言运行库

13.2 如何使用 Mini CRT

13.3 C++ 运行库实现

13.4如何使用 Mini CRT++
    

猜你喜欢

转载自blog.csdn.net/enlyhua/article/details/85158337