
linux的学习
cybertan
做事诚恳塌实,刻苦钻研!
开放,共享,合作!
展开
-
linux的物理内存
linux系统对于物理内存管理主要有下面3次探测的过程: 1:第一次探测 Arch/i386/boot/setup.S在这里使用了三种方法,通过调用0x15 中断:E820H 得到memory map。E801H 得到大小。88H 0-64M. 2:第二次探测:start_kernel() -> setup_arch()这里主要是对物理内存的初始化,建立zone区。并且初始化pag原创 2008-09-23 15:55:00 · 4104 阅读 · 0 评论 -
linux的内核同步
linux的内核同步,作用是为了临界区的保护.主要有下面5种方式:1:原子操作.执行过程中不能被打断的操作.2:自旋锁,应用于多处理器环境.当得不到锁的时候,CPU就会在一直在做轮询判断.也就是说如果一个进程取不到自旋锁.也会一直判断下去,不会主动去调度其它进程代替当前进程.但是这样锁机制的开销极少.可以快速的开锁和加锁.持有自旋锁的进程一般都会对临界区有快速的处理另外,内核还规定持有原创 2008-09-25 10:01:00 · 771 阅读 · 0 评论 -
page cache 与buffer cache
在 Linux 的实现中,文件 Cache 分为两个层面,一是 Page Cache,另一个 Buffer Cache,每一个 Page Cache 包含若干 Buffer Cache。内存管理系统和 VFS 只与 Page Cache 交互,内存管理系统负责维护每项 Page Cache 的分配和回收,同时在使用 memory map 方式访问时负责建立映射;VFS 负责 Page Cache原创 2008-10-13 17:47:00 · 1699 阅读 · 0 评论 -
入式实时程序设计中C/C++代码的优化
对於设计嵌入式Linux 系统的研发人员来说,有一个问题是必须要考虑到的,那就是记忆体的空间。 我们知道嵌入式Linux 系统所用的记忆体不是软碟、硬碟、ZIP 盘、CD-ROM、DVD 这些众所周知的大容量常规记忆体,它使用的是例如Rom, CompactFlash,M-Systems 的 DiskOnChip,SONY 的MemoryStick,IBM 的MicroDrive 等体积极转载 2008-11-04 16:41:00 · 1164 阅读 · 0 评论 -
CPU外频、FSB前端总线与内存频率的关系
什么是前端总线?不是超频的方法之一,也不是用来超频的。 我们知道,电脑有许多配件,配件不同,速度也就不同。在286、386和早期的486电脑里,CPU的速度不是太高,和内存保持一样的速度。后来随着CPU速度的飞速提升,内存由于电气结构关系,无法象CPU那样提升很高的速度(就算现在内存达到400、533,但跟CPU的几个G的速度相比,根本就不是一个级别的),于是造成了内存和CPU之间出现了速度差异,转载 2009-07-15 16:14:00 · 1062 阅读 · 0 评论 -
Linux内核裁减及根文件系统定制
二、根文件系统定制 1、 创建一个全新的根文件系统 你可以用mkinitrd来创建,这里介绍另外一种方式,用dd命令: # mkdir -p /mnt/initrd 创建一个设备点,用于临时挂载根文件系统。 # cd /tmp 在tmp下创建根文件系统原创 2009-07-15 16:32:00 · 784 阅读 · 0 评论 -
CPU总线带宽与内存带宽匹配
外频外频是由主板为CPU提供的基准时钟频率,一般常见的有100、133、166、200。我们说的FSB(Front System Bus)指的是系统前端总线,它是处理器与主板北桥芯片或内存控制集线器之间的数据通道,常见频率有400、333、533、800。作为新手不必掌握那么多概念性的东西,只要记住以下几个公式:主频=外频*倍频(MHz)IntelCPU前端总线=外频*4(MHz)原创 2009-07-15 16:12:00 · 4609 阅读 · 0 评论 -
内存池
通常,我们都采用NEW或者malloc动态申请内存。一般来说,少量的操作不会造成什么影响,但是,如果我们频繁去申请内存块,会造成效率上的损失,更有甚者,造成内存碎片的存在,从而影响系统的效率(所有程序都可能受到影响),一种最常见的解决办法就是一次性申请一个大点的内存块,每次需要的时候就"切"一块下来用,如果该内存块不够才去申请内存,由于原创 2009-07-27 12:10:00 · 839 阅读 · 0 评论 -
linux 共享函数的两种调用形式
1、介绍 动态库是程序设计常用的技术,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。在Windows和Linux 操作系统中都有动态库的概念。Windows将其称为动态链接库(Dynamic Link Library,DLL),其文件扩展名为.dll,Linux称其为共享库技术(Shared Library),相原创 2009-07-27 12:14:00 · 1072 阅读 · 0 评论 -
System.map的符号说明
AAbsolute符号的值是绝对值,并且在进一步链接过程中不会被改变BBSS符号在未初始化数据区或区(section)中,即在BSS段中CCommon符号是公共的。公共符号是未初始化的数据。在链接时,多个公共符号可能具有同一名称。如果该符号定义在其他地方,则公共符号被转载 2009-07-28 12:33:00 · 958 阅读 · 0 评论 -
linux kernel for mips memory lost when pfn!=0
这个标题很难理解,需要解释一下,一般mips cpu DRAM的起始地址都是0x80000000, 所以在linux kernel中定义PAGE_OFFSET = 0x80000000, 物理地址从0开始,也就是这里的pfn=0 的意思。 但是也有少数的mips cpu DRAM的起始地址不是从0x80000000开始的,比如从0x88000000开始。这种情况下,一般linux kernel原创 2009-07-29 14:10:00 · 904 阅读 · 0 评论 -
核心态和用户 态数据的交互的方式
核心态和用户 态数据的交互,有多种方式:1:可以通用socket创建特殊套接字,利用套接字实现数据交互;2:通过proc文件系统创建文件来进行数据交互;3:还可以使用设备 文件的方式,访问设备文件会调用设备驱动相应的例程,设备驱动本身就是核心态和用户态的一个接口,Tun/tap驱动就是利用设备文件实现用户态和核心态 的数据交互。原创 2009-07-30 12:24:00 · 1526 阅读 · 0 评论 -
嵌入式Linux文件系统详细介绍
Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。 Linux下的文件系统结构如下: Linux启动时,第一个必须挂载的是根文件系统;若系统不转载 2009-08-03 15:12:00 · 1232 阅读 · 0 评论 -
mips地址空间说明
在32位MIPS体系结构下,最多可寻址4GB地址空间。这4GB空间的分配是怎样的呢?让我们看下面这张图: +----------------------------------------------+ | | 0xFFFFFFFF | | |转载 2009-08-01 14:50:00 · 5789 阅读 · 3 评论 -
linux read调用说明
大部分程序员可能会有这样的疑问:当在程序中调用库函数 read 时,这个请求是经过哪些处理最终到达磁盘的呢,数据又是怎么被拷贝到用户缓存区的呢?本文介绍了从 read 系统调用发出到结束处理的全过程。该过程包括两个部分:用户空间的处理、核心空间的处理。用户空间处理部分是系统调用从用户态切到核心态的过程。核心空间处理部分则是 read 系统调用在 linux 内核中处理的整个过程。原创 2009-08-03 12:31:00 · 1693 阅读 · 0 评论 -
Linux内核具体体系结构之虚拟文件系统
Linux内核具体体系结构之虚拟文件系统译自:《Concrete Architecture of the Linux Kernel》作者: Waterloo, Ontario N2L 3G1 CS 746G, Winter 1998刘建文略译(http://blog.youkuaiyun.com/keminlau )3.3 Virtual File System3.3.1 Goals转载 2009-08-24 09:25:00 · 1179 阅读 · 0 评论 -
ip_conntrack_ftp.c的分析
由于nat表需要ip conntrack模块支持,因此在针对FTP数据连接的nat动作也需要conntrack支持。主要流程如下:netfilter hook将FTP控制连接加入到conntrack pool中,每一个在该conntrack上的数据报会被送至help函数(ip_conntrack_ftp.c),该函数由ip_conntrack_helper_unregister()注册成为该con转载 2009-10-12 11:34:00 · 2960 阅读 · 0 评论 -
linux 管道学习
管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别。 有名管道叫named pipe或者FIFO(先进先出),可以用函数mkfifo()创建。 Linux管道的实现机制 在Linux中,管道是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所转载 2009-10-19 10:58:00 · 2216 阅读 · 0 评论 -
c语言知识1-sizeof and strlen
1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 2.sizeof是算符,strlen是函数。 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以/0结尾的。sizeof还可以用函数做参数,比如: short f();pri原创 2009-10-21 10:46:00 · 601 阅读 · 0 评论 -
read()系统调用的流程(转个贴)
read()系统调用的流程(转个贴) 这个哥们虽然有些和老师讲得有出入,但咱看着觉得还是很有用,原帖地址是http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=2202339,可惜写这个文章的老兄明显做好事不留名,连blog都bad request大部分程序员可能会有这样的疑问:当在程序中调用库函数 read 时,这个转载 2009-10-22 11:19:00 · 2250 阅读 · 0 评论 -
编译生成的kernel说明
1 vmlinux:说明:vmlinux是非压缩的ELF对象,并且包括symbols,comments,debug info(如果用-g编译) 在根目录下,会产生一个vmlinux , 这个是第一产生的image,它包括如下: arch/arm/kernel/head.o ----> head.S arch/arm/kernel/init-t原创 2010-01-20 17:03:00 · 1696 阅读 · 0 评论 -
如何分解uimage
bash$ mkimage -l uMulti Image Name: Linux-2.4.4-2003-04-05 Multiboot Created: Sun Apr 6 12:44:18 2003 Image Type: PowerPC Linux Multi-File Image (gzip compressed) Dat原创 2010-01-20 17:09:00 · 1459 阅读 · 0 评论 -
mdev的使用方法
因为以前做过一点hotplug的东西,使用是call_usermodehelper的方式。 mdev的使用方法和原理mdev是busybox自带的一个简化版的udev,适合于嵌入式的应用埸合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件。在以busybox为基础构建嵌入式linux的根文件系统时,使用它是最优的选转载 2010-01-27 17:04:00 · 1208 阅读 · 0 评论 -
setsockopt用法浅析
1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL)转载 2010-02-04 12:27:00 · 599 阅读 · 0 评论 -
ZERO PAGE removal influence
Codec Performance Differences between 2.6.19 and 2.6.24 kernel Xinyu Chen. Freescale Semiconductor Ltd. 25 Sep 2008 MostLinux kernel improvement or regression is to make翻译 2010-02-11 09:55:00 · 1066 阅读 · 0 评论 -
关于brk的系统调用疑问
brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的: 每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只分配并不大的数据段空间,程序中动态分配的空间就是从 这一块分配的。如果这块空间不够,malloc函数族(realloc,calloc等)就调用sbrk函数将数据段的下界移动,sbrk函数在内核的管 理下将虚拟地原创 2009-12-11 17:48:00 · 1200 阅读 · 0 评论 -
文件系统的mount参数分析
mountflags:MS_MGC_VAL等 最后一个参数data是传给文件系统解释的,如:”codepage=936,iocharset=cp936“有兴趣可以跟踪一下系统调用mount的流程(以vfat为例): sys_mount()-->do_mount()-->do_add_mount()-->do_ker原创 2010-03-11 16:33:00 · 1582 阅读 · 0 评论 -
linux的设备模型
上面分析了kobject.kset,ktype.这三个结构联合起来一起构成了整个设备模型的基石.而bus.device.device_driver.则是基于kobject.kset.ktype之上的架构.在这里,总线,设备,驱动被有序的组和在一起.Bus.device.device_driver三者之间的关系如下图所示: 如上图所示.struct bus_type的p-转载 2010-03-11 14:55:00 · 1105 阅读 · 0 评论 -
在linux下生成可执行文件和库文件
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Sty原创 2010-03-12 09:34:00 · 2826 阅读 · 0 评论 -
FTP中的NAT
最简单的NAT只需要修改IP头里面的IP地址,不过大多数的NAT还需要传输层里面的端口。而这里我们仅仅考虑后者。在这个时候,存在着一个问题,那就是如果应用层需要使用IP地址或者端口,该怎么办?当然,这仅仅是一个假设,许多应用不会用到网络层以及传输层里面的信息;还有一些应用会在应用层携带者IP或者端口信息,比如迅雷,但是没有它,天也不会塌下来;不过还有一些应用,非常需要它,如果没有它的话,当转载 2010-03-15 10:26:00 · 2358 阅读 · 0 评论 -
内核线程学习笔记总结1
kernel_thread函数的作用是产生一个新的线程内核线程实际上就是一个共享父进程地址空间的进程,它有自己的系统堆栈.内核线程和进程都是通过do_fork()函数来产生的,系统中规定的最大进程数与线程数由fork_init来决定:[/arch/kernel/process.c/fork_init()]void __init fork_init(unsigned转载 2010-03-16 10:54:00 · 1003 阅读 · 0 评论 -
内核线程学习笔记总结6
static int kthread(void *_create){ struct kthread_create_info *create = _create; int (*threadfn)(void *data); void *data; int ret = -EINTR; /* Copy data: its on kthreads原创 2010-03-16 11:37:00 · 766 阅读 · 0 评论 -
内核线程学习笔记总结2
#include linux/module.h>#include linux/kernel.h>#include linux/init.h>#include linux/sched.h>MODULE_AUTHOR("T-bagwell_CU");MODULE_LI转载 2010-03-16 11:05:00 · 983 阅读 · 0 评论 -
内核线程学习笔记总结3
可以在非内核线程中调用kernel_thread, 但这样创建的线程必须在自己调用daemonize(...)来释放资源, 成为真正的内核线程。 #include #include static int liyi_kernel_thread(void *dummy) { int i = 0; daemonize("liyi"); while(i++ pr原创 2010-03-16 11:08:00 · 983 阅读 · 0 评论 -
内核线程学习笔记总结5
struct task_struct *kthread_create(int (*threadfn)(void *data), void *data, const char namefmt[], ...){ struct kthread_create_info cr原创 2010-03-16 11:27:00 · 808 阅读 · 0 评论 -
linux2.6中的eventpoll filesystem学习1
最近把kernel升级到2。6,发现文件系统中对了个eventpoll filesystem 在网络上查找资料,aioselect/poll的缺点在于: 1.每次调用时要重复地从用户态读入参数。 2.每次调用时要重复地扫描文件描述符。 3.每次在调用开始时,要把当前进程放入各个文件描述符的等待队列。在调用结束后,又把进原创 2010-03-17 12:57:00 · 3988 阅读 · 0 评论 -
关于stun学习笔记1
STUN的全称是Simple Traversalof UDP Through Network Address translators,即UDP对NAT的简单穿越方式。应用程序(即STUN CLIENT)向NAT外的STUN SERVER通过UDP发送请求STUN 消息询问自身的转换后地址,STUN SERVER收到请求消息,产生响应消息,响应消息中携带请求消息的源端口,即STUN CLIENT在N原创 2010-03-23 09:46:00 · 2764 阅读 · 0 评论 -
stun学习笔记2
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Font原创 2010-03-23 09:51:00 · 1107 阅读 · 0 评论 -
nat断口转换(tcp)研究笔记1
tcp_unique_tuple(struct ip_conntrack_tuple *tuple, const struct ip_nat_range *range, enum ip_nat_manip_type maniptype, const struct ip_conntrack *原创 2010-03-23 09:55:00 · 1057 阅读 · 0 评论 -
linux进程通信的几种方式
linux融合了bsd,以及贝尔实验室的unix版本的通信方式(单机的进程通信):1.管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信; 2.信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,原创 2010-04-03 13:48:00 · 760 阅读 · 0 评论