カーネルモジュールで、メモリ空間をアクセスしてみる。
c言語で、モジュールの素になるファイルを作る。
$ nano my_ioremap.c
なかみ
#include <linux/module.h>
#include <linux/io.h>
#include <linux/types.h>
#include <linux/kernel.h>
#define DEVICE_BASE 0xF8000000
#define DEVICE_SIZE 0x1000
void __iomem *vaddr;
static int __init my_module_init(void) {
vaddr = ioremap(DEVICE_BASE, DEVICE_SIZE);
if (!vaddr) {
pr_err("ioremap failed\n");
return -ENOMEM;
}
/* レジスタへの書き込み */
iowrite32(0x12345678, vaddr);
/* レジスタからの読み込み */
u32 value = ioread32(vaddr);
pr_info("Read value: 0x%x\n", value);
return 0;
}
static void __exit my_module_exit(void) {
if (vaddr) {
iounmap(vaddr);
}
}
module_init(my_module_init);
module_exit(my_module_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Example module using ioremap");
MODULE_AUTHOR("Your Name");
Makefileを作る。
$ nano Makefile
なかみ
obj-m += my_ioremap.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
注意:ファイル名、最初は大文字。なかみのmakeの前は、タブ。
モジュールのビルド。
$ make
モジュールの挿入。
$ sudo insmod my_ioremap.ko
カーネルモジュールが正しく読み込まれているか確認。
$ lsmod | grep my_ioremap
モジュールの削除。
$ sudo rmmod my_ioremap
カーネルモジュールが正しく削除されているか確認。
$ lsmod | grep my_ioremap
makeでゴジャゴジャできたファイルたちを削除する。
$ make clean