嵌入式Linux中文站

虚拟地址到物理地址的地址变换过程

阅读(178)

阐述了PDP-11/40的虚拟地址到物理地址的地址变换过程。 MMU通过APR(ActivePageRegister)寄存器将虚拟地址变换为物理地址。 APR寄存器由一个PAR(PageAddressRegister)寄存器和一个PDR(PageDescriptionRegister)寄存器构成。 内核通过向与执行进程相对应的、供用户进程用使用的APR设定适当的值,保证各用户拥有独立的虚拟地址空间。 APR共有8组,APR[0]-APR[7]。进程的虚拟地址空间以页或者段为单位进行管理,一组APR对应一页

分页内存管理——虚拟地址到物理地址的转换

阅读(94)

这是逻辑地址(虚拟地址),包括程序中打印的变量地址显示的都是逻辑地址,并不是内存空间上的物理地址。 每条指令在被执行时,读取操作数时需要给出操作数所在的内存地址,这个地址不能是物理主存地址,因为该程序在哪种硬件设置的机器上运行并不能事前确定,那操作系统就不能在此给出对应于某台机器的物理地址。 一、物理内存和虚拟内存 我们先来了解一下,什么是物理内存,什么又是虚拟内存? 1.物理内存:指通过物理内存条而获得的内存空间,主要作用是在计算机运行时为操作系统和各种程序提供临时储存。 2.虚拟内存:对内存架构(内存

中断处理“下半部”机制

阅读(178)

1. 中断处理下半部机制 中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化。但是,中断是一个随机事件,它随时会到来,如果关中断的时间太长,CPU就不能及时响应其他的中断请求,从而造成中断的丢失。 因此,Linux内核的目标就是尽可能快的处理完中断请求,尽其所能把更多的处理向后推迟。例如,假设一个数据块已经达到了网线,当中断控制器接受到这个中断请求信号时,Linux内核只是简单地标志数据到来了,然后让处理器恢复到它以前运行的状态,其余的处理稍后再进行(如把数据移入一个缓冲区,接

linux驱动---等待队列、工作队列、Tasklets

阅读(270)

概述: 等待队列、工作队列、Tasklet都是linux驱动很重要的API,下面主要从用法上来讲述如何使用API. 应用场景: 等待队列(waitqueue) linux驱动中,阻塞一般就是用等待队列来实现,将进程停止在此处并睡眠下,直到条件满足时,才可通过此处,继续运行。在睡眠等待期间,wake up时,唤起来检查条件,条件满足解除阻塞,不满足继续睡下去。 工作队列(workqueue) 工作队列,将一个work提交到workqueue上,而这个workqueue是挂到一个特殊内核进程上,当这个特殊内核

Linux内存管理(最透彻的一篇)

阅读(275)

摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法。力求从外到内、水到渠成地引导网友分析Linux的内存管理与使用。在本章最后,我们给出一个内存映射的实例,帮助网友们理解内核内存管理与用户内存管理之间的关系,希望大家最终能驾驭Linux内存管理。 前言 内存管理一向是所有操作系统书籍不惜笔墨重点讨论的内容,无论市面上或是网上都充斥着大量涉及内存管理的教材和资料。因此,我们这里所要写的Linux内存管理采取避重就轻的策略,从理

Linux内核调试的方式以及工具集锦

阅读(135)

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作 因本人技术水平和知识面有限, 内容如有纰漏或者需要修正的地方, 欢迎大家指正, 也欢迎大家提供一些其他好的调试工具以供收录, 鄙人在此谢谢啦 调试难度本来就是写代码的两倍. 因此, 如果你写代码的时候聪明用尽, 根据定义, 你就没有能耐去调试它了. --Brian Kernighan 1 2 1 内核调试以及工具总结 内核总是那么捉摸不透, 内核也会犯错, 但是调试却不能像用户空间程序那样, 为

Linux进程管理 (篇外)内核线程简要介绍

阅读(178)

关键词:kthread、irq、ksoftirqd、kworker、workqueues 在使用ps查看线程的时候,会有不少[...]名称的线程,这些有别于其它线程,都是内核线程。 其中多数内核线程从名称看,就知道其主要功能。 比如给中断线程化使用的irq内核线程,软中断使用的内核线程ksoftirqd,以及work使用的kworker内核线程。 本文首先概览一下Linux都有哪些内核线程,然后分析创建内核线程的API。 在介绍内核线程和普通线程都有哪些区别? 最后介绍主要内核线程(irq/ksoftir

Linux内核设备树操作常用API

阅读(287)

一文中介绍了设备树的语法,这里主要介绍内核中提供的操作设备树的API,这些API通常都在 include/of.h 中声明。 device_node 内核中用下面的这个结构描述设备树中的一个节点,后面的API都需要一个device_node对象作为参数传入。 //include/of.h 46 struct device_node { 47 const char *name; 48 const char *type; 49 phandle phandle; 50 const char *full_name