比较有用的kernel小代码,备忘, 主要是地址转换的函数部分 z

【网络通信】【ZeorTier】基于 zerotier 使用 Linux Kernel 设置转发代理 本文记录基于 zerotier 使用 Linux Kernel 设置转发代理. 阅读详情

 


主要是 备忘地址转换的部分。

 

这个在编程的时候常用。 一定搞清楚他们之间的关系。

    struct page * buffer_page;
    unsigned long buffer_virt;
    buffer_virt = get_zeroed_page(GFP_ATOMIC))) {
    buffer_page = virt_to_page(buffer_virt);


    unsigned long get_zeroed_page(unsigned int gfp_mask)
{
    struct page * page;

    page = alloc_pages(gfp_mask, 0);
    if (page) {
        void *address = page_address(page);
        clear_page(address);
        return (unsigned long) address;
    }
    return 0;
}
/*
 * Common helper functions.
 */

unsigned long __get_free_pages(unsigned int gfp_mask, unsigned int order)
{
    struct page * page;

    page = alloc_pages(gfp_mask, order);
    if (!page)
        return 0;
    return (unsigned long) page_address(page);
}

#define TryLockPage(page)    test_and_set_bit(PG_locked, &(page)->flags)
#define PageChecked(page)    test_bit(PG_checked, &(page)->flags)
#define SetPageChecked(page)    set_bit(PG_checked, &(page)->flags)
#define PageLaunder(page)    test_bit(PG_launder, &(page)->flags)
#define SetPageLaunder(page)    set_bit(PG_launder, &(page)->flags)
#define ClearPageLaunder(page)    clear_bit(PG_launder, &(page)->flags)

//关于调用wait函数的代码

/*
 * Calling wait_on_buffer() for a zero-ref buffer is illegal, so we call into
 * __wait_on_buffer() just to trip a debug check. Because debug code in inline
 * functions is bloaty.
 */

static inline void wait_on_buffer(struct buffer_head *bh)
{
    might_sleep();
    if (buffer_locked(bh) || atomic_read(&bh->b_count) == 0)
        /* if a block is locked , it says kernel is transfering data into it
         * so we must wait for the bit has been cleared successfully
         * bob
         */

        __wait_on_buffer(bh);
}

/*
 * Note that the real wait_on_buffer() is an inline function that checks
 * that the buffer is locked before calling this, so that unnecessary disk
 * unplugging does not occur.
 */

void __wait_on_buffer(struct buffer_head * bh)
{
    struct task_struct *tsk = current;
    DECLARE_WAITQUEUE(wait, tsk);

    get_bh(bh);
    add_wait_queue(&bh->b_wait, &wait);
    
    /* in fact , here we use do {} while(condition) is better than for(;;)
     * because ,after "schedule()" ,maybe condition(buffer_locked()) has been applied
     * then the loop can directly break
     * --bob
     */

    do {
        run_task_queue(&tq_disk);
        set_task_state(tsk, TASK_UNINTERRUPTIBLE);
        if (!buffer_locked(bh))
            break;
        schedule();
    } while (buffer_locked(bh));
    
    tsk->state = TASK_RUNNING;
    remove_wait_queue(&bh->b_wait, &wait);
    put_bh(bh);
}



<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
aarch64寄存器详解:以RK3588为平台的手把手教程 深入剖析aarch64架构下的寄存器功能与使用技巧,结合RK3588平台进行实操演示,帮助开发者掌握底层调试与性能优化的关键要点。 阅读详情

相关推荐

Linux虚拟地址空间原理与实战解析

虚拟内存是现代操作系统的核心机制,通过地址空间虚拟化技术为每个进程提供独立的内存视图。其核心原理是MMU硬件配合多级页表实现虚拟地址到物理地址的转换,具有延迟分配、写时复制等重要特性。在Linux系统中,32位进程默认拥有4GB虚拟地址空间(用户态3GB/内核态1GB),而64位系统则采用更灵活的布局设计。这种机制不仅解决了物理内存不足的问题,还支撑了进程隔离、共享内存等关键功能。通过mmap系统调用可以实现高效的文件映射和进程间通信,而透明大页(THP)和内存压缩等技术则能显著提升内存访问性能。理解虚拟地

weixin_30904593的博客 530

[kernel 启动流程] (第六章)第一阶段之——打开MMU

零、说明本文是《[kernel 启动流程] (第一章)概述》的延伸, 阅读本文前建议先阅读《[kernel 启动流程] (第一章)概述》1、kernel启动流程第一阶段简单说明arch/arm/kernel/head.S kernel入口地址对应stext ENTRY(stext) 第一阶段要做的事情,也就是stext的实现内容设置为SVC模式,关闭所有中断 获取CPU ID,提取相应的proc

ooonebook的博客 7796

栈溢出漏洞原理与ret2text利用实战:从程序失控到控制流劫持

栈溢出是二进制安全领域最经典的漏洞模型,其原理源于程序在内存中对函数调用栈的管理缺陷。当程序向栈上的缓冲区写入超过其容量的数据时,多余数据会覆盖栈帧中的关键信息,尤其是函数的返回地址。这种内存破坏漏洞的核心技术价值在于实现了控制流劫持,即引导程序执行攻击者指定的代码路径,而非其原有逻辑。在应用场景上,栈溢出常出现在使用不安全函数(如gets、strcpy)的C/C++程序中,是CTF Pwn方向与真实世界二进制漏洞利用的入门基础。本文以ret2text技术为例,演示如何通过覆盖返回地址,跳转至程序代码段中已

weixin_30411239的博客 361

C#调用C++的DLL函数另一则(delegate) z

使用DLLImport进行导入函数的事. C#调用C++的函数其实不止这一种方法, 还有一种方法是用delegate申明函数委托进行调用,这种方法略显麻烦,但是可以进行回调并应用指针. 在C#中,首先先要定义一个类,用来把DLL中函数地址转换成委托: public class DLLWrapper { ///&lt;summary&gt; /// AP...

weixin_33881050的博客 258

【信息科学与工程学】【安全领域】第七十篇 负载均衡设备的主要算法01

每个服务器有一个对槽位的偏好排序, 调度器(表)需要为每个槽位分配一个服务器, 目标是整体上满足所有服务器的偏好(即均匀填充), 同时保持稳定性(变化小)。: 对于一个新到达的请求, 如果将其分配到当前有cj个请求(包括正在服务的)的服务器sj, 其期望等待时间为 (cj + 1) / μj。输入:服务器集群S={s1, s2, ..., sn}, 权重W={w1, w2, ..., wn}, 当前指针i。输出:选中的服务器sj。输入:服务器集群S, 各服务器当前活动连接数cj, 各服务器预设权重wj。

weixin_49199313的博客 524

WRF后处理避坑指南:从namelist配置到降水计算的全流程解析

本文提供了一份详尽的WRF模式后处理避坑指南,涵盖从理解wrfout文件结构、核心变量解析到累计降水计算与专业气象图绘制的全流程。重点解析了RAINC与RAINNC的正确处理方法,并分享了使用wrf-python库高效绘制位势高度叠加风场图、累计降水图等专业图表的实战技巧与代码,旨在帮助用户规避常见错误,提升后处理效率与图表质量。

weixin_29200485的博客 363

Candle 框架入门导读:在 Rust 中构建极简机器学习应用的第一步

Candle 是一个以性能与易用性为核心、采用极简设计理念的 Rust 机器学习框架,本文是官方 Candle 文档(`candle-book`)引言章节的完整导读。通过阅读本文,你将理解 Candle 的设计目标与特性全景,掌握从零创建项目、完成第一个张量运算与 MNIST Hello World 模型、按需启用 CUDA/Metal/MKL 后端,并借助 PyTorch 速查表快速迁移到 Ru

gitblog_00506的博客 698

STM32N6实战:FSBL引导XIP运行ThreadX与NetX Duo

在嵌入式系统开发中,程序的存储与执行方式直接影响启动速度和系统实时性。传统MCU常将代码拷贝到内存运行,而高主频处理器则可通过XIP(片外Flash原地执行)技术直接从外部存储取指,省去拷贝过程。但XIP的前提是外部存储器控制器需在上电后第一时间完成初始化,这正是FSBL(第一级引导程序)的核心职责。FSBL负责配置时钟与外部Flash,并将控制权移交给应用。而要让设备具备实时调度与网络能力,可搭配ThreadX实时内核和NetX Duo双协议栈,两者在CubeMX中原生集成,形成一套高性能MCU+外部存储

weixin_29191669的博客 319

linux内核下载地址,Linux Kernel最新版

Linux Kernel就如同它的字面意思:Linux内核,而Linux Kernel则是组成Linux操作系统的其中一部分。用户使用Linux Kernel来进行一些开发工作最后做出一款Linux的操作系统。需要的朋友欢迎在WWW.11684.COM 下载使用。linux kernel什么意思Linux Kernel和GNU/Linux。Linux kernel作为系统的最底层,是负责管理硬件、...

weixin_30114439的博客 1019

深入解析STM32F40x CAN控制器的配置与优化

本文深入解析STM32F40x CAN控制器的配置与优化,涵盖基础工作模式、波特率计算、筛选器配置及中断管理等关键技术。通过实战案例和代码示例,帮助开发者高效配置CAN通信,提升工业控制系统的稳定性和性能。

weixin_26834815的博客 225

避开这5个坑!用MATLAB做核密度估计时90%人会犯的错误

本文详细解析了使用MATLAB进行核密度估计时常见的5个高频错误,包括三维数据可视化、带宽参数优化、大数据量处理、核函数选择及版本兼容性问题。特别针对核密度估计中的关键参数带宽(bandwidth)提供了数据驱动的优化策略,帮助用户提升分析精度与效率。

jenkins8butler的博客 277

Android打印堆栈

Android打印堆栈java打印堆栈方法一:异常对象打印堆栈方法二:Log打印获取异常的堆栈并打印C++\C打印堆栈方法一:linux函数方法二:使用Android工具方法kernel打印堆栈注意 java打印堆栈 方法一:异常对象打印堆栈 Exception e = new Exception("this is a log"); e.printStackTrace(); 方法二:Log打印获...

卓越之路 5778

FreeSurfer安装避坑指南:从邮箱选择到环境变量设置的全流程解析

本文详细解析了在Windows系统上安装和配置FreeSurfer神经影像分析工具的全流程避坑指南。重点涵盖WSL2深度配置、软件版本选择、许可邮箱获取策略、环境变量模块化设置以及图形界面调试等关键步骤,帮助用户高效构建稳定的分析环境,避免常见安装陷阱。

weixin_29243063的博客 231

linux cp -r6,[kernel 启动流程] (第六章)第一阶段之——打开MMU【转】

[kernel 启动流程]系列:[kernel 启动流程] 前篇——vmlinux.lds分析[kernel 启动流程] (第一章)概述[kernel 启动流程] (第二章)第一阶段之——设置SVC、关闭中断[kernel 启动流程] (第三章)第一阶段之——proc info的获取[kernel 启动流程] (第四章)第一阶段之——dtb的验证[kernel 启动流程] (第五章)第一阶段之——...

weixin_39822423的博客 317

飞牛fnNAS搭建个人小账本

本文介绍了如何在飞牛NAS上部署ezBookkeeping个人记账应用。该开源工具支持多平台使用,具备双因素认证、多级分类等功能。文章详细讲解了Docker激活、镜像下载、容器部署等步骤,并展示了账户管理、交易记录等基础操作。同时指导用户通过ZeroTier实现远程访问,方便随时随地使用个人记账系统。该方案既保障了数据隐私,又提供了专业记账功能,适合对财务隐私敏感的用户。

dgnankai的专栏 782

Cyclone DDS背景技术

DDSI标准与DDS 1.2和1.4标准密切相关,DDSI中的实体与DCPS中的实体之间有明确的对应关系。但是,这种对应关系不是一一对应的。 此处,仅仅对DDSI规范的概念进行描述,暂不涉及Eclipse Cyclone DDS实现的细节。DDSI规范的概念将帮助对互操作性interoperability感兴趣的技术人员了解规范的外延边界和Eclipse Cyclone DDS实现的开始。

pony12的专栏 948

Kubernetes Service 数据包地址转换过程(iptables)

ClusterIP 类型的 Service 提供一个集群内部的访问点,它的 IP 地址是一个仅在集群内部可路由的虚拟 IP 地址,映射到后端所有处于就绪状态的 Pod。NodePort 类型的 Service 在所有的节点上暴露一个固定端口(30000~32767),外部流量可以通过这个端口到达集群内部的 Pod。负责维护节点上的网络规则,使流经 ClusterIP 地址的流量能够正确路由到后端可用的 Pod。进一步查看,可以看到 DNAT 字样,说明 TCP 数据包的目的 IP 地址将发生转换。

weixin_53111196的博客 949

GEE:计算非水体概率影像(水体淹没次数)

本文记录了在GEE平台上使用哨兵数据计算沿海地区非水体概率图像的计算方法和代码。基于像素,概率范围0-100。首先使用哨兵数据(s2)和大津算法(OTSU)计算的水体指数阈值来提取水体,然后计算研究区非水体像素在时间段内出现的概率。

养乐多的博客 2141

ptx 简介 01,CUDA ptx 基础

略。。。

eloudy的专栏 936

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Linux网络】深入理解网络层IP协议:从公网路由到IP分片与组装

当你在浏览器输入www.baidu.com并按下回车时,数据是如何从你的电脑穿越层层网络到达百度服务器的?为什么不同局域网内的主机可以使用相同的192.168.1.x地址却不会冲突?为什么大文件传输时不会因为数据包过大而被丢弃?这些问题的答案都藏在 TCP/IP 协议栈的网络层中。网络层的核心协议 ——IP 协议,负责为每一个数据包找到从源主机到目的主机的最佳路径,解决 “去哪里"和"怎么走” 的问题。本文将从公网的本质讲起,深入解析路由转发的核心逻辑,最后拆解 IP 分片与组装的底层实现,带你彻底搞懂网络

会当凌绝顶,一览众山小 1380

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

android 打印java堆栈,Android打印堆栈

java打印堆栈方法一:异常对象打印堆栈Exception e = new Exception("this is a log");e.printStackTrace();方法二:Log打印获取异常的堆栈并打印Log.e(“dump_test”,Log.getStackTraceString(new Throwable()));C++\C打印堆栈方法一:linux函数函数介绍头文件:java#inc...

weixin_29191761的博客 861

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

信号1.0,信号概念、signal()处理、前后台进程、闹钟设置、初识信号三张表。

信号机制与进程管理摘要 本文系统介绍了Linux系统中的信号机制与进程管理: 信号基础: 信号是进程间的异步通知机制,类型包括普通信号(1-31)、预留信号(32-33)和实时信号(34-64) 三种处理方式:默认动作、自定义处理和忽略信号 进程管理: 区分前台进程(唯一,可接收键盘输入)和后台进程(可多个) 使用fg/bg命令进行前后台切换,Ctrl+z暂停前台进程 关键接口: signal()/sigaction()设置信号处理函数 kill()/raise()发送信号,abort()终止进程 alar

深入探究的博客 438

虚拟存储器深度实践:从课后习题到国产化部署与故障排查

虚拟存储器是现代操作系统的核心机制,它通过分页、分段等技术为每个进程提供独立的虚拟地址空间,并利用页面置换算法在物理内存与磁盘间高效调度数据。这一技术不仅支撑着程序的正常运行,更是系统性能优化的关键,其价值体现在从防止内存抖动的理论模型到解决实际部署难题的广泛场景中。例如,在信创国产化背景下,将应用迁移至麒麟、欧拉等ARM架构操作系统时,常因可执行文件格式不匹配而报错“指定的可执行文件不是有效应用程序”,这直接关联到虚拟存储器的前端——加载器对文件头的解析。同时,在Vue2等项目部署中,Node.js构建阶

weixin_34203832的博客 556

Linux进程地址空间与虚拟内存管理详解

虚拟内存是现代操作系统的核心技术,它通过地址转换机制为每个进程提供独立的地址空间视图。CPU中的MMU单元配合页表实现虚拟地址到物理地址的动态映射,TLB缓存则优化了这一转换过程。这种设计不仅提高了内存使用效率,还实现了进程隔离和安全保护。在Linux系统中,典型进程地址空间包含文本段、数据段、堆、栈等关键区域,各自具有特定的访问权限和增长方向。通过mmap、写时复制等高级技术,系统能更高效地管理内存资源。理解这些原理对调试内存错误、优化程序性能至关重要,特别是在容器化和云原生环境中。

weixin_33979203的博客 403

使能MMU

1、kernel启动流程第一阶段简单说明 arch/arm/kernel/head.S kernel入口地址对应stext ENTRY(stext)1 第一阶段要做的事情,也就是stext的实现内容 设置为SVC模式,关闭所有中断获取CPU ID,提取相应的proc info验证tags或者dtb创建临时内核页表的页表项配置r13寄存器,也就是设置打开MMU之后要跳转

来一杯奶茶 1675
上一篇: 进程间通信-剪贴板 z
下一篇: [转载]windbg使用 z
KataDoc360
博客等级 码龄18年 65粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值