Computer Science from the Bottom Up Notes-1

 看到一本很好的书,链接,感觉对自己的安全基础很有帮助。

General Unix and Advanced C

 Linux 或 BSD 等类 UNIX 系统的原则:一切皆文件。

抽象与API实现

 Linux源码中经常出现,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>

/* 需要实现的 API */
struct greet_api
{
int (*say_hello)(char *name);
int (*say_goodbye)(void);
};

int say_hello_fn(char *name)
{
printf("Hello %s\n", name);
return 0;
}

int say_goodbye_fn(void)
{
printf("Goodbye\n");
return 0;
}

/* 实现 API 的结构 */
struct greet_api greet_api =
{
.say_hello = say_hello_fn,
.say_goodbye = say_goodbye_fn
};

int main(int argc, char *argv[])
{
greet_api.say_hello(argv[1]);
greet_api.say_goodbye();
printf("%p, %p, %p\n", greet_api.say_hello, say_hello_fn, &say_hello_fn);
exit(0);
}

 在来看一个例子virtio.h:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct virtio_driver {
struct device_driver driver;
const struct virtio_device_id *id_table;
const unsigned int *feature_table;
unsigned int feature_table_size;
int (*probe)(struct virtio_device *dev);
void (*scan)(struct virtio_device *dev);
void (*remove)(struct virtio_device *dev);
void (*config_changed)(struct virtio_device *dev);
#ifdef CONFIG_PM
int (*freeze)(struct virtio_device *dev);
int (*restore)(struct virtio_device *dev);
#endif
};

 这与上方的greet_api是类似的,都写了期望提供的函数。UNIX平台的标准库一般被称为libc。它提供了系统的基本接口:read()、write()和printf()等基本调用,这个API由一个名为POSIX的规范完整描述。

文件描述符

 每个运行的程序开始时都有三个已经打开的文件:标准输入、标准输出、标准错误。

image-20231013134721266

 打开文件使用open API,其返回文件描述符,本质上是内核存储的文件描述符表的索引。内核创建文件描述符以响应open调用,并将文件描述符底层类似文件的对象的某种抽象相关联,该对象可以是实际的硬件设备、文件系统。操作系统要求程序员创建设备驱动程序,以便能够与硬件设备通信,设备驱动提供了由内核调用的一系列函数。如下图所示:驱动程序提供了一个read write函数,驱动程序知道如何将这些通用请求转换为特定设备的特定请求

image-20231013135901371

 内核通过称为设备层的东西提供了文件接口。主机上的物理设备由特殊文件系统/dev中的文件表示。设备节点有主要和次要编号(/dev/null/dev/zero/dev/tty),这允许内核将特定节点与底层驱动程序相关联。

 当文件被打开时,内核使用路径信息将文件描述符映射到提供读写功能的东西上,具体而言,文件描述符会定位到挂载点,挂载点下打开的文件可以被定向到系统文件驱动程序。

理解内核就是理解API是如何相互关联和共存的

 shell例如bash、zsh、csh,它们可以帮助用户与操作系统交互。一些shell数据传递方式如下:

image-20231013174154191

 例如ls|more,其不是将标准输出的文件描述符与某种底层设备(如控制台,用于输出到终端)相关联,而是将描述符指向内核提供的内存缓冲区,通常称为管道。

Binary and Number Representation

留言

© 2024 wd-z711

⬆︎TOP