linux va 2 pa walk through

linux-3.0.35

drivers/staging/comedi/drivers.c

x86

static inline unsigned long uvirt_to_kva(pgd_t *pgd, unsigned long adr)
{
        unsigned long ret = 0UL;
        pmd_t *pmd;
        pte_t *ptep, pte;
        pud_t *pud;

        if (!pgd_none(*pgd)) {
                pud = pud_offset(pgd, adr);
                pmd = pmd_offset(pud, adr);
                if (!pmd_none(*pmd)) {
                        ptep = pte_offset_kernel(pmd, adr);
                        pte = *ptep;
                        if (pte_present(pte)) {
                                ret = (unsigned long)
                                    page_address(pte_page(pte));
                                ret |= (adr & (PAGE_SIZE - 1));
                        }
                }
        }
        return ret;
}

static inline unsigned long kvirt_to_kva(unsigned long adr)
{
        unsigned long va, kva;

        va = adr;
        kva = uvirt_to_kva(pgd_offset_k(va), va);

        return kva;
}

drivers/staging/tidspbriage/core/tiomap3430.c

arm


/*
 *  ======== user_va2_pa ========
 *  Purpose:
 *      This function walks through the page tables to convert a userland
 *      virtual address to physical address
 */
static u32 user_va2_pa(struct mm_struct *mm, u32 address)
{
        pgd_t *pgd;
        pmd_t *pmd;
        pte_t *ptep, pte;

        pgd = pgd_offset(mm, address);
        if (!(pgd_none(*pgd) || pgd_bad(*pgd))) {
                pmd = pmd_offset(pgd, address);
                if (!(pmd_none(*pmd) || pmd_bad(*pmd))) {
                        ptep = pte_offset_map(pmd, address);
                        if (ptep) {
                                pte = *ptep;
                                if (pte_present(pte))
                                        return pte & PAGE_MASK;
                        }
                }
        }

        return 0;
}


pandaboard AOSP kernel 3.0.31

drivers/video/omap2/dsscomp/device.c

arm

static u32 hwc_virt_to_phys(u32 arg)
{
        pmd_t *pmd;
        pte_t *ptep;

        pgd_t *pgd = pgd_offset(current->mm, arg);
        if (pgd_none(*pgd) || pgd_bad(*pgd))
                return 0;

        pmd = pmd_offset(pgd, arg);
        if (pmd_none(*pmd) || pmd_bad(*pmd))
                return 0;

        ptep = pte_offset_map(pmd, arg);
        if (ptep && pte_present(*ptep))
                return (PAGE_MASK & *ptep) | (~PAGE_MASK & arg);

        return 0;
}




在MATLAB中,"pava"通常指的是partial least squares (PLS)分析的一种优化版本,全称Partial Least Squares - Variable Selection Algorithm,用于变量选择下的PLS建模。Pava算法是一种迭代过程,它结合了PLS方法和变量选择技术,如LASSO(Least Absolute Shrinkage and Selection Operator)。 以下是使用MATLAB内置函数`plsr`和`lassoPath`来实现Pava的基本步骤: 1. 导入数据集:首先加载需要分析的数据集,例如 `data = readtable('your_data_file.csv')`。 2. 定义模型:`[X, Y] = mat2cell(data(:, 1:end-1), ones(1, nFeatures), size(data, 1))`,将自变量和因变量分别分割出来,其中`nFeatures`是自变量的数量。 3. 初始化:`lambda = logspace(-5, 0, 50);` 创建一个λ值向量,λ是正则化参数。 4. PLS回归:`[plsModel, ~, Xhat, yhat, stats] = lassoPath(X, Y, 'Lambda', lambda)`,这里`lассoPath`会返回PLS模型、截断点信息、预测值以及统计信息。 5. Pava选择:从`stats`结构中获取重要的λ值及其对应的特征索引,然后选择合适的λ值来得到变量选择后的模型。 ```matlab [lambdaOptimal, idxSelected] = pava(stats); selectedVariables = data.Properties.VariableNames(idxSelected); ``` 6. 使用优化后的λ值重新构建PLS模型:`[plsModelOptimal, XhatOptimal, yhatOptimal] = plsr(X(:, idxSelected), Y, 'CrossVal', 'on', 'CVPartition', cvpartition(size(data, 1)), 'PredictorSelection', 'lasso', 'Lambda', lambdaOptimal)` 这里使用了优化过的λ值来筛选变量并重新训练模型。 请注意,以上代码仅为示例,实际使用时可能需要根据你的数据和需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值