Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-0.11
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
xpstem
linux-0.11
Commits
14837057
Commit
14837057
authored
Aug 09, 2014
by
karottc
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
给fs/block_dev.c文件增加注释-(1).
parent
6e702853
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
26 additions
and
4 deletions
+26
-4
fs/block_dev.c
fs/block_dev.c
+26
-4
No files found.
fs/block_dev.c
View file @
14837057
...
...
@@ -11,15 +11,31 @@
#include <asm/segment.h>
#include <asm/system.h>
//// 数据块写函数 - 向指定设备从给定偏移出写入制定长度数据。
// 参数:dev - 设备号; pos - 设备文件中偏移量指针;buf - 用户空间中缓冲区地址;
// count - 要传送的字节数
// 返回已写入字节数。若没有写入任何字节或出错,则返回出错号。
// 对于内核来说,写操作是向高速缓冲区中写入数据。什么时候数据最终写入设备是由高
// 速缓冲管理程序决定并处理的。另外,因为块设备是以块为单位进行读写,因此对于写
// 开始位置不处于块起始处时,需要先将开始字节所在的整个块读出,然后将需要写的数
// 据从写开始处填写满该块,再将完整的一块数据写盘(即交由高速缓冲程序去处理)。
int
block_write
(
int
dev
,
long
*
pos
,
char
*
buf
,
int
count
)
{
int
block
=
*
pos
>>
BLOCK_SIZE_BITS
;
int
offset
=
*
pos
&
(
BLOCK_SIZE
-
1
);
// 首先由文件中位置pos换算成开始读写盘快的块序号block,并求出需写第1字节在该
// 块中的偏移位置offset.
int
block
=
*
pos
>>
BLOCK_SIZE_BITS
;
// pos所在文件数据块号
int
offset
=
*
pos
&
(
BLOCK_SIZE
-
1
);
// pos在数据块中偏移值
int
chars
;
int
written
=
0
;
struct
buffer_head
*
bh
;
register
char
*
p
;
register
char
*
p
;
// 局部寄存器变量,被存放在寄存器中
// 然后针对要写入的字节数count,循环执行以下操作,知道数据全部写入。在循环执行
// 过程中,先计算在当前处理的数据块中可写入的字节数。如果写入的字节数填不满一块,
// 那么就只需写count字节。如果正要写1块数据内容,则直接申请1块高速缓冲块,并把
// 用户数据放入即可。否则就需要读入将被写入部分数据的数据块,并预读下两块数据。
// 然后将块号递增1,为下次操作做好准备。如果缓冲块操作失败,则返回已写字节数,
// 如果没有写入任何字节,则返回出错号(负数).
while
(
count
>
0
)
{
chars
=
BLOCK_SIZE
-
offset
;
if
(
chars
>
count
)
...
...
@@ -31,10 +47,16 @@ int block_write(int dev, long * pos, char * buf, int count)
block
++
;
if
(
!
bh
)
return
written
?
written
:-
EIO
;
// 接着先把指针p指向读出数据的缓冲块中开始写入数据的位置处。若最后一次循环写入
// 的数据不足一块,则需从块开始处填写(修改)所需的字节,因此这里需预先设置offset
// 为零。此后将文件中偏移指针pos前移此次将要写的字节数chars,并累加这些要写的
// 字节数到统计值written中,再把还需要写的计数值count减去此次要写的字节数chars.
// 然后我们从用户缓冲区复制chars个字节到p指向的高速缓冲中开始写入的位置处。复制
// 完后就设置该缓冲区块已修改标志,并释放该缓冲区(也即该缓冲区引用计数递减1)。
p
=
offset
+
bh
->
b_data
;
offset
=
0
;
*
pos
+=
chars
;
written
+=
chars
;
written
+=
chars
;
// 累计写入字节数
count
-=
chars
;
while
(
chars
-->
0
)
*
(
p
++
)
=
get_fs_byte
(
buf
++
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment