- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在深入研究内核源代码时注意到了这个函数 set_bh_page()
。但是,我无法清楚地理解它的作用。
我只能在 fs/buffer.c
文件中找到这条注释:
/* Link the buffer to its page */
set_bh_page(bh, page, offset);
但我仍然不清楚它的作用。
所以,为了说清楚,我想了解这个函数调用与缓冲区和物理页面有什么关系,以及它是否与页面缓存本身有什么关系。
更新 1:
函数alloc_page_buffers()
调用了这个set_bh_page()
,对此有一些评论,如下:
Create the appropriate buffers when a given a page for data area and the size of each buffer.. User the bh->b_this_page linked list to follow the buffers created. Return NULL if unable to create more buffers.
我检查了谁调用了 alloc_page_buffers()
,其中一个是 read_page()
,它有这样的描述:
Read a page from a file.
We both read the page, and attach buffers to the page to record the address of each block (using bmap). These addresses will be used to write the block later, completely bypassing the filesystem. This usage is similar to how swap files are handled, and allows us to write to a file with no concerns of memory allocation failing.
所以,通过查看read_page()
的源码,我的理解是分配的buffer_head
必须关联到它的物理页地址,就像直接映射一样.
对吗?
最佳答案
当内核需要从 block 设备访问 block 并且发现页面缓存中没有包含该 block 的页面时,它会分配一个页面,称为 block 设备缓冲页或者只是一个缓冲页,然后将请求的 block 写入其中。该过程以 grow_buffers 开始函数,调用 alloc_page_buffers ,声明如下:
struct buffer_head *alloc_page_buffers(struct page *page, unsigned long size, bool retry);
page
指向将要保存该 block 的缓冲区页的描述符。 size
表示 block 的大小(以字节为单位),其中缓冲页的所有 block 大小相同。请注意, block 是 block 设备的内存区域,而缓冲区是主内存的内存区域。缓冲区保存单个 block 的数据,并且大小相同。所以缓冲页面看起来像这样:
.
.
.
|-------------|
| buffer |
|-------------|
| buffer |
|-------------|
| buffer |
|-------------|
.
.
.
每个缓冲区中包含的 block 由缓冲区头 标识。你可以找到 buffer_head 的结构声明 here . b_bdev
和 b_blocknr
字段一起标识 block 设备上的 block 。请注意,每个缓冲区头都有一个指向同一缓冲区页内下一个缓冲区头的指针。 alloc_page_buffers
函数分配并初始化指定缓冲页的所有缓冲区的缓冲区头。 alloc_page_buffers
调用 set_bh_page
函数来初始化缓冲区头的两个特定字段,b_page
和 b_data
,这两个字段被描述通过代码中的注释:
struct page *b_page; /* the page this bh is mapped to */
char *b_data; /* pointer to data within the page */
如您所见,它“将缓冲区链接到它的页面”。
关于memory-management - set_bh_page 对页面缓存中给定的缓冲区头到底做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49507256/
我有一个关于 JavaScript 语法的问题。实际上,我在自学 MEAN 堆栈教程时想出了编码(https://thinkster.io/mean-stack-tutorial#adding-aut
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我已经编写了读取开关状态的代码,如果按 3 次 # 则退出。 void allkeypadTest(void) { static uint8_t modeKeyCount=0; do
因此,对于上周我必须做的作业,我必须使用 4 个 do-while 循环和 if 语句在 Java 中制作一个猜谜游戏。我无法成功完成它,类(class)已经继续,没有为我提供任何帮助。如果有人可以查
int i=1,j=0,n=10,k; do{ j+=i; i<<1; printf("%d\n",i); // printf("%d\n",12<<1); }while
此代码用于基本杂货计算器的按钮。当我按下按钮时,一个输入对话框会显示您输入商品价格的位置。我遇到的问题是我无法弄清楚如何获得 do ... while 循环以使输入对话框在输入后弹出。 我希望它始终恢
当我在循环中修改字符串或另一个变量时,它的条件是否每次都重新计算?或者在循环开始前一次 std::string a("aa"); do { a = "aaaa"; } while(a.size<10)
我刚刚写了这个,但我找不到问题。我使用代码块并编写了这个问题 error: expected 'while' before '{' token === Build finished: 1 errors
do { printf("Enter number (0-6): ", ""); scanf("%d", &Num); }while(Num >= 0 && Num 表示“超过”,<表
我有一个包含 10 个项目的 vector (为简单起见,所有项目都属于同一类,称其为“a”)。我想要做的是检查“A”不是 a) 隐藏墙壁或 b) 隐藏另一个“A”。我有一个碰撞函数可以做到这一点。
嗨,这是我的第二个问题。我有下表 |-----|-------|------|------| |._id.|..INFO.|.DONE.|.LAST.| |..1..|...A...|...N..|.
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicates: Why are there sometimes meaningless do/while and if/e
来自 wikibook在 F# 上有一小部分它说: What does let! do?# let! runs an async object on its own thread, then it i
我在 Real World Haskell 书中遇到了以下函数: namesMatching pat | not (isPattern pat) = do exists do
我有一个类似于下面的用例,我创建了多个图并使用 gridExtra 将它们排列到一些页面布局中,最后使用 ggsave 将其保存为 PDF : p1 % mutate(label2
当我使用具有 for 循环的嵌套 let 语句时,如果没有 (do (html5 ..)),我将无法运行内部 [:tr]。 (defpartial column-settings-layout [&
执行 vagrant up 时出现此错误: anr@anr-Lenovo-G505s ~ $ vagrant up Bringing machine 'default' up with 'virtua
# ################################################# # Subroutine to add data to the table Blas
我想创建一个检查特定日期格式的读取主机。此外,目标是检查用户输入是否正确,如果不正确,则提示应再次弹出。 当我刚接触编程时,发现了这段代码,这似乎很合适。我仍然在努力“直到” do {
我关注这个tutorial在谷歌云机器学习引擎上进行培训。我一步一步地跟着它,但是在将 ml 作业提交到云时我遇到了错误。我运行了这个命令。 sam@sam-VirtualBox:~/models/r
我是一名优秀的程序员,十分优秀!