Github: __read_once_size_nocheck
Email: BuddyZhang1 buddy.zhang@aliyun.com
Architecture: ARMv7 Cortex A9-MP
目录
源码分析
__read_once_size_nocheck() 函数用于从内存中读取变量的值。参数 p 是一个 volatile
变量,其为需要从内存中读取的变量;参数 res 用于缓存从内存中读取的值;size 为参数
p 的大小。函数在定义的时候,使用了 GCC 的内建参数 __no_kasan_or_inline, 其定义
与 CONFIG_KASAN 有关,如果该宏定义,那么函数的定义为 __no_sanitize_address
和 notrace __maybe_unused;如果该宏未定义,则函数定义为 __always_inline。函数
通过对 size 进行分类处理,其中 1,2,4,8 字节的变量直接从内存中将数据拷贝到缓存中;
如果 size 为多个字节,那么使用 __builtin_memcpy() 函数从内存拷贝连续的数据到缓存,
并在拷贝前后添加内存屏障,确保数据确实从内存中读取。
实践
驱动源码
驱动安装
驱动的安装很简单,首先将驱动放到 drivers/BiscuitOS/ 目录下,命名为 atomic.c,
然后修改 Kconfig 文件,添加内容参考如下:
接着修改 Makefile,请参考如下修改:
驱动配置
驱动配置请参考下面文章中关于驱动配置一节。在配置中,勾选如下选项,如下:
具体过程请参考:
Linux 5.0 开发环境搭建 – 驱动配置
驱动编译
驱动编译也请参考下面文章关于驱动编译一节:
Linux 5.0 开发环境搭建 – 驱动编译
驱动运行
驱动的运行,请参考下面文章中关于驱动运行一节:
Linux 5.0 开发环境搭建 – 驱动运行
启动内核,并打印如下信息:
驱动分析
从内存中读取数据而不是从缓存或者寄存器中读取数据。
附录
BiscuitOS Home
BiscuitOS Driver
BiscuitOS Kernel Build
Linux Kernel
Bootlin: Elixir Cross Referencer
搭建高效的 Linux 开发环境
赞赏一下吧 🙂