0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ArcaneLink-2

Last updated at Posted at 2024-11-16

カーネルモジュールで、メモリ空間をアクセスしてみる。

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?