刨根問底ioremap (一)

2021-06-22 09:37:30 字數 3853 閱讀 9191

硬是在動態對映或者靜態對映後,只能讀不能寫,逼著我對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 左右,如何提高內頁收錄率成為關鍵性難題。在此與各位 內頁不收錄的幾大原因以及解決辦法,不足之處還望高人拍磚。一,內頁權重低 內頁權重未達到搜尋引擎的索引標準,自然會被判定為無意義頁面而放...