嵌入式Linux中文站

linux内核空间和用户空间详解

阅读(180)

linux驱动程序一般工作在内核空间,但也可以工作在用户空间。下面我们将详细解析,什么是内核空间,什么是用户空间,以及如何判断他们。 Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G。Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间。而将较低的3G字节(从虚拟地址 0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间)。因为每个进程可以通过

Linux内核定时器的使用

阅读(150)

LINUX内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于linux/timer.h和kernel/timer.c文件中。 被调度的函数肯定是异步执行的,它类似于一种软件中断,而且是处于非进程的上下文中,所以调度函数必须遵守以下规则: 1)没有current指针、不允许访问用户空间。因为没有进程上下文,相关代码和被中断的进程没有任何联系。 2)不能执行休眠(或可能引起休眠的函数)和调度。 3)任何被访问的数据结构都应该针对并发访问进行保护,以防止竞争条件

linux字符设备驱动:自动创建设备及其节点

阅读(177)

大概步骤: 一、 注册设备号 注册函数: regsiter_chrdev_region() alloc_chrdev_region() 或 查看#cat /proc/devices register_chrdev() 注销函数: unregist_chrdev_region() 或 unregister_chrdev() 二、初始化cdev并添加到系统 初始化cdev 静态初始化 cdev_init() 或 动态初始化 cdev_alloc() 添加到系统函数 cdev_add() 从系统删除函数 cde

Linux内核启动及文件系统加载过程

阅读(164)

一、 Linux 内核自解压过程 在 linux 内核启动过程中一般能看到图1内核自解压界面,本小节本文重点讨论内核的自解压过程。 图1 解压内核 内核压缩和解压缩代码都在目录 kernel/arch/arm/boot/compressed ,编译完成后将产生 head.o、misc.o、piggy.gzip.o、vmlinux、decompress.o 这几个文件, head.o 是内核的头部文件,负责初始设置; misc.o 将主要负责内核的解压工作,它在 head.o 之后; piggy.gzip.

Linux 内核工作原理

阅读(179)

本文发表于Linux Format magazine杂志,作者从技术深度上解释了Linux Kernel是如何工作的。相信对Linux开发者来说有不小的帮助。 牛津字典中对kernel一词的定义是:较软的、通常是一个坚果可食用的部分。当然还有第二种定义:某个东西核心或者最重要的部分。对Linux来说,它的Kernel无疑属于第二种解释。让我们来看看这个重要的东西是如何工作的,先从一点理论说起。 广义地来说kernel就是一个软件,它在硬件和运行在计算机上的应用程序之间提供了一个层。严格点从计算机科学的角度

深入分析 Linux 内核链表

阅读(384)

一、 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,是线性表的一种重要实现方式。相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时

Linux内核读写文件

阅读(220)

1. 序曲 在用户态,读写文件可以通过read和write这两个系统调用来完成(C库函数实际上是对系统调用的封装)。但是,在内核态没有这样的系统调用,我们又该如何读写文件呢? 阅读linux内核源码,可以知道陷入内核执行的是实际执行的是sys_read和sys_write这两个函数,但是这两个函数没有使用EXPORT_SYMBOL导出,也就是说其他模块不能使用。 在fs/open.c中系统调用具体实现如下(内核版本2.6.34.1): SYSCALL_DEFINE3(open, const char __

编写Linux内核模块

阅读(113)

最近由于学习需要,学习了一下Linux内核模块的编写方法,特此把学习过程中的问题记录下来!!! [cpp] view plain copy print ? // //hello.c // #includelinux/init.h #includelinux/kernel.h #includelinux/module.h static int hello_init( void ){ printk(KERN_WARNING Moduleinit:Helloworld!\n ); return 0; } sta