<commit_before>udmabuf(User space mappable DMA Buffer)
=======================================


# はじめに


## udmabufとは


udmabuf はLinux のカーネル空間に連続したメモリ領域をDMAバッファとして確保し、ユーザー空間からアクセス可能にするためのデバイスドライバです。主にUIO(User space I/O)を使ってユーザー空間でデバイスドライバを動かす場合のDMAバッファを提供します。

ユーザー空間でudmabufで確保したDMAバッファを利用する際は、デバイスファイル(/dev/udmabuf0など)をopen()して、mmap()でユーザー空間にマッピングするか、read()またはwrite()で行います。

openする際にO_SYNCフラグをセットすることによりCPUキャッシュを無効にすることが出来ます。

/sys/class/udmabuf/udmabuf0/phys_addr を読むことにより、DMAバッファの物理空間上のアドレスを知ることが出来ます。

udmabufのDMAバッファの大きさやデバイスのマイナー番号は、デバイスドライバのロード時(insmodによるロードなど)に指定できます。またプラットフォームによってはデバイスツリーに記述しておくこともできます。


## 構成



![図1 構成](./udmabuf1.jpg "図1 構成")

図1 構成

<br />




## 対応プラットフォーム


* OS : Linux Kernel Version 3.6 - 3.8 (私が動作を確認したのは 3.8です).

* CPU: ARM Cortex-A9 (ZYNQ)



# 使い方


## コンパイル


次のようなMakefileを用意しています。


```Makefile:Makefile
obj-m : udmabuf.o
all:
	make -C /usr/src/kernel M=$(PWD) modules
clean:
	make -C /usr/src/kernel M=$(PWD) clean<commit_msg>Readme.md を若干修正.<commit_after>udmabuf(User space mappable DMA Buffer)
=======================================


# はじめに


## udmabufとは


udmabuf はLinux のカーネル空間に連続したメモリ領域をDMAバッファとして確保し、ユーザー空間からアクセス可能にするためのデバイスドライバです。主にUIO(User space I/O)を使ってユーザー空間でデバイスドライバを動かす場合のDMAバッファを提供します。

ユーザー空間でudmabufで確保したDMAバッファを利用する際は、デバイスファイル(/dev/udmabuf0など)をopen()して、mmap()でユーザー空間にマッピングするか、read()またはwrite()で行います。

openする際にO_SYNCフラグをセットすることによりCPUキャッシュを無効にすることが出来ます。また、CPUキャッシュを有効にした状態で、CPUキャッシュのフラッシュとインヴァリディエートを行うことが出来ます。

/sys/class/udmabuf/udmabuf0/phys_addr を読むことにより、DMAバッファの物理空間上のアドレスを知ることが出来ます。

udmabufのDMAバッファの大きさやデバイスのマイナー番号は、デバイスドライバのロード時(insmodによるロードなど)に指定できます。またプラットフォームによってはデバイスツリーに記述しておくこともできます。


## 構成



![図1 構成](./udmabuf1.jpg "図1 構成")

図1 構成

<br />




## 対応プラットフォーム


* OS : Linux Kernel Version 3.6 - 3.8, 3.18(私が動作を確認したのは3.18です).

* CPU: ARM Cortex-A9 (ZYNQ)



# 使い方


## コンパイル


次のようなMakefileを用意しています。


```Makefile:Makefile
obj-m : udmabuf.o
all:
	make -C /usr/src/kernel M=$(PWD) modules
clean:
	make -C /usr/src/kernel M=$(PWD) clean
{'fraction_non_alphanumeric': 0.14456035767511177, 'fraction_numerical': 0.014903129657228018, 'mean_word_length': 6.571428571428571, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4751881', 'n_tokens_mistral': 1431, 'n_tokens_neox': 1335, 'n_words': 111}