morphling.huang
既然选择了远方,便只顾风雨兼程。
摘要: 主要分析do_basic_setup函数里面的do_initcalls()函数,这个函数用来调用所有编译内核的驱动模块中的初始化函数。static void __init do_initcalls(void){ initcall_t *call; for (call = __ea... 阅读全文
posted @ 2014-04-16 15:55 morphling.huang 阅读(395) 评论(0) 推荐(0) 编辑
摘要: SMP 是Symmetric Multi-Processing的意思,对称多处理器,一种多核结构,认为这些核是完全同构的,任务可以随便在任一个核上跑。UMA是Uniform Memory Access,统一内存访问,是指所有处理器一致的共享全部物理内存。NUMA是Non-Uniform Memory Access的意思,非统一内存访问,指处理器访问物理内存的时间依赖于该内存所在的物理位置。即在多处理器架构下,CPU访问共享内存的时间要比访问本地内存所需的时间长的多。 阅读全文
posted @ 2014-03-26 23:04 morphling.huang 阅读(805) 评论(0) 推荐(0) 编辑
摘要: -----以下内容为从网络上整理所得------主要介绍kernel_init线程(函数),这个线程在rest_init函数中被创建,kernel_init函数将完成设备驱动程序的初始化,并调用init_post函数启动用户空间的init进程。static int __init kernel_init(void * unused){ lock_kernel(); //锁住内核 set_mems_allowed(node_states[N_HIGH_MEMORY]); //init可以在任何节点(node)分配到内存页 set_cpus_allowed_ptr(curren... 阅读全文
posted @ 2014-03-26 22:17 morphling.huang 阅读(492) 评论(0) 推荐(0) 编辑
摘要: -----以下内容为从网络上整理所得------嵌入式Linux启动后,会先运行系统的bootloader,一般是用开源的U-boot;Broadcom芯片的bootloader则是自己公司的CFE。bootloader前面文章有大体介绍了一下,以下主要分析Linux内核的启动过程,以MIPS芯片为例。内核版本:2.6.31Bootloader将Linux内核映像拷贝到RAM中某个空闲地址处,然后一般有个内存移动操作,目的地址在arch/mips/Makefile内指定:load-$(CONFIG_MIPS_PB1550) += 0xFFFFFFFF80100000,则最终bootloader 阅读全文
posted @ 2014-03-14 17:04 morphling.huang 阅读(1208) 评论(0) 推荐(0) 编辑
摘要: 转载自:http://www.cnblogs.com/heaad/archive/2010/07/17/1779829.html1.1U-Boot工作过程U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下:(1)第一阶段的功能硬件设备初始化加载U-Boot第二阶段代码到RAM空间设置好栈跳转到第二阶段代码入口(2)第二阶段的功能初始化本阶段使用的硬件设备检测系统内存映射将内核从Flash读取到RAM中为内核设置启动参数调用内核1.1.1U-Boot启动第一阶段代码分析第一阶段对应的文件是cpu/arm920t/start.S和board/samsung/mini2440/lowle 阅读全文
posted @ 2014-03-11 10:23 morphling.huang 阅读(468) 评论(0) 推荐(0) 编辑
摘要: 原文链接:http://hi.baidu.com/_kouu/item/25787d38efec56637c034bd0什么是桥接?简单来说,桥接就是把一台机器上的若干个网络接口“连接”起来。其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去。以使得网口之间的报文能够互相转发。交换机就是这样一个设备,它有若干个网口,并且这些网口是桥接起来的。于是,与交换机相连的若干主机就能够通过交换机的报文转发而互相通信。如下图:主机A发送的报文被送到交换机S1的eth0口,由于eth0与eth1、eth2桥接在一起,故而报文被复制到eth1和eth2,并且发送出去,然后被主机B和交换机S2接收到。 阅读全文
posted @ 2013-12-04 22:49 morphling.huang 阅读(23605) 评论(0) 推荐(2) 编辑
摘要: 转自:http://www.douban.com/note/165931644/ 经常在调用linux 系统api 的时候会出现一些错误,比方说使用open() write() creat()之类的函数有些时候会返回-1,也就是调用失败,这个时候往往需要知道失败的原因。这个时候使用errno这个全局变量就相当有用了。在程序代码中包含 #include <errno.h>,然后每次程序调用失败的时候,系统会自动用用错误代码填充errno这个全局变量,这样你只需要读errno这个全局变量就可以获得失败原因了。例如: 1 #include <stdio.h> 2 #inclu 阅读全文
posted @ 2013-06-06 15:00 morphling.huang 阅读(493) 评论(0) 推荐(0) 编辑
摘要: 用ioctl获得本地ip地址时要用到两个结构体ifconf和ifreq,它们对于大多数人 来说都是比较陌生的,这里给大家一种比较简单的理解方法,当然只一种帮助 理解的方法,在描述中可能会有一些地方与真实定义有所出入,仅供参考.首先先认识一下ifconf和ifreq://ifconf通常是用来保存所有接口信息的 //if.h struct ifconf { int ifc_len; /* size of buffer */ union { char *ifcu_buf; /* input... 阅读全文
posted @ 2012-11-06 23:53 morphling.huang 阅读(352) 评论(0) 推荐(0) 编辑
摘要: 通常,一个用户程序使用ioctl (sockid,SIOCDEVPRIVATE,(char*)&ifr)来调用与某种设备(指像WaveLAN那样的特殊设备)相关的 ioctl命令,这里ifr是struct ifreq ifr形式的变量。用户程序应当在ifr.ifr_name中填充与这个设备相关的名字,例如,假设WaveLAN使用的接口号为eth1。一般的,一个 用户程序还需要与内核互相交换ioctl的command参数和结果,这可以通过ifr.ifr_data这个变量来实现,例如,想得到WaveLAN中 表示信号强度的信息时,可以通过返回这个变量来实现。Linux的源代码已经包括了两种 阅读全文
posted @ 2012-11-06 23:41 morphling.huang 阅读(693) 评论(0) 推荐(0) 编辑
摘要: 转自:http://yfydz.cublog.cnioctl 函数本函数影响由fd 参数引用的一个打开的文件。#include<unistd.h>int ioctl( int fd, int request, .../* void *arg */ );返回0 :成功-1 :出错第三个参数总是一个指针,但指针的类型依赖于request 参数。我们可以把和网络相关的请求划分为6 类:套接口操作文件操作接口操作ARP 高速缓存操作路由表操作流系统下表列出了网络相关ioctl 请求的request 参数以及arg 地址必须指向的数据类型:类别Request说明数据类型套接口SIOCATMA 阅读全文
posted @ 2012-11-06 23:33 morphling.huang 阅读(625) 评论(0) 推荐(0) 编辑