Skip to content

Commit 6509965

Browse files
committed
learning
1 parent dd26fda commit 6509965

File tree

3 files changed

+35
-6
lines changed

3 files changed

+35
-6
lines changed

为了工作/Linux/Linux 设备驱动开发详解.md

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ categories:
44
- Linux学习
55
abbrlink: 484892ff
66
date: 2024-10-24 15:00:00
7-
updated: 2024-11-07 15:20:00
7+
updated: 2024-11-07 18:10:00
88
---
99

1010
<meta name="referrer" content="no-referrer"/>
@@ -917,9 +917,9 @@ mode 表示打开模式,支持的模式如图所示:
917917
918918
2. 读写
919919
920-
标准 C 库的 IO 函数会自动在用户层分配缓冲区,而系统调用不具有用户层缓冲区。二者都具有内核层的缓冲区。
920+
标准 C 库的 IO 函数会自动在用户层分配缓冲区,而系统调用不具有用户层缓冲区。二者都具有内核层的缓冲区。其中缓冲分为三种,**全缓冲、行缓冲和无缓冲**。
921921
922-
其中缓冲分为三种,**全缓冲、行缓冲和无缓冲**,自然也对应不同缓冲情况下的 IO 函数。
922+
罗列部分 API 接口如下:
923923
924924
```cpp
925925
int fgetc(FILE *stream);
@@ -1755,3 +1755,20 @@ struct file_operations {
17551755
} __randomize_layout;
17561756
```
17571757

1758+
下面对其进行简要分析:
1759+
1760+
1. llseek():修改一个文件的当前读写位置,并返回新位置偏移指针。出错时函数返回负值。
1761+
2. read():**从设备读取数据。**成功时返回读取的字节数,出错时返回一个负值。与用户空间的 `ssize_t read(int fd, void *buf, size_t count);` 函数对应。返回 0 代表 EOF(end of file)。
1762+
3. write():**向设备发送数据。**成功时返回写入的字节数,出错时返回一个负值。如果未实现此函数,用户进行 write() 系统调用时,将得到 -EINVAL 返回值。与用户空间的 `ssize_t write(int fd, const void *buf, size_t count);` 函数对应。同样返回 0 代表 EOF(end of file)。
1763+
4. unlocked_ioctl():提供**设备相关控制命令的实现**(既不是读操作,也不是写操作)。成功时返回一个非负值。与用户空间的 `int fcntl(int fd, int cmd, ... /* arg */ );` 函数对应。
1764+
5. mmap():**将设备内存映射到进程的虚拟地址空间中。**如果未实现此函数,用户进行 mmap() 系统调用的时,会获得 -ENODEV 返回值。这个函数对于帧缓冲等设备特别有意义,帧缓冲被映射到用户空间后,应用程序可以直接访问它而无须在内核和应用间进行内存复制。与用户空间的 `void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);` 函数对应。
1765+
6. open()、release():当用户空间调用 open() 打开设备文件时,设备驱动的 open() 函数最终被调用。驱动程序可以不实现这个函数,在这种情况下,设备的打开操作永远成功。与 open() 函数对应的是 release() 函数,也对应用户空间的 close() 函数。
1766+
7. poll():一般用于询问设备是否可被非阻塞地立即读写。当询问的条件未触发时,用户空间进行 select() 和 poll() 系统调用将引起进程的阻塞。
1767+
8. aio_read()、aio_write():对与文件描述符对应的设备进行**异步**读、写操作。设备实现这两个函数后,用户空间可以对该设备文件描述符执行 SYS_io_setup、SYS_io_submit、SYS_io_getevents、SYS_io_destroy 等系统调用进行读写。
1768+
1769+
### 字符设备驱动的组成
1770+
1771+
#### 模块加载与卸载函数
1772+
1773+
在模块加载函数中应实现设备号的申请和 cdev 的注册,在模块卸载函数中应实现 cdev 的注销和设备号的释放。
1774+

为了工作/Linux/UNIX环境高级编程.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ categories:
44
- Linux学习
55
abbrlink: 9e44c3b9
66
date: 2024-06-20 23:05:00
7-
updated: 2024-06-20 23:05:00
7+
updated: 2024-11-07 16:25:00
88
---
99

1010
<meta name="referrer" content="no-referrer"/>
@@ -3172,7 +3172,19 @@ int main() {
31723172

31733173
## 缓冲
31743174

3175-
**标准`I/O`库提供缓冲的目的就是尽可能少的调用`write``read`函数,也是对每个`I/O`流自动进行缓冲管理,而不需要应用程序考虑这一点,可能带来麻烦;**
3175+
**标准`I/O`库提供缓冲的目的就是尽可能少的调用`write``read`函数,也是对每个`I/O`流自动进行缓冲管理,而不需要应用程序考虑这一点,可能带来麻烦。**
3176+
3177+
### 缓冲区的目的(重要)
3178+
3179+
当我们向文件中写入数据时,这是一个 I/O 的过程。I/O 的次数越多,那么时间浪费越多,效率越低。如果使用一个东西预先存储这些数据,先不将这些数据写入文件,而是当到达一定规模时统一写入文件,那么 I/O 的次数就会减少,进而效率提升。
3180+
3181+
因此,**缓冲区存在的意义就是通过减少 I/O 次数达到效率上的提升**
3182+
3183+
更多细节请参考博客:[https://blog.csdn.net/weixin_61857742/article/details/127424052](https://blog.csdn.net/weixin_61857742/article/details/127424052)
3184+
3185+
读了这篇文章以后,再来考虑一下读取数据的过程。和写入类似,为了减少 I/O 请求,读取的时候可能会一次性读取一大块数据到 I/O 缓冲区中。当用户请求读取的时候,优先查询缓冲区,如果有就可以有效的减少 I/O 操作了,而不用每次读取都从文件中读取。由于 I/O 缓冲区的数据和用户的存储结构都是在内存中,因此 fread() 执行以后,用户的存储结构的数据更新是实时的,而非 fwrite() 函数先写到 I/O 缓冲区中,需要 fflush() 才刷新。这和 fread() 首先就需要从文件中读取数据有关,也和 fread() 和 fwrite() 的语义不同有关。
3186+
3187+
因此,理解到这里,应该知道,用户程序中的接收数组,例如 char[] 字符串最好不要叫做 buff 了,免得与 I/O 缓冲区相混淆。
31763188

31773189
### 三种类型的缓冲
31783190

为了工作/Linux/牛客Linux.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10896,7 +10896,7 @@ Linux 用套接口进行信号驱动 IO,安装一个信号处理函数,进
1089610896
1089710897
### 异步(asynchronous)
1089810898
10899-
Linux中,可以调用 aio_read 函数告诉内核描述字缓冲区指针和缓冲区的大小、文件偏移及通知的方 式,然后立即返回,当内核将数据拷贝到缓冲区后,再通知应用程序
10899+
Linux中,可以调用 aio_read 函数告诉内核描述字缓冲区指针和缓冲区的大小、文件偏移及通知的方式,然后立即返回,当内核将数据拷贝到缓冲区后,再通知应用程序
1090010900
1090110901
![image-20230823155255891](https://img-blog.csdnimg.cn/0d631b3be40c478396ccc406e68ee355.png)
1090210902

0 commit comments

Comments
 (0)