linux 一些機制 (三)

2021-05-26 05:51:09 字數 3258 閱讀 1755

目錄 一.

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