
Linux内核
文章平均质量分 80
zhandoushi1982
这个作者很懒,什么都没留下…
展开
-
Linux下常见命令
=============挂载和登陆命令====================Mount:挂载命令。比如挂载光驱mount /dev/cdrom /mnt/cdrom,可在目录/mnt/cdrom下查看内容,想退出光盘时,须使用umount命令,否则光驱就会一直处于死锁状态:#umount /mnt/cdrom。同样可以挂载盘符,比如mount -t vfat /dev/uba1 /mnt,...原创 2009-10-13 11:53:00 · 9449 阅读 · 1 评论 -
信号量和自旋锁的差别
(1)内核同步措施 为了避免并发,防止竞争。内核提供了一组同步方法来提供对共享数据的保护。我们的重点不是介绍这些方法的详细用法,而是强调为什么使用这些方法和它们之间的差别。 Linux 使用的同步机制可以说从2.0到2.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随Linux从单处理器到对称多处理器的过度;伴随着从非抢转载 2010-05-14 19:42:00 · 2092 阅读 · 0 评论 -
EXPORT_SYMBOL的用法
linux2.6的“/proc/kallsyms”文件对应着内核符号表,记录了符号以及符号所在的内存地址。模块可以使用如下宏导出符号到内核符号表:EXPORT_SYMBOL(符号名); EXPORT_SYMBOL_GPL(符号名) 导出的符号可以被其他模块使用,不过使用之前一定要extern声明一下。EXPORT_SYMBOL_GPL()只适用于包含GPL许可权的模块。转载 2010-02-24 20:24:00 · 6786 阅读 · 0 评论 -
内核空间与用户空间之一:基础概念
(1)Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此Linux的虚拟地址空间也为0~ 4G(32位地址最大访问极限)。Linux内核将这4G字节的空间分为两部分,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF,供各个进程使用,称为“用户空间)。因为每个进转载 2010-01-27 19:26:00 · 2140 阅读 · 0 评论 -
Linux 静态链接库与动态链接库之二:动态链接库生成及使用 && 可执行bin运行时动态调用so的函数
动态链接库是一种通用的软件组件技术,是多种操作系统中提供基本服务的方式。比如Win32内核就是3个DLL文件构成。这种技术在Linux操作系统下也有对应的实现,就是Linux标准对象Standard Ojbect,对应的文件扩展名为.so。 下面通过一个简单的例子开始介绍Linux标准对象。保存为myso.c文件,按照如下编译: $ gcc -fPIC -shared -...转载 2010-07-05 23:44:00 · 1404 阅读 · 0 评论 -
交叉编译器及常见编译错误
(1)交叉编译器 在主机上用来编译其它类型机器上可执行代码的编译器就叫交叉编译器,我们进行嵌入式linux的开发主机大部分都是X86,而我们的嵌入式系统的处理器有可能是ARM/MIPS等非X86处理器,这时候就必须使用ARM/MIPS的交叉编译器才能编译出在这些处理器上能够执行的代码。这里我们使用的是ARM最新的EABI编译器。 交叉编译器在编译的时候,对于浮点运行会预原创 2010-09-03 00:26:00 · 13951 阅读 · 1 评论 -
Linux的中断和内核抢占
(1)异常的概念 中断信号是一个统称,统称那些改变CPU指令执行序列的事件。但它又分为两种:一种是同步的,没那么突然,因为它只在一个指令的执行终止之后才发生,书中依从Intel的惯例,称为异常(Exception)。一般是编程错误(一般的处理是发信号)或者内核必须处理的异常情况(内核会采取恢复异常所需的一些步骤);一种是异步的,突然一些,因为它是由间隔定时器和I/O设备产生的,只遵循CP转载 2010-05-19 17:35:00 · 2959 阅读 · 0 评论 -
Windows & Unix 文件格式之迷
(1)问题提出我们可能会遇到过这样一些困惑:A, 如何查看一个文件或数据流的二进制格式(以十六进制格式显示)?B,为什么在 windows下编辑的 shell 脚本在 Unix下不能执行?为什么在 windows下编辑的 C 源文件在有些 gcc 编译器下不能编译?C,为什么我在 vi 等编辑器下打开一个文本文件会包含 ^M,如何把它去掉?为什么我在 windows 上用记事本打开转载 2011-12-22 17:30:24 · 5895 阅读 · 0 评论 -
Linux socket之四:使用POLL机制处理多连接
使用select函数可以处理socket多连接的问题(select的用法参见:http://blog.csdn.net/zhandoushi1982/article/details/5070107),使用POLL也可以实现同样的功能,且调用方式更加简单。原型是:struct pollfd { int fd; //文件描述符 short events; //要求查询的事件掩码 sh原创 2012-07-12 00:17:08 · 27974 阅读 · 1 评论 -
Linux socket之三:面向无连接的socket通信&&sokcet超时处理
(1)无连接的socket通信相对于有连接的socket通信较为简单,因为在传输过程中不保证能否到达,常用于对数据要求不高的地方。由于省去了很多开销,它的传输速度比有连接的socket通信要快,使用UDP传输数据。数据通信示意图如下: 如上,服务端在绑原创 2012-07-05 23:17:23 · 5358 阅读 · 0 评论 -
Linux socket之二:面向连接的socket通信实现
socket也即套接字接口,实际上也就是网络上的通信节点。使用者或者应用程序只要连接到socket便可以和网络上任何一个通信端点连接,传递数据。LINUX中,程序员可以不必关心通信协议而专注应用程序开发。根据数据传送方式,可以把socket分成面向连接的数据流通信和无连接的数据报通信。通信过程如下:原创 2012-07-01 20:39:05 · 3943 阅读 · 0 评论 -
linux内核休眠与唤醒 && 安卓系统控制内核的状态
在Linux中,休眠主要分三个主要的步骤:(1)冻结用户态进程和内核态任务;(2)调用注册的设备的suspend的回调函数;(3)按照注册顺序休眠核心设备和使CPU进入休眠态。 冻结进程是内核把进程列表中所有的进程的状态都设置为停止,并且保存下所有进程的上下文。当这些进程被解冻的时候,他们是不知道自己被冻结过的,只是简单的继续执行。如何让Linux进入休眠呢?用户可以通过读写sys文件/sys /power/state 是实现控制系统进入休眠。比如:# echo standby >转载 2010-07-23 23:59:00 · 7040 阅读 · 0 评论 -
linux select函数用法 && 阻塞与非阻塞IO
select系统调用是用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变。关于文件句柄,其实就是一个整数,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构的表示就是stdin、stdout、stderr。 函数原型是:int se转载 2009-12-24 16:08:00 · 11715 阅读 · 3 评论 -
makefile基础及常用规则
什么是makefile?或许很多Windows的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。特别在Unix下的软件编译,你就不能不自己写makefile了。 我们用一个示例来说明Makefile的书写规则。在这个示例中,我们的工程有8个C文件,和3个头文件,我们要写...原创 2009-11-05 00:03:00 · 4988 阅读 · 1 评论 -
linux内核定时器 && 线程kthread相关
Linux内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,调度函数在运行过一次后就不会再运行了(相当于自动注销),但可以通过在被调度的函数中重新调度自己来周期运行。(1)jiffies定时器,HZ=100,精度只能达到10ms,已验证#include <linux/jiffies.h>#include <linux/ti...转载 2015-07-23 23:46:43 · 2843 阅读 · 0 评论 -
module_param()的用法,insmod可带形参 && 内核线程kthread实例
(1)引入原因 在用户态下编程可以通过main()来传递命令行参数(具体可见C语言高级中的一篇文章),而编写一个内核模块则可通过module_param()来传递命令行参数。(2)实现 module_param宏是Linux 2.6内核中新增的,该宏被定义在include/linux/moduleparam.h文件中,具体定义如下:/* Helper fu转载 2011-12-31 15:24:54 · 4812 阅读 · 0 评论 -
Linux应用程序互斥锁mutex
Linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socke转载 2010-03-11 10:16:00 · 4622 阅读 · 0 评论 -
hello world及内核模块 && 把.ko的驱动改生成.o的场景
(1)C普通程序实例启动终端,首先用VI编写一个C程序:vi hello.c#include int main(){ printf("hello world!!!/n"); return 0;} 接着用GCC进行编译:gcc -o hello hello.c,最后运行该程序:./hello,在终端上你会看到:hell原创 2009-11-29 00:07:00 · 4874 阅读 · 2 评论 -
Linux Kernel Panic报错解决思路 && addr2line工具使用 && Kernel cut here && Tombstone 分析
(1)什么是Kernel Panic? panic是英文中是惊慌的意思,Linux Kernel panic正如其名,linux kernel不知道如何走了,它会尽可能把它此时能获取的全部信息都打印出来。有两种主要类型kernel panic:1.hard panic(也就是Aieee信息输出);2.soft panic (也就是Oops信息输出)(2)什么会导致Linux...原创 2009-10-21 23:38:00 · 10699 阅读 · 0 评论 -
Linux内核的中断处理:work_struct && 定时处理delayed_work
WM9714的耳机跟喇叭通道切换由寄存器软件控制,跟之前电视里面插入耳机让功放直接拉低关掉外音的方式有点差别。通过设置WM9714的0X1C寄存器的值来切换,其中设置耳机时为0X00A0,设置喇叭时为0X1200。 电路中有外部上拉固定EINT11为高电平,通过插入耳机将这个外中断EINT11拉低来触发中断,再进行WM9714的寄存器控制。首先在WM9713.C中wm9713_soc原创 2010-01-28 19:18:00 · 5148 阅读 · 0 评论 -
linux的HZ, Tick, xtime, Jiffies, RTC && mdelay() 与msleep()的区别
Linux核心几个重要跟时间有关的名词或变数,将介绍HZ、tick与jiffies。 (1)HZ Linux核心每隔固定周期会发出timer interrupt (IRQ 0),HZ是用来定义每一秒有几次timer interrupts。举例来说,HZ为1000,代表每秒有1000次timer interrupts。 HZ可在编译核心时设定,具体查询设定方法可参见上篇文章《...转载 2010-04-27 20:22:00 · 28658 阅读 · 5 评论 -
Linux 静态链接库与动态链接库之一:静态链接库生成及使用
(1)引言 通常情况下,对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file)。程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下。所以这些函数库被成为静态库(static libaray),通常文件名为“libxxx.a”的...转载 2010-07-01 22:54:00 · 1841 阅读 · 0 评论 -
Linux时间戳和标准时间的互转
在Linux下编译安装软件包时提示:make: warning: Clock skew detected. Your build may be incomplete。修改系统的日期与时间然后重新编译安装,则错误消失。方法如下: [root@server vsftpd-2.0.5]# date Sat Jan 26 04:33:07 CST 2002 [root@server vs转载 2012-06-16 00:25:54 · 1878 阅读 · 0 评论 -
shell编程基础
(1)它必须以如下行开始(必须放在文件的第一行): # !/bin/sh符号#!用来告诉系统执行该脚本的程序,本例使用/bin/sh。编辑结束并保存后,如果要执行该脚本,必须先使其可执行: chmod +x filename此后在该脚本所在目录下,输入 ./filename 即可执行该脚本。 (2)变量赋值和引用。Shell编程中,使用变量无需事先声明,原创 2009-11-24 23:26:00 · 4391 阅读 · 1 评论 -
linux底层驱动模型Kobject && ueventd.rc的作用及其解析
1)Kobject Kobject 是Linux 2.6引入的新的设备管理机制,在内核中由struct kobject表示。通过这个数据结构使所有设备在底层都具有统一的接口,kobject提供基本的对象管理,是构成Linux2.6设备模型的核心结构,它与sysfs文件系统紧密关联,每个在内核中注册的kobject对象都对应于sysfs文件系统中的一个目录。Kobject是组成设备模型的基转载 2010-03-30 14:59:00 · 8915 阅读 · 0 评论 -
关于fork()函数的作用
(1) 先看一个实例:#include ; #include ; main () { pid_t pid; pid=fork(); if (pid printf("error in fork!"); else if (pid == 0)转载 2010-03-09 18:08:00 · 15511 阅读 · 2 评论 -
linux的符号链接 && mkimage.sh及cpio打包过程分析
ln:该命令在文件之间创建链接。这种操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的名称。对于这个新的文件名,我们可以为之指定不同的访问权限,以控制对信息的共享和安全性的问题。如果链接指向目录,用户就可以利用该链接直接进入被链接的目录而不用打一大堆的路径名。而且,即使我们删除这个链接,也不会破坏原来的目录。 格式:ln [选项] 目标 目录 链接有两种转载 2010-03-29 16:47:00 · 8092 阅读 · 0 评论 -
手动调整内核printk打印级别 && 内核模块初始化入口函数的优先级
<br /> 系统调用是linux用户态和内核态之间的一个桥梁,通过系统调用可以访问linux的众多核心功能。在使用上系统调用和库函数之间虽然并没有太大的区别,但是必须明确的是调用系统调用时,程序会进入内核态运行,而库函数始终是运行在用户态的。由于需要在用户态和内核态之间切换,系统调用的开销相对要大一些。<br /> strace这个工具可以在运行时跟踪程序使用系统调用的情况,这对于我们分析和调试程序的运行行为很有帮助。它的使用也很简单,只要在你运行的程序前加上strace即可。<br转载 2010-08-14 23:34:00 · 3177 阅读 · 4 评论 -
Linux socket之一:基础函数
总的来说网络程序是由两个部分组成的--客户端和服务器端。它们的建立步骤一般是:服务器端:socket-->bind-->listen-->accept 客户端:socket-->connect Linux系统是通过提供套接字(socket)来进行网络编程的。网络程序通过socket和其它几个函数的调用,会返回一个通讯的文件描述符,我们可以将这个描述符看成普通的文件的描述符来转载 2010-03-12 10:08:00 · 1302 阅读 · 0 评论 -
linux下的umask( )函数、setsid( )函数
umask()函数:此函数的主要作用是在创建文件时设置或者屏蔽掉文件的一些权限。一般与open()函数配合使用。open函数原型:#include#include#includeint open( const char * pathname, int flags);int open( const char * pathname,int flags, mode_t mode);转载 2010-03-10 11:03:00 · 13524 阅读 · 2 评论