![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux内核
文章平均质量分 72
第二月
这个作者很懒,什么都没留下…
展开
-
在UBUNTU 10上搭建GIT服务器
搭建git服务器有几种方式可选,gitosis是其中最常用的一种。最近新装了ubuntu 10系统,并买了一块飞凌ok6410开发板,准备从零开始移植linux2.6.28.6的内核,免不了要一步一步地添加和修改文件,所以最好有一个git repository来记录历史。以前也一直用git来管理自己开发的一些软件,但都是最简单的单机方式,只用于做个记录,现在准备尝试一下更复杂也更标准的方式原创 2013-08-27 11:59:12 · 722 阅读 · 0 评论 -
ARM1176JZF-S/S3C6410 内存地…
这是一份对于ARM1176JZF-S芯片上MMU内存地址转换/映射过程的整理,内容完全来自ARM官网的技术手册。ARM1176JZF-S属于ARMv6产品系列,支持两种页表项的格式,一种是向ARMv4和ARMv5兼容的格式,另一新是ARMv6的新格式。v4/v5的格式在相应的技术手册里描述得非常清楚,但是对于v6格式的描述显得有点散,所以本文只关注ARMv6格式。内容保持英文原文,没有翻译原创 2013-08-27 11:59:42 · 2170 阅读 · 0 评论 -
ARM1176JZF-S/S3C6410处理器的操作…
Operating ModesEight operating modes are definedunder ARM1176JZF-S architecture, they are:ModeMode TypeCommentsUserUserUser mode is the usual ARM program execution state, and is原创 2013-08-27 11:59:44 · 2205 阅读 · 0 评论 -
ARM Linux系统中的用户栈与内核栈
在Linux系统上,一个进程有两种不同的栈,一种是用户栈,另一种是内核栈。用户栈用户栈就是应用程序直接使用的栈。如下图所示,它位于应用程序的用户进程空间的最顶端。当用户程序逐级调用函数时,用户栈从高地址向低地址方向扩展,每次增加一个栈帧,一个栈帧中存放的是函数的参数、返回地址和局部变量等,所以栈帧的长度是不定的。用户栈的栈底靠近进程空间的上边缘,但一般不会刚好对齐到边缘,出于安全考原创 2013-08-27 11:59:46 · 1683 阅读 · 0 评论 -
ARM Linux (S3C6410架构…
set_pte_ext()的作用是根据Linux给出的Linux版本页表项来填充Arm硬件版本的页表项。对于s3c6410,set_pte_ext()函数由汇编宏armv6_set_pte_ext来实现,定义在proc-macros.S文件中。进入函数时,参数分别为:r0: pte的地址,这里的pte是二级页表Linux版本中对应的页表项。r1: Linux版二级页表项的内容。原创 2013-08-27 11:59:48 · 819 阅读 · 0 评论 -
ARM Linux (S3C6410架构…
ARM Linux的访问权限控制ARM1176JZF-S处理器为访问权限控制定义了两个层次:第一层是"域"(Domain)的访问类型,第二层是页或者段的"读写权限"(AccessPermission)。具体来说,过程是这样的:1. 在ARM处理器中,MMU将整个存储空间分成最多16个域,记作D0~D15,每个域对应一定的存储区域,该区域具有相同的访问控制属性。每个域的访问权限分别由CP1原创 2013-08-27 11:59:50 · 828 阅读 · 0 评论 -
ARM1176JZF-S/S3C6410处理器的异常…
本来准备总结一下ARM1176JZF-S/S3C6410处理器的异常处理过程,但是发现《嵌入式系统Linux内核开发实战指南》一书中的这一部分讲解得非常简明和清楚。所以就不再重复发明轮子,不过我会在以下的引用中做一些补充。进入异常中断处理ARM处理器发生异常中断,则ARM处理器进入如下异常中断自动处理过程(假设发生的异常中断对应的模式为mode):将当前程序状态寄存器CPSR的值保存原创 2013-08-27 11:59:52 · 1266 阅读 · 0 评论 -
ARM-LINUX的进程切换
本文主要记录S3C6410/ARM1176JZF-S架构下Linux(kernel 2.6.35)内核如何进行进程切换。进程切换是操作系统进程调度的基础,首先要能够实现切换,接下来才谈得上“多进程”、“多线程”以及调度算法等更高级的话题。(这里在说“进程切换”的时候提到多线程,并不是把概念搞混淆了。在内核里谈切换的时候,Linux并不区分进程与线程,因为这里只有task,一个进程里如果有多个线原创 2013-08-27 12:00:52 · 1939 阅读 · 0 评论 -
Arm Linux 内核页表的段式映射
Linux启动之初,内核为自己建立的是段式内存映射,而不是页式映射。映射表(PGD)从虚拟地址0xc0004000开始,每项4字节,每项对应1M内存空间,每项的高12位就是这1M内存的高12位地址。一开始,内核不会为所有内存建立映射,只会映射必要的一部分,这部分代码在arch/arm/kernel/head.S中由汇编代码完成。以S3C6410为例,下面是在刚刚进入start_k原创 2013-08-27 11:59:17 · 1275 阅读 · 0 评论 -
schedule()函数的调用时机(周期性调度)
纠正一个由来已久的认识错误:一个进程的时间片用完之后,当再次发生时钟中断时内核会调用schedule()来进行调度,把当前的进程上下文切出CPU,并把选定的下一个进程切换进来运行。我一直以为schedule()函数是在时钟中断处理函数中被调用的。其实不是,如果真是这样的话,那么在第一次这样的调度完成之后,时钟中断可能就要被mute掉了,系统从此失去“心跳”。原创 2013-09-04 22:44:50 · 2869 阅读 · 0 评论 -
ARM Linux (S3C6410架构…
这里记录一下Linux内核做二级内存映射的过程,以中断向量表的映射过程为例。在S3C6410架构下,Linux采用的是粗粒度小页内存管理方式,即内存段(section)的大小为1M,而页(page)的大小为4K。在第一级内存映射中,每一个PGD项覆盖1M的内存区域;如果有二级内存映射的话,每一个PTE项覆盖4K的内存区域。下面我们来看一下二级内存映射表的设计。如果段的大小是1M而页的大小是原创 2013-08-27 11:59:39 · 723 阅读 · 0 评论 -
ARM Linux (S3C6410架构…
本文讲述Linux系统启动过程中内核空间的映射。Linux系统内核启动过程中,会在start_kernel()-> setup_arch() ->paging_init()函数中建立页表,下面详细记录一下其中每一个重要的步骤。(下面演示的代码经过删减)先看函数prepare_page_table()[c]static inline void prepare_page_table原创 2013-08-27 11:59:37 · 781 阅读 · 0 评论 -
安装和配置scim(汉字输入法)
首先安装两个包:scim 和 scim-chinese-tables安装完并重启之后,手动运行scim发现在系统托盘里可以出现一个新的键盘图标,但无法切换成中文输入法。这时可以看下/etc/X11/Xsession.d目录里是否有95xinput文件,如果没有就手动创建一个,并编辑如下:export XMODIFIERS=@im=SCIMexport XIM=scimexp原创 2013-08-27 11:59:14 · 2024 阅读 · 0 评论 -
do_page_fault的调用栈
do_page_fault()是处理缺页异常的入口,一直感兴趣这是怎样被调用到的。今天在handle_mm_fault()里面加了一个BUG()专门看调用栈,发现并不复杂。既然是缺页,肯定是发端于预取数据异常,是由中断发起的。这要追溯到entry-armv.S里对预取数据中断的处理,最终会调用到do_PrefetchAbort(),这个函数在arch/arm/mm/fault.c里定义,在其中原创 2013-08-27 11:59:19 · 5033 阅读 · 0 评论 -
Arm-Linux二级页表的问题
以前,在一些文档和代码中看到过说arm-linux的二级页表分为linux版本和硬件版本。一直觉得概念比较混乱,没有仔细研究,今天终于遇到了这个问题,不得不学习一下了。在do_page_fault()过程中,有下面函数会被调到:[c]static inline void __pmd_populate(pmd_t *pmdp, unsigned long pmdval){pmdp[0]原创 2013-08-27 11:59:22 · 1886 阅读 · 0 评论 -
initrd与initramfs
最近在着手给Sparrow设计一个简单的ram文件系统,想借鉴一下Linux的思路。发现对initrd和initramfs两个概念搞不太清楚,恍惚觉得它们也都是内存文件系统,但又说不清楚其间的区别。今天特意查了一下,做个总结。的确,它们的相同之处在于,都是用于内核启动阶段的临时内存文件系统。比较一下,主要有这样几点区别:1. Initrd本身是一个ramdisk,是一个虚拟盘的概念,被挂原创 2013-08-27 11:59:24 · 1079 阅读 · 0 评论 -
Linux内核中ELF可执行文件的装载/l…
在Linux系统中运行一个可执行的ELF文件时,内核首先需要识别这个文件,然后解析并装载它以构建进程的内存空间,最后切换到新的进程来运行。在fs/binfmt_elf.c中定义了函数load_elf_binary()和load_elf_library()分别用于装载和解析ELF格式的可执行文件和动态连接库。下面来研究一下在load_elf_binary()中做了哪些事情,一个新的进程的内存空间原创 2013-08-27 11:59:26 · 1368 阅读 · 0 评论 -
两篇很好的虚拟内存区域管理方面的…
今天本来想写一篇文章总结一下linux进程空间映射,特别是跟vm_area有关的内容。记录一下进程空间是怎么组织的,vm_area_struct的设计意图,以及mm/mmap.c中所定义的对它的操作,等等。不过没想到偶然间找到了两篇非常棒的文章,正是想要的,而且质量相当高,乍看很有惊艳的感觉。我就不再重造车轮了,收藏起来,在这里记录一下:与虚拟内存区域有关的操作与虚拟内存区域有关的操作原创 2013-08-27 11:59:28 · 892 阅读 · 0 评论 -
do_brk()函数分析
系统调用brk()的作用是扩展进程的“堆”,在其实现代码里,最后会调到do_brk()函数来完成,do_brk()函数在载入elf文件时也会调用。do_brk()函数的声明如下:[c]unsigned long do_brk(unsigned long addr, unsigned long len)[/c]就像在上面的注释中所提到的,do_brk()是一个简化版的do_mmap原创 2013-08-27 11:59:30 · 2904 阅读 · 0 评论 -
Linux启动ELF可执行文件的过程
总结一下Linux内核启动一个ELF可执行文件的大概过程,其中大部分的细节都并没有深究过,但总的流程还算比较清楚。如果涉及到与体系结构有关的内容,只讲ARM的。就从do_execve()函数开始讲起,因为无论是系统调用(即一个进程启动另一个进程)还是启动kernel线程(即系统自己决定启动一个进程,比如系统引导后由kernel启动的第一个进程init)都会调到这个函数。do_execve(原创 2013-08-27 11:59:33 · 3505 阅读 · 0 评论 -
Ubuntu系统上HP520电脑网卡问题
每过一段时间就会遇到一次这样的问题,这次把解决办法做个记录备查。上次记录的链接失效了。第一次成功安装Ubuntu 11.04后,会自动安装无线网卡的驱动,并可以正常上无线网。但重启一次以后,就再也无法使用无线网卡上网了。具体症状是:1. 即使打开无线网卡的硬开关,无线网络指示灯还是不亮。2.无论如何点击启用无线网络,都无法点亮无线网络指示灯。3. 无法连接任何无线网络,在net原创 2013-08-27 11:59:35 · 1112 阅读 · 0 评论 -
Linux内核线程
本文以ARM架构为例,讲解linux的内核线程是如何创建的。Linux内核在完成初始之后,会把控制权交给应用程序。只有当硬件中断、软中断、异常等发生时,CPU才会从用户空间切换到内核空间来执行相应的处理,完成后又回来用户空间。如果内核需要周期性地做一些事情(比如页面的换入换出,磁盘高速缓存的刷新等),又该怎么办呢?内核线程(内核进程)可以解决这个问题。原创 2013-08-27 12:00:54 · 1336 阅读 · 0 评论