code在c语言中的作用,请解释一下这段C代码的作用(Please explain what this piece of C code does)...

请解释一下这段C代码的作用(Please explain what this piece of C code does)

有人可以解释这段代码是做什么的?

pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1);

/* offset for mmap() must be page aligned */

我知道在这里sysconf返回页面大小,它可以假设它是4096,但在那之后我不能理解逻辑。 提前致谢。

Can someone explain what is this piece of code do?

pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1);

/* offset for mmap() must be page aligned */

I understand that here sysconf returns the page size, which lets assume that it is 4096, but after that I am not able to understand the logic. Thanks in advance.

原文:https://stackoverflow.com/questions/5074981

更新时间:2020-01-12 03:55

最满意答案

假设页面大小是2的幂,则表达式将返回offset % _SC_PAGE_SIZE ; 所以如果偏移量是5000并且页面大小是4096,它将返回4。

更新:我错了,看到下面的评论。 OP所要求的上下文也是在操作系统中虚拟地址到物理地址转换的。 上面的表达式给出了虚拟页面地址,该地址被翻译成物理页面地址。 翻译后,寻址的字节在page_address +(偏移量%_SC_PAGE_SIZE)处找到。

assuming page size is a power of 2, the expression will return offset % _SC_PAGE_SIZE; so if offset is 5000 and page size is 4096 it will return 4.

update: i was wrong, see comments below. also the context as requested by OP is of virtual address to physical address translation in an operating system. the expression above gives the virtual page address, which is translated into a physical page address. after translation the byte being addressed is found at page_address + (offset % _SC_PAGE_SIZE).

2011-02-22

相关问答

(let ((piece-array (make-array '(2 7 64) :initial-element 0)))

(dolist (color `(,white ,black))

(dolist (piece `(,pawn ,knight ,bishop ,rook ,queen ,king))

(loop for cord below 64

do (setf (aref piece-array color piece cord)

...

通常,for循环具有以下结构: for (part1; part2; part3) {

....

}

第1部分是在循环开始之前执行一次的语句。 第2部分是您在每次迭代时检查的条件。 第3部分是在每次迭代结束时执行的语句。 那么,第2部分是x%i ? ++i : ++k, i

...

在以下功能中: int GetPositiveInt(void)

{

int n;

do

{

printf("Enter a positive number : ");

scanf("%d",&n);

}while(n<=0);

}

该函数应return一个int值,而没有return语句。 您可能想要返回n的值。 这可以通过添加合适的return语句来实现: return n;

喜欢这个: int GetPositiveInt(void)

{

int

...

t = strstr(STREAM,"vertices");

t将指向STREAM内的子串"vertices"的位置。 &t[0]是"vertices"第一个字符的地址。 相当于t本身。 这同样适用于&STREAM[0] ,它是STREAM的第一个字符的地址。 减去它们可以得到t的起始索引。 所以你的朋友想要从STREAM读取, 在 t 之前开始十个字符。 所有这一切都通过一个简单的t - 10更清楚地表达出来。 t = strstr(STREAM,"vertices");

t will po

...

json_result是一个指针,可能是来自外部的参数。 使用*取消引用它并更改它指向的值。 这是提供函数结果的非常标准的方法。 调用者传递一个指向其变量的指针,并且被调用者执行此代码所做的操作:取消引用传递的指针并更改它指向的值,从而更改调用者的变量。 json_result is a pointer, probably a parameter from outside. Using * dereferences it and changes the value it points to. Th

...

假设页面大小是2的幂,则表达式将返回offset % _SC_PAGE_SIZE ; 所以如果偏移量是5000并且页面大小是4096,它将返回4。 更新:我错了,看到下面的评论。 OP所要求的上下文也是在操作系统中虚拟地址到物理地址转换的。 上面的表达式给出了虚拟页面地址,该地址被翻译成物理页面地址。 翻译后,寻址的字节在page_address +(偏移量%_SC_PAGE_SIZE)处找到。 assuming page size is a power of 2, the expression

...

无是空指针。 这很清楚。 但空指针也有类型。 NoneHelper是一个辅助类,它没有其他功能,只是使其类型为唯一。 它是一个指向成员的指针,因为这种指针具有有限的转换。 特别是,你不能不小心将一个指向对象的指针转换为指向成员函数的指针。 None is a null pointer. That's quite clear. But null pointers have types, too. NoneHelper is a helper class which has no other func

...

对于双指针,您必须为第一维和第二维分配内存。 对于第二级而不是为每个维度分配内存,他一次性分配内存 MatrixBuffers[0] = new double[header.img* 12];

在for循环中,他们移动地址并为每个索引分配相同的地址。 相反,他也可以在for循环中执行此操作,并在for循环上方注释该行 MatrixBuffers[i] = new double[header.img];

For a double pointer you have to allocate mem

...

如您所述, <

data[1] = 0x48; // 0x48 = 72 = 0100 1000 in binary

data[2] = 0xD2; // 0xD2 = 210 = 1101 0010 in binary

data[3] = 0x08; /

...

该函数正在获取数据的“原始”缓冲区,以及该行: usbRequest_t *rq = (void *)data;

只是创建一个指向该缓冲区的指针,以使用usbRequest_t结构指定的数据布局来访问它。 这个操作绝对没什么代价 - 编译器甚至可能不会在优化的构建中实际创建新的指针变量。 另一方面,可能存在可移植性问题,但这对您的特定应用程序可能并不重要。 The function is getting a 'raw' buffer of data, and the line: usbRe

...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值