python语句中eval是什么意思,关于Python中eval()函数的使用

  python语句中eval是什么意思,关于Python中eval()函数的使用

  试图读取内核模块的实现。然后,我被这个代码绊倒了。

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

  如果(!is_aligned(addr,1 )9) }

  DM crit(@ % sin % sisnotsector-aligned。I/obuffermustbesector对齐。姓名,来电者);

  错误(;

  }

  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位为零)。清除闪存位置的一般要求。由于闪存被分成大块,所以必须将其擦除或写入单个单元。

  我偶然发现了另一个应用程序。使用具有模拟-数字功能的DMA控制器。基本上,这意味着只能更改地址的最后几个数字(在本例中是目标地址)。这有助于避免在内存中使用DMA控制器时出现错误。首先,我忘记告诉编译器将DMA目标缓冲区与模块值对齐。这导致了一个令人难以置信的有趣错误(与DMA控制器覆盖无关的随机变量有时会。)

  “宏代码是如何工作的?单击" "。从以零结尾的数字中减去1,得到以零结尾的数字。比如0b 0010000-0b 00010000-0 B1=0b 00001111。这是一种从整数个所需的对齐字节创建二进制掩码的方法。我们感兴趣的零校验位中只有一个包含此掩码。在对地址和具有最低位1的掩码的地址执行AND操作之后,只有当最低位的9位(在这种情况下)为零时,才能获得0。

  为什么需要对齐?这就归结到闪存的内部结构了。擦除和写入闪存比读出闪存简单得多,并且通常需要向存储单元提供高于逻辑电平的电压。以1字节的粒度写入和擦除所需的电路几乎不浪费硅空间。基本上,闪存芯片的设计,就像工程中的其他事情一样,是一个统计和权衡的游戏。统计数据的计算结果可以使组的写入和擦除获得最大的收益。

  不收费。当你读驱动和内核代码的时候,你会看到很多这样的东西。熟悉这篇文章的内容可能会有帮助,或者至少留着做参考。https://graphics.Stanford.edu/~肖恩德/比特hacks.html

  是的,内核模块用于创建硬盘回写缓存。所以APP应用用的是闪存。我知道我必须在两次写入之间清除闪存。能不能详细解释一下为什么最后几个人需要保证为零?

  很抱歉,但我知道为什么内存地址的最后九个条目必须为零,这样内存地址才能与512字节的边界对齐。您知道块或页面大小是512字节吗?

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

  我明白了。谢谢您们。

  啊,请参考上面的编辑评论。

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

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

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: