目錄 一.
address_space
二.dup
系統呼叫 三.
proc
應用核心空間到使用者空間
__user
這個特性,即
__attribute__((noderef, address_space(1)))
,是用來修飾乙個變數的,這個變數必須是非解除參考(
__attribute__((noderef))——no dereference
)的,即這個變數位址必須是有效的,而且變數所在的位址空間必須是1(
__attribute__((address_space(1)))
),即使用者程式空間的。這裡
sparse
工具把程式空間分成了
3個部分,0表示
normal space
,即普通位址空間,對核心**來說,當然就是核心空間位址了。
1表示使用者位址空間,這個不用多講,還有乙個
2,表示是裝置位址對映空間,例如硬體裝置的暫存器在核心裡所對映的位址空間。
# define __kernel /* default address space */
根據定義,就是檢查是否處於核心空間。其為預設的位址空間,即
0,我想定義成
__attribute__((noderef, address_space(0)))
也是沒有問題的。
# define __user__attribute__((noderef, address_space(1)))
呼叫copy_to_user copy_from_user
需要新增
__user
的原因就是將使用者空間上的資料拷貝到核心空間上
# define __iomem__attribute__((noderef, address_space(2)))
寫過核心驅動的都一定用過
ioremap,
事實上也與裝置位址對映空間有關。
static inline void __iomem *ioremap(phys_addr_t offset, unsigned long size)
在進行對映時,就是將實體地址對應到
io記憶體位址,這樣就能直接操作
io記憶體位址,
從而操作對應的暫存器。 比如
__raw_writel,__raw_readl
就是將資料讀寫到對應的
io記憶體位址上,例如
static inline void __raw_writel(u32 b, volatile void __iomem *addr)
在簡略說說其他的定義
__safe
特性宣告該變數為安全變數,這是為了避免在核心函式未對傳入的引數進行校驗就使用的情況下,會導致編譯器對其報錯或輸出告警資訊。
通過該特性說明該變數不可能為空。
__force
特性宣告該變數是可以強制型別轉換的。
__nocast
宣告該變數引數型別與實際引數型別要一致才可以。
__acquires
為函式屬性定義的修飾,表示函式內,該引數的引用計數值從1變為
0。__releases
與__acquires
相反,這一對修飾符用於
sparse
在靜態**檢測時,檢查呼叫的次數和匹配請求,經常用於檢測
lock
的獲取和釋放。
__acquire
表示增加變數
x的計數,增加量為1。
__release
表示減少變數
x的計數,減少量為
1。這一對與上面的那一對是一樣,只是這一對用在函式的執行過程中,都用於檢查**中出現不平衡的狀況。
__cond_lock
用於表示條件鎖,當
c這個值不為
0時,計數值加
1,並返回1。
__chk_user_ptr
和__chk_io_ptr
在這裡只宣告函式,沒有函式體,目的就是在編譯過程中
sparse
能夠捕捉到編譯錯誤,檢查引數的型別。
在fcntl.c
中有dup2
,事實上,許多函式的系統呼叫都在
include/asm-generic/unistd.h
中有對應的編號
.dup2
用於檔案流的重定向操作,
syscall_define2(dup2, unsigned int, oldfd, unsigned int, newfd)
實際上呼叫的是
dup3,即
syscall_define3(dup3, unsigned int, oldfd, unsigned int, newfd, int, flags)
而sys_dup3
的主要操作就是根據
fdtable
將當前程序的所指向的
fdtable
進行expand
操作。對於檔案的結構不太清晰,待進一步的學習。
對於proc
檔案系統,一直沒有用到,寫驅動時用的都是
sys,前段時間看了
input
子系統下
proc
的建立,隨意記錄一些。 建立
proc
目錄,proc_mkdir
struct proc_dir_entry *proc_bus_input_dir;
proc_bus_input_dir=proc_mkdir
(」/bus/input」,null
); //
檔案操作方法為
null
建立proc
目錄下的檔案
proc_create
proc_create(「devices」,0,proc_bus_input_dir,&input_device_fileops);
//proc_bus_input_dir
為建立的檔案所在的目錄,「
device
」為proc
檔案名字,
input_device_fileops
為操作該檔案的相應方法。檔案相關的操作方法就不提了,具體的可以看
input
目錄下input.c檔案
刪除檔案和目錄
remove_proc_entry
(「device
」,proc_bus_input_dir);
remove_proc_entry(「bus/input」,null);
etcd 一些機制
checkquorum機制 每隔一段時間,leader節點會嘗試連線集群中的節點 傳送心跳 如果發現自己可以連線到的節點個數沒有超過半數,則主動切換成follower狀態。這樣在網路分割槽的情況下,舊的leader節點可以很快的知道自己已經過期了。prevote優化 當follower節點準備發起選...
java的一些快取機制
public static void main string args 結果 true integer1 integer2 integer3 integer4 這種快取行為不僅適用於integer物件。我們針對所有整數型別的類都有類似的快取機制。有 bytecache 用於快取 byte 物件 有 ...
一些linux命令
rpm ql mplayer cat n檢視軟體包資訊 另外補充下 root centos5h wc help 用法 wc 選項 檔案 print newline,word,and byte counts for each file,and a total line if more than one...