硬是在動態對映或者靜態對映後,只能讀不能寫,逼著我對ioremap刨根問底
1、\arch\alpha\include\asm\io.h
static inline void __iomem *ioremap(unsigned long port, unsigned long size)
尋找io_concat在同一檔案中
#define io_concat(a,b) _io_concat(a,b)
#define _io_concat(a,b) a ## _ ## b
尋找__io_prefix在同一檔案
#define __io_prefix generic
由以上**得出有generic_ioremap(unsigned long port, unsigned long size)函式存在,尋找該函式在同一檔案中
static inline void __iomem *generic_ioremap(unsigned long a, unsigned long s)
尋找alpha_mv結構體中的mv_ioremap()函式
arch\alpha\kernel\setup.c中如下
struct alpha_machine_vector alpha_mv;
查詢結構體定義alpha_machine_vector到\arch\alpha\include\asm\machvec.h中
struct alpha_machine_vector
cia;
struct t2;
struct sio;
} sys;
};
碼片中紅色部分函式,結構以為沒了下文
但是查詢mv_ioremap到了arch\alpha\kernel\machvec_impl.h中
#define io_lite(up,low) \
.hae_register = (unsigned long *) cat(up,_hae_address), \
.iack_sc = cat(up,_iack_sc), \
.mv_ioread8 = cat(low,_ioread8), \
.mv_ioread16 = cat(low,_ioread16), \
.mv_ioread32 = cat(low,_ioread32), \
.mv_iowrite8 = cat(low,_iowrite8), \
.mv_iowrite16 = cat(low,_iowrite16), \
.mv_iowrite32 = cat(low,_iowrite32), \
.mv_readb = cat(low,_readb), \
.mv_readw = cat(low,_readw), \
.mv_readl = cat(low,_readl), \
.mv_readq = cat(low,_readq), \
.mv_writeb = cat(low,_writeb), \
.mv_writew = cat(low,_writew), \
.mv_writel = cat(low,_writel), \
.mv_writeq = cat(low,_writeq), \
.mv_ioportmap = cat(low,_ioportmap), \
.mv_ioremap = cat(low,_ioremap), \
.mv_iounmap = cat(low,_iounmap), \
.mv_is_ioaddr = cat(low,_is_ioaddr), \
.mv_is_mmio = cat(low,_is_mmio) \
#define io(up,low) \
io_lite(up,low), \
.pci_ops = &cat(low,_pci_ops), \
.mv_pci_tbi = cat(low,_pci_tbi)
#define do_apecs_io io(apecs,apecs)
#define do_cia_io io(cia,cia)
#define do_irongate_io io(irongate,irongate)
#define do_lca_io io(lca,lca)
#define do_marvel_io io(marvel,marvel)
#define do_mcpcia_io io(mcpcia,mcpcia)
#define do_polaris_io io(polaris,polaris)
#define do_t2_io io(t2,t2)
#define do_tsunami_io io(tsunami,tsunami)
#define do_titan_io io(titan,titan)
#define do_wildfire_io io(wildfire,wildfire)
#define do_pyxis_io io_lite(cia,cia_bwx), \
.pci_ops = &cia_pci_ops, \
.mv_pci_tbi = cia_pci_tbi
追溯cat(low,_ioremap)在同一檔案
#define cat1(x,y) x##y
#define cat(x,y) cat1(x,y)
接下來的有點難理解,舉個例子如下
#define io(up,low) \
io_lite(up,low), \
#define do_apecs_io io(apecs,apecs)
以上兩條語句是巢狀的巨集,所以到最後就是呼叫apecs
_ioremap函式,
尋找apecs_ioremap函式\arch\alpha\include\asm\core_apecs.h中
__extern_inline void __iomem *apecs_ioremap(unsigned long addr,
unsigned long size)
而
#define __extern_inline inline
#define apecs_dense_mem (ident_addr + 0x300000000ul)
其中
#ifdef use_48_bit_kseg
#define ident_addr 0xffff800000000000ul
#else
#define ident_addr 0xfffffc0000000000ul
#endif
但是有兩個問題待解決
第乙個:return (void __iomem *)(addr + apecs_dense_mem);具體是什麼意思,為什麼這樣取值?
第二個:__extern_inline void __iomem *apecs_ioremap(unsigned long addr, unsigned long size)只是其中乙個,
究竟是去哪個函式?
刨根問底ajax原理與封裝
說起ajax,大家都不陌生。但是由於目前很多框架或者庫等都對網路請求做了封裝,導致了很多初學者只知其然而不知其所以然。所以今天我們就詳細了解一下ajax的實現原理和封裝ajax的關鍵步驟。ajax的核心是xmlhttprequest物件。首先我們先建立乙個xmlhttprequest物件var xh...
刨根問底ajax原理與封裝
摘要 說起ajax,大家都不陌生。但是由於目前很多框架或者庫等都對網路請求做了封裝,導致了很多初學者只知其然而不知其所以然。所以今天我們就詳細了解一下ajax的實現原理和封裝ajax的關鍵步驟。ajax的核心是xmlhttprequest物件。說起ajax,大家都不陌生。但是由於目前很多框架或者庫等...
刨根問底 內頁不收錄原因何在
內頁不被收錄一直是困擾站長的一大難題,一般收錄率達到70 以上算是優質站點,程式設計客棧大多數 收錄率維持在50 左右,如何提高內頁收錄率成為關鍵性難題。在此與各位 內頁不收錄的幾大原因以及解決辦法,不足之處還望高人拍磚。一,內頁權重低 內頁權重未達到搜尋引擎的索引標準,自然會被判定為無意義頁面而放...