首页 > 编程知识 正文

python的eval函数是什么意思,linux ls命令详解

时间:2023-05-05 14:32:51 阅读:174920 作者:1368

已尝试阅读内核模块的实现。 然后,用这个代码绊倒了。

无符号长整型addr=(无符号长整型) buf;

if (! is_aligned(addr,1 )9) }

DM crit (@ % sin % sisnotsector-aligned.I/obuffermustbesector-aligned.',name,caller );

错误(;

}

IS_ALIGNED宏在内核源代码中的定义如下:

#defineis_aligned(x,a ) ) (x ) ) (typeof(x ) ) a(-1 ) ) (=0) )

我知道数据必须与数据类型的大小对齐才能正常工作,但我还不知道代码的作用。

将1向左移动9,减去1得到111111111。 然后,111111111用x进行逐位运算。

为什么这个代码有效? 如何检查字节对齐?

在系统编程中,通常需要将内存地址对齐一定数量的字节,即一些最低有效位为零。

基本上, is_aligned(addr,1 )检查addr是否位于512字节(2 ^ 9)的边界上(低位9位为零)。 清除闪存位置的一般要求。 由于闪存被划分为较大的块,因此必须将其擦除或写入单个单元。

我遇到了这个的另一个APP。 使用的是具有模数功能的DMA控制器。 基本上意味着只能更改地址的最后几个数字(在本例中为目标地址)。 这有助于避免在内存使用DMA控制器时发生错误。 问题,首先我忘记告诉编译器要使DMA目标缓冲区和模值对齐。 这造成了一个令人难以置信的有趣错误(与使用DMA控制器覆盖无关的随机变量有时是. )

“宏代码是如何工作的? 按一下「」。 从以零结束的数字中减去1,可以得到以零结束的数字。 例如0b00010000-0b1=0b00001111。 这是一种从整数个所需的对齐字节创建二进制掩码的方法。 我们感兴趣的零值校验比特中只包含一个这个掩码。 对地址和带有最低位1的掩码的地址进行与运算后,只有最低位的9位(在这种情况下)为零时才能得到0。

'为什么需要对准?' :这归结于闪存的内部结构。 擦除和写入闪存比读出闪存简单得多,通常需要向存储单元提供高于逻辑电平的电压。 以1字节的粒度实现写入和擦除所需的电路浪费了很少使用的硅空间。 基本上,闪存芯片的设计和工程中的其他任何东西一样,都是统计和权衡的博弈,统计数据的计算结果可以使组的写入和擦除获得最大的利益。

不收费。 当你阅读驱动程序和内核代码时,你会看到很多这样的事情。 熟悉本文的内容,或者至少保留下来作为参考可能会有帮助。 https://graphics.Stanford.edu/~ Sean der/bit hacks.html

是的,内核模块用于创建硬盘回写缓存。 因此,该APP应用程序使用闪存。 我知道必须在两次写入之间清除闪光灯。 可以详细说明一下为什么需要保证最后几个人为零吗?

很抱歉,但是我知道为什么存储器地址的最后九个条目必须为零,以便存储器地址与512字节的边界对齐。 你知道块或页面大小为512字节吗?

错误消息中使用的术语“行业定位”。 我一直忘记了块、扇区和页面之间定义的区别。 我刚搜索过,页面是最小的WRITE单元。 扇区或块是最小的ERASE单位。

明白了。 非常感谢

ah,请参阅上面的编辑注释。

@ user6337看了补充回答。 我链接的文章应该很有用。

感谢您提供其他信息和链接

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。