从程序员的视角查看计算机系统
正文
从程序员的视角来看计算机系统
系统的结构
计算机系统,大致可以分为计算机硬件、操作系统(最接近于硬件的系统软件)和软件部分。
计算机硬件主要是硬件工程师,对固件程序微码的编写,
操作系统层次上,主要由内核工程师对驱动、内核模块编写。实现了操作系统对计算机资源的管理和控制,
接着往上,为软件部分,我们对其进行了进一步的划分,分为了 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_glibc
、print_by_wrapper
、print_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 文件的定义,形成的库文件是经过了汇编操作形成目标文件,然后生成动态或者静态链接库。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
2019-09-09 GCD欧几里得的拓展算法