IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:操作系统内核

共 2 篇相关文章

IT 累计浏览 211

errno 的实现

POSIX标准对errno的定义从早期的外部变量演变为可修改左值的宏,旨在解决多线程环境下共享全局变量导致的错误码覆盖问题,确保线程安全。FreeBSD的具体实现采用函数指针间接调用模式:errno宏展开后会调用__error()函数获取int指针。在单线程场景下,__error()通过函数指针返回全局变量__libsys_errno的地址。当程序链接线程库libthr时,其构造函数会调用__set_error_selector,将函数指针切换至线程安全版本__error_threaded。该函数会检查线程初始化状态:若当前线程非初始线程,则返回该线程pthread结构体中独立的error字段地址;否则仍回退使用全局存储。这种设计既保证了主线程在线程库初始化前的可用性,又为每个工作线程提供了独立的错误存储。此外,libthr还通过弱符号引用提供了兼容路径,并将一系列可能阻塞的系统调用替换为线程化版本,以处理取消点等线程语义。

IT 累计浏览 2,066

关于PDE/PTE

这篇讲的是操作系统内存管理中的一个核心机制——页目录项(PDE)与页表项(PTE)如何协作完成虚拟地址到物理地址的转换。 作者从自身研读内核代码的实践出发,聚焦于 x86 架构下的两级页表结构。文章清晰地剖析了CPU每次访问内存时,如何先通过CR3寄存器定位到页目录基址,再逐级查找,最终拿到物理地址的全过程。其中不仅解释了PDE/PTE各个字段的精确含义(如Present位、读写位、用户/超级visor位等),还结合了具体的内核代码片段,展示了操作系统在创建进程、进行内存映射时,是如何一步步填充这些页表结构的。 文中特别点出了一个巧妙的设计:通过分页机制本身,操作系统可以高效地实现写时复制(Copy-On-Write)和内存共享。作者还对比了不同页大小(如4KB标准页与大页)对TLB(转换后备缓冲器)命中率和性能的潜在影响,让抽象的概念变得具体可感。 对于想从“会用API”到“理解原理”的开发者而言,这篇文章提供了一条扎实的路径,把看似黑盒的虚拟内存管理,拆解成了可追踪的、一步步的硬件与软件协同操作。它像一张地图,标出了从用户空间指针到物理内存条的完整通路。