从程序员的视角查看计算机系统

从程序员的视角来看计算机系统

系统的结构

计算机系统,大致可以分为计算机硬件、操作系统(最接近于硬件的系统软件)和软件部分。
计算机硬件主要是硬件工程师,对固件程序微码的编写,
操作系统层次上,主要由内核工程师对驱动、内核模块编写。实现了操作系统对计算机资源的管理和控制,
接着往上,为软件部分,我们对其进行了进一步的划分,分为了 API 层第三层,和 Shell 、 其它库或平台、C/C++库的第四层。
在 API 层,应用开发工程师基于 API 进行开发,在往上也是应用开发工程师通过各种库进行开发。

本门课程,主要面向应用开发工程师,关注 API 层次 和 C/C++ 库部分。

系统调用和库的关系

操作系统作为用户和计算机的接口,需要向上提供一些简单易用的服务,主要包括命令接口和程序接口。其中,程序接口由一组系统调用组成,系统调用是操作系统提供给应用程序(程序员/编程人员)使用的接口。

系统调用的英文单词为 syscall,他和 库函数有什么联系呢?下面来谈一谈。

#include <unistd.h>
#include <stdio.h>

void print_by_glibc(void)
{
	int ret = printf("Hello World!\n");
}

void print_by_wrapper(void)
{
	const char buffer[] = "Hello World!\n";
	unsigned long len = sizeof(buffer) - 1;
	long ret = 0;

	ret = write(1, buffer, len);
}

void print_by_syscall(void)
{
	const char buffer[] = "Hello World!\n";
	unsigned long len = sizeof(buffer) - 1;
	long ret = 0;
	
	asm volatile("movl $1, %%eax\n\t"
				 "movl $1, %%edi\n\t"
				 "movq %1, %%rsi\n\t"
				 "movq %2, %%rdx\n\t"
				 "syscall\n\t"
				 "movq %%rax, %0"
				 :"=m"(ret)
				 :"r"(buffer), "m"(len)
				 :"cc", "r11", "rcx", "rax", "edi", "rsi", "rdx", "memory");
}

int main(void)
{
	print_by_glibc();
	print_by_wrapper();
	print_by_syscall();
	
	return 0;
}

首先,我们来分析一下上述的代码,代码中主要存在三个函数print_by_glibcprint_by_wrapperprint_by_syscall 分别代表了使用 glibc, wrapper 函数,以及 syscall 输出 字符串 "Hello World" 的方法,但是他们采用了不同的方法。

  • print_by_syscall,系统调用 system call 是操作系统提供给应用程序的接口之一。

  • print_by_wrapper,wrapper 函数 write,内部封装了系统调用

  • print_by_glibc 使用的是 glibc 库函数 printf,内部封装了 wrapper 函数

其实我们是没有办法查看 printf 源码的,只能看到他 .h 文件的定义,形成的库文件是经过了汇编操作形成目标文件,然后生成动态或者静态链接库。

posted @ 2022-09-09 09:32  lucky_light  阅读(184)  评论(0编辑  收藏  举报