Memory barrier include linuxkernel h void barrier void
Memory barrier • #include <linux/kernel. h> void barrier (void); /宣告一個 memory barrier / • #include <asm/system. h> void rmb (void); /保證在barrier前的read動作都完成/ void wmb (void); /保證在barrier前的write動作都完成/ void mb (void); P. S memory barrier會影響效率, 真正需要才使用 4
Memory barrier的用法 • writel (dev->registers. addr, 確認所有動作 皆完成 io_destination_address); writel (dev->registers. size, io_size); write memory barrier writel (dev->registers. operation, DEV_READ); wmb (); writel (dev->registers. control, DEV_GO); 5
使用I/O 埠(1/3) • 驅動程式用I/O埠前, 必須先配置他們, 才可讀or寫埠 • <asm/io. h>定義用來存取I/O埠的內插函式 • #include <linux/ioport. h> int check_region(unsigned long start, unsigned long len); struct resource *request_region(unsigned long start, unsigned long len, char *name); void release_region(unsigned long start, unsigned long len); 6
使用I/O 埠(2/3) • For 1 byte 埠 unsigned inb(unsigned port); void outb(unsigned char byte, unsigned port); • For 16 bits埠 (word寬度) unsigned inw(unsigned port); void outw(unsigned short word, unsigned port); • For 32 bits埠 (longword寬度) unsigned inl(unsigned port); void outl(unsigned longword, unsigned port); 7
範例程式demo • 範例: ~/ldd 2/misc-progs/inp. c • 目的: 示範在user-space 讀出I/O port • Step 1: make all Step 2: cat /proc/ioports Step 3: 比較和我們在user-space讀出來的 資訊是否一樣 9
Kernel版本相容性 • Linux 2. 0 無硬體memory barrier , 但只要引入 sysdep. h, 將硬體屏障定義成跟軟體屏障一樣 • 只要引入sysdep. h, 就可在舊kernel上使用ioremap • Memory management的三個函式 check_mem_region() request_mem_region() release_mem_region() 13
- Slides: 13