Linux嵌入式系统环境搭建、内核配置、最小系统启动与设备文件分析

Linux嵌入式系统环境搭建、内核配置、最小系统启动与设备文件分析
Linux嵌入式系统环境搭建、内核配置、最小系统启动与设备文件分析

Linux嵌入式系统设计与开发

1第一部分嵌入式系统开发环境

第一章嵌入式系统开发环境的搭建,以及相关工具的使用

1.1虚拟机+linux redhat9.0安装

1.1.1虚拟机软件的安装及配置。

虚拟机软件是一种可以在一台电脑上模拟出来若干台PC,每台PC可以运行单独操作系而互不干扰,实现一台电脑“同时”运行几个操作系统,还可以将这几个操作系统连成一个网络的软件。

采用VMware Workstation5.5例说明如何在windows创建一个虚拟机环境。

VMware Workstation安装后的界面如下:

创建一个虚拟机

选择linux

指定虚拟机存放的路径

选择网络配置

对于虚拟机的设备进行配置,这里采用虚拟光驱,指定安装linux镜像的路径

设备相关信息设置如下,启动虚拟机,开始安装。

进行linux安装

1.1.2Redhat9.0的安装。

注意不安装防火墙,采用workstation,确保服务samba,tftp,tfp,nfs,SSH,DHCP,telnet 都安装上。

1.2Linux系统服务的配置

配置系统服务时,要使防火墙关闭,或使其为低。

1.2.1网络配置

[root@localhost /]# setup 进入网络配置菜单,设置ip。

[root@localhost root]# service network restart 重启网络服务[root@localhost root]# ifconfig 察看网络配置1.2.2Tftp服务的配置

选择tftp服务

[root@localhost /]# setup

配置tftp服务目录

[root@localhost /]# vi /etc/xinetd.d/tftp

service tftp

{

disable = no

socket_type = dgram

protocol = udp

wait = yes

user = root

server = /usr/sbin/in.tftpd

server_args = -s /tftpboot

per_source = 11

cps = 100 2

}

启动tftp服务

[root@localhost /]# service xinetd restart

Stopping xinetd: [ OK ] Starting xinetd: [ OK ] 检测tftp服务

[root@localhost /]# netstat -a | grep tftp

udp 0 0 *:tftp *:*

1.2.3Samba服务器配置

选择samba服务

[root@localhost /]# setup

编辑smb.conf配置文件,

[root@localhost /]# vi /etc/samba/smb.conf

增加用户名以及共享路径,如下:

[homes]

comment = Home Directories

path = /

browseable = no

writable = yes

valid users = root

create mode = 0664

directory mode = 0775

[root@localhost /]#smbadduser root:admin

增加samba用户

[root@localhost /]# service smb restart

激活samba服务

[root@localhost /]# service smb status

察看samba服务

1.2.4telnet服务器配置

选择telnet服务

[root@localhost /]# vi /etc/pam.d/login

注释掉auth required /lib/security/pam_securetty.so 这句话

重启服务

[root@localhost /]# service xinetd restart

至此可以以root用户telnet登录

1.2.5nfs服务器配置

选择nfs服务

[root@localhost /]# vi /etc/exports

增加nfs服务输出的路径以及供给的ip地址,例如增加如下条目:

/home/nfsroot 192.168.230.128(rw,sync)

表示ip地址为192.168.230.128可以读写本机的目录/home/nfsroot

[root@localhost /]# service nfs restart

激活nfs服务

[root@localhost /]# service nfs status

察看nfs服务的状态

1.2.6DHCP服务器配置

注意:当配置DHCP服务时会对于局域网有影响,建议在虚拟机的环境下,网络设备选择Host-only工作方式,如果不是虚拟机,请把网络连接与局域网断开。

选择DHCP服务器

[root@localhost /]# cp /usr/share/doc/dhcp-3.0pl1/dhcpd.conf.sample /etc/dhcpd.conf

创建一个DHCP服务的配置文件

[root@localhost /]# vi /etc/dhcpd.conf

编辑dhcpd.conf配置DHCP服务,下面的例子实现了基本的配置,目的是为在虚拟机上实现linux内核在网络上的启动。本机的ip是192.168.230.129

ddns-update-style interim;

ignore client-updates;

subnet 192.168.230.0 netmask 255.255.255.0 {

# --- default gateway

option routers 192.168.230.129;

option subnet-mask 255.255.255.0;

option time-offset -18000; # Eastern Standard Time

range dynamic-bootp 192.168.230.120 192.168.230.128;

default-lease-time 21600;

max-lease-time 43200;

filename "/pxelinux.0";

#为实现通过网络启动加载的文件

# we want the nameserver to appear at a fixed address

}

[root@localhost /]# service dhcpd start

开启dhcp服务

[root@localhost /]# service dhcpd status

察看服务是否运行

1.2.7支持网络启动内核的配置方法

基本原理,实现网络启动必须支持PXE,PXE(Pre-boot Execution Environment)是由Intel 设计的协议,它可以使计算机通过网络启动。协议分为client和server两端,PXE client在网卡的ROM中,当计算机引导时,BIOS把PXE client调入内存执行,并显示出命令菜单,经用户选择后,PXE client将放置在远端的操作系统通过网络下载到本地运行。

PXE协议的成功运行需要解决以下两个问题:

l既然是通过网络传输,那么计算机在启动时,它的IP地址由谁来配置;

l通过什么协议下载Linux内核和根文件系统

对于第一个问题,可以通过DHCP Server解决,由DHCP server来给PXE client分配一个IP地址,DHCP Server是用来给DHCP Client动态分配IP地址的协议,不过由于这里是给PXE Client分配IP地址,所以在配置DHCP Server时,需要增加相应的PXE特有配置。

至于第二个问题,在PXE client所在的ROM中,已经存在了TFTP Client。PXE Client 使用TFTP Client,通过TFTP协议到TFTP Server上下载所需的文件。

1.2.7.1配置DHCP和tfpt服务,配置方式见以上描述。

1.2.7.2配置bootstrap

Bootstrap文件是可执行程序,它向用户提供简单的控制界面,并根据用户的选择,下载合适的Linux内核以及Linux根文件系统。bootstrap文件在dhcpd.conf中被指定为pxelinux.0文件,放置在/tftpboot。Linux内核以及Linux根文件系统也放置在/tftpboot。pxelinux.0在执行过程中,要读配置文件,所有的配置文件都放在/tftpboot/pxelinux.cfg/目录下。由于PXElinux具有为不同的PXE Client提供不同的Linux内核以及根文件系统的功能,所以要通过不同的配置文件名来区分出不同的PXE Client的需求。比如一个PXE Client由DHCP Server分配的IP地址为192.168.0.22,那么相对应的配置文件名为/tftpboot/pxelinux.cfg/C0A80016(注:C0A80016为IP地址192.168.0.22的十六进制表示)。如果找不到,就按照顺序C0A80016-> C0A8001-> C0A800-> C0A80-> C0A8-> C0A-> C0-> C->default查找配置文件。

[root@localhost /]# cp /usr/lib/syslinux/pxelinux.0 /tftpboot/

[root@localhost /]# cd /tftpboot/

[root@localhost tftpboot]# mkdir pxelinux.cfg

[root@localhost tftpboot]# cd pxelinux.cfg/

[root@localhost pxelinux.cfg]# vi default

default linux-boot

prompt 1

timeout 30

label linux-boot

kernel vmlinuz

append initrd=initrd devfs=nomount ramdisk_size=9216

把内核vmlinuz,initrd拷贝到/tftp下,这样当启动另外一个虚拟机,启动时按F12,即可进入网络启动。启动界面如下:

1.3交叉工具链的介绍与使用

1.3.1基础知识

交叉编译,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。

在主机平台上开发程序,并在这个平台上运行交叉编译器,编译我们的程序;而由交叉编译器生成的程序将在目的平台上运行。例如:

arm-linux,说明平台所使用的是arm体系结构,运行的操作系统是linux

1.3.2GNU 交叉工具链的下载

Arm工具链的官方下载地址:

ftp://https://www.360docs.net/doc/e312839314.html,/pub/arm-linux-/toolchain/cross2.95.3.tar.bz2

ftp://https://www.360docs.net/doc/e312839314.html,/pub/arm-linux-/toolchain/cross3.0.tar.bz2

ftp://https://www.360docs.net/doc/e312839314.html,/pub/arm-linux-/toolchain/cross3.2.tar.bz2

https://www.360docs.net/doc/e312839314.html,/download/projects/toolchain/ 可以下载arm-linux-gcc-3.4.1编译linux2.6的内核

1.3.3GNU交叉工具链的介绍以及使用

1.3.3.1常用工具介绍

arm-linux-as 编译ARM汇编程序

arm-linux-ar 把多个.o合并成一个.o或静态库(.a),

arm-linux-ranlib 为库文件建立索引,相当于arm-linux-ar –s

arm-linux-ld 连接器(Linker), 把多个.o或库文件连接成一个可执行文件

arm-linux-objdump 查看目标文件(.o)和库(.a)的信息

arm-linux-objcopy 转换可执行文件的格式

arm-linux-strip 去掉elf可执行文件的信息. 使可执行文件变小

arm-linux-readelf 读elf可执行文件的信息

arm-linux-gcc 编译.c或.S开头的C程序或汇编程序

arm-linux-nm 用来列出目标文件的符号清单

1.3.3.2主要工具的使用

1.3.3.

2.1arm-linux-gcc 的使用

1. 编译C文件,生成elf可执行文件

h1.c 源文件

#include

void hellofirst(void)

{

printf("The first hello! \n");

}

h2.c 源文件

#include

void hellosecond(void)

{

printf("The second hello! \n");

}

hello.c 源文件

#include

extern void hellosecond(void);

extern void hellofirst(void);

int main(int argc, char *argv[])

{

hellofirst();

hellosecond();

return(0);

}

编译以上3个文件,有如下几种方法:

方法1:

[root@localhost codetest]#arm-linux-gcc -c h1.c

[root@localhost codetest]#arm-linux-gcc -c h2.c

[root@localhost codetest]#arm-linux-gcc -o hello hello.c h1.o h2.o

方法2:

[root@localhost codetest]#arm-linux-gcc -c h1.c h2.c

[root@localhost codetest]#arm-linux-gcc -o hello hello.c h1.o h2.o

方法3:

[root@localhost codetest]#arm-linux-gcc -c -o h1.o h1.c

[root@localhost codetest]#arm-linux-gcc -c -o h1.o h1.c

[root@localhost codetest]#arm-linux-gcc -o hello hello.c h1.o h2.o

方法4:

[root@localhost codetest]#arm-linux-gcc -o hello hello.c h1.c h2.c

-c:只编译不连接。

-o:编译且连接。

2. 产生一个预处理文件,适合看一个宏在源文件中产生的结果。

[root@localhost codetest]#arm-linux-gcc -E h1.i h1.c

E:产生一个预处理文件.

1.3.3.

2.2arm-linux-ar 和arm-linux-ranlib 的使用

静态库是在编译时需要的库。

1. 建立一个静态库

[root@localhost codetest]#arm-linux-ar -r libhello.a h1.o h2.o

2. 为静态库建立索引

[root@localhost codetest]#arm-linux-ar -s libhello.a

[root@localhost codetest]#arm-linux-ranlib libhello.a

3. 由静态库产生可执行文件

[root@localhost codetest]#arm-linux-gcc -o hello hello.c libhello.a 1.3.3.2.3arm-linux-objdump 的使用

1. 查看静态库或.o文件的组成文件

[arm@localhost gcc]$ arm-linux-objdump -a libhello.a

2. 查看静态库或.o文件的组成部分的头部分

[arm@localhost gcc]$ arm-linux-objdump -h libhello.a

3. 把目标文件代码反汇编

[arm@localhost gcc]$ arm-linux-objdump -d libhello.a

1.3.3.

2.4arm-linux-readelf 的使用

1. 读elf文件开始的文件头部

[arm@localhost gcc]$ arm-linux-readelf -h hello

......

2. 读elf文件中所有ELF 的头部:

[root@localhost codetest]#arm-linux-readelf -e hello

......

3. 显示整个文件的符号表

[root@localhost codetest]#arm-linux-readelf -s hello

......

4. 显示使用的动态库

[root@localhost codetest]#arm-linux-readelf -d hello

......

1.3.3.

2.5arm-linux-strip 的使用

1. 移除所有的符号信息

[root@localhost codetest]#arm-linux-strip ––strip-all hello

strip-all:是移除所有符号信息

2. 移除调试符号信息

[root@localhost codetest]#arm-linux-strip -g hello

1.3.3.

2.6arm-linux-objcopy 的使用

生成可以执行的2进制代码

[root@localhost codetest]#arm-linux-objcopy -O binary hello hello.bin 1.3.3.2.7arm-linux-nm 的使用

列出目标文件的符号清单

[root@localhost codetest]#arm-linux-nm hello.o

1.4SSH Secure Shell客户端软件的安装及使用

实现更安全的远程登录,可进行ftp操作。

1.5串口终端Procomm Plus的使用

可以运行命令脚本,实现多个命令的自动运行

1.6使用Source insight进行代码阅读

Linux源代码阅读的利器

1.7文件比较工具Araxis Merge2001的使用

可以方便对比文件之间的差异

1.8文件编辑工具UltraEdit的使用

第二部分最小系统的启动

2第二章u-boot的移植

2.1u-boot介绍

Uboot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序, UBoot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。UBoot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。本文的代码取自于uboot1.1.4。

2.2获取u-boot

从下面地址下载uboot的源代码。

https://www.360docs.net/doc/e312839314.html,/projects/uboot

[uboot@localhost uboot]#tar xjvf uboot1.1.4.tar.bz2

[uboot@localhost uboot]#cd uboot1.1.4

2.3u-boot体系结构

1. 目录树

.

|board

|common

|cpu

|disk

|doc

|drivers

|dtt

|examples

|fs

|include

|lib_arm

|lib_generic

|lib_i386

|lib_m68k

|lib_microblaze

|lib_mips

|lib_nios

|lib_nios2

|lib_ppc

|net

|post

|rtc

`tools

2. board:和一些已有开发板有关的文件. 每一个开发板都以一个子目录出现在当前目录中,比如说:SMDK2410,子目录中存放与开发板相关的配置文件.

3. common:实现uboot命令行下支持的命令,每一条命令都对应一个文件。例如bootm

命令对应就是cmd_bootm.c。

4. cpu:与特定CPU架构相关目录,每一款Uboot下支持的CPU在该目录下对应一个子目录,比如有子目录arm920t等。

5. disk:对磁盘的支持。

6. doc:文档目录。Uboot有非常完善的文档,推荐大家参考阅读。

7. drivers:Uboot支持的设备驱动程序都放在该目录,比如各种网卡、支持CFI的Flash、串口和USB等。

8. fs: 支持的文件系统,Uboot现在支持cramfs、fat、fdos、jffs2和registerfs。

9. include:Uboot使用的头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。该目录下configs目录有与开发板相关的配置头文件,如smdk2410.h。该目录下的asm目录有与CPU体系结构相关的头文件,asm对应的是asmarm.9. lib_xxxx: 与体系结构相关的库文件。如与ARM相关的库放在lib_arm中。

10. net:与网络协议栈相关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。

11. tools:生成Uboot的工具,如:mkimage, crc等等。

2.4u-boot编译及配置

2.4.1u-boot的Makefile分析

u-boot的Makefile从功能上可以分成两个部分。一部分是用来编译生成uboot.bin文件;另一部分是用来执行每种board相关的配置。下面以smdk2410为例来说明作了哪些配置。

$make smdk2410_config

在shell执行以上命令,对应于Makefile执行的命令是

smdk2410_config : unconfig

@./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

首先执行如下命令,删除文件include/config.h include/config.mk board/*/config.tmp,后续会发现这些文件是如何建立的。

unconfig:

@rm -f include/config.h include/config.mk board/*/config.tmp

然后运行命令@./mkconfig $(@:_config=) arm arm920t smdk2410 NULL s3c24x0,mkconfig是脚本文件,传入的参数$1至$6分别为:smdk2410 arm arm920t smdk2410 NULL s3c24x0,根据传入的参数执行如下命令

cd ./include

rm –f asm

ln –s asm-arm asm

rm –f asm-arm/arch

ln –s arch-s3c24x0 asm-arm/arch

rm –f asm-arm/proc

ln –s proc-armv asm-arm/proc

生成文件config.mk,文件内容为:

ARCH = arm

CPU = arm920t

BOARD = smdk2410

SOC = s3c24x0

生成文件config.h,文件内容为:

/* Automatically generated - do not edit */

#include

至此make smdk2410_config的命令全部执行完毕。配置完成与board相关的信息,下面就可以编译此board的u-boot.bin文件,执行如下命令:

$make CROSS_COMPILE=arm-linux-

Makefile的执行首先包含include include/config.mk文件,获取ARCH CPU BOARD VENDOR SOC的定义,然后根据宏的配置编译指定的文件,最终生成u-boot.bin文件,执行流程请自行分析。

2.4.2u-boot.bin的生成

根据以上对于makefile的分析,u-boot.bin的生成分为两步。如下:

对于board进行配置:$make smdk2410_config

进行编译生成u-boot.bin:$make CROSS_COMPILE=arm-linux-

2.5u-boot的启动过程及工作原理

2.5.1启动模式介绍

大多数Boot Loader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。

启动加载(Boot loading)模式:这种模式也称为"自主"(Autonomous)模式。也即Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到RAM 中运行,整个过程并没有用户的介入。这种模式是BootLoader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。

下载(Downloading)模式:在这种模式下,目标机上的Boot Loader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被BootLoader 保存到目标机的RAM 中,然后再被BootLoader 写到目标机上的FLASH 类固态存储设备中。BootLoader 的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用BootLoader 的这种工作模式。工作于这种模式下的Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口。

UBoot这样功能强大的Boot Loader 同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。

大多数bootloader都分为阶段1(stage1)和阶段2(stage2)两大部分,uboot也不例外。依赖于CPU体系结构的代码(如CPU初始化代码等)通常都放在阶段1中且通常用汇编语言实现,而阶段2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。

2.5.2阶段1介绍

uboot的stage1代码通常放在start.s文件中,它用汇编语言写成,其主要代码部分如下:2.5.2.1定义入口

由于一个可执行的Image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。

1. board/smdk2410/uboot.lds: ENTRY(_start) ==> cpu/arm920t/start.o (.text)

2. uboot在ram的代码区(TEXT_BASE = 0x33F80000)定义在board/smdk2410/config.mk 2.5.2.2设置异常向量

.globl _start

_start: b reset

ldr pc, _undefined_instruction

ldr pc, _software_interrupt

ldr pc, _prefetch_abort

ldr pc, _data_abort

ldr pc, _not_used

ldr pc, _irq

ldr pc, _fiq

当发生异常时,执行cpu/arm920t/interrupts.c中定义的中断处理函数

2.5.2.3设置CPU 的模式为SVC 模式

mrs r0,cpsr

bic r0,r0,#0x1f

orr r0,r0,#0xd3

msr cpsr,r0

2.5.2.4关闭看门狗,禁掉所有中断,设置CPU 的频率

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)

ldr r0, =pWTCON

mov r1, #0x0

str r1, [r0]

/*

* mask all IRQs by setting all bits in the INTMR - default

*/

mov r1, #0xffffffff

ldr r0, =INTMSK

str r1, [r0]

# if defined(CONFIG_S3C2410)

ldr r1, =0x3ff

ldr r0, =INTSUBMSK

str r1, [r0]

# endif

/* FCLK:HCLK:PCLK = 1:2:4 */

/* default FCLK is 120 MHz ! */

ldr r0, =CLKDIVN

mov r1, #3

str r1, [r0]

#endif /* CONFIG_S3C2400 || CONFIG_S3C2410 */

2.5.2.5与内存管理相关寄存器的设置,cp15协处理器,配置内存区控制寄存器

cpu_init_crit:

/*

* flush v4 I/D caches

*/

mov r0, #0

mcr p15, 0, r0, c7, c7, 0 /* 失效I/D cache, 见S3C2410手册附录的2-16 */

mcr p15, 0, r0, c8, c7, 0 /* 失效TLB, 见S3C2410手册附录的2-18 */

/*

* disable MMU stuff and caches

*/

mrc p15, 0, r0, c1, c0, 0

bic r0, r0, #0x00002300 /* 清除bits 13, 9:8 (--V- --RS)

* Bit 8: Disable System Protection

* Bit 7: Disable ROM Protection

* Bit 13: 异常向量表基地址: 0x0000 0000

*/

bic r0, r0, #0x00000087 /* 清除bits 7, 2:0 (B--- -CAM)

* Bit 0: MMU disabled

* Bit 1: Alignment Fault checking disabled

* Bit 2: Data cache disabled

* Bit 7: 0 = Little-endian operation

*/

orr r0, r0, #0x00000002 @ set bit 2 (A) Align

orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache

mcr p15, 0, r0, c1, c0, 0

/*

* before relocating, we have to setup RAM timing

* because memory timing is board-dependend, you will

* find a lowlevel_init.S in your board directory.

*/

mov ip, lr

bl lowlevel_init /*寄存器的具体值的设置需要对总线周期及

外围芯片非常熟悉, 根据所采用的内存芯片确定*/

mov lr, ip

mov pc, lr

2.5.2.6把u-boot.lds定义的text段,rodata段,data段,got段,__u_boot_cmd_start

段搬移到ram区

#ifndef CONFIG_SKIP_RELOCA TE_UBOOT

relocate: /* relocate U-Boot to RAM */

adr r0, _start /* r0 <- current position of code */

ldr r1, _TEXT_BASE /* test if we run from flash or RAM */

cmp r0, r1 /* don't reloc during debug */

beq stack_setup

ldr r2, _armboot_start

ldr r3, _bss_start

sub r2, r3, r2 /* r2 <- size of armboot */

add r2, r0, r2 /* r2 <- source end address */

copy_loop:

ldmia r0!, {r3-r10} /* copy from source address [r0] */

stmia r1!, {r3-r10} /* copy to target address [r1] */

cmp r0, r2 /* until source end addreee [r2] */

ble copy_loop

#endif /* CONFIG_SKIP_RELOCA TE_UBOOT */

2.5.2.7建立stack空间

stack_setup:

ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */

sub r0, r0, #CFG_MALLOC_LEN /* malloc area */

sub r0, r0, #CFG_GBL_DA TA_SIZE /* bdinfo */ #ifdef CONFIG_USE_IRQ

sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)

#endif

sub sp, r0, #12 /* leave 3 words for abort-stack */

2.5.2.8bss段清0

clear_bss:

ldr r0, _bss_start /* find start of bss segment */

ldr r1, _bss_end /* stop here */

mov r2, #0x00000000 /* clear */

clbss_l:str r2, [r0] /* clear loop... */

add r0, r0, #4

cmp r0, r1

ble clbss_l

2.5.2.9进入C 代码部分

ldr pc, _start_armboot

_start_armboot: .word start_armboot

2.5.3阶段2的C语言代码部分

lib_arm/board.c中的start_armboot是C语言开始的函数,也是整个启动代码中C语言的主函数,同时还是整个

uboot(armboot)的主函数,该函数主要完成如下操作:

2.5.

3.1调用一系列的初始化函数

1. 指定初始函数表:

init_fnc_t *init_sequence[] = {

cpu_init, /* cpu的基本设置*/

board_init, /* 开发板的基本初始化*/

interrupt_init, /* 初始化中断*/

env_init, /* 初始化环境变量*/

init_baudrate, /* 初始化波特率*/

serial_init, /* 串口通讯初始化*/

console_init_f, /* 控制台初始化第一阶段*/

display_banner, /* 通知代码已经运行到该处*/

dram_init, /* 配制可用的内存区*/

display_dram_config,

#if defined(CONFIG_VCMA9) || defined (CONFIG_CMC_PU2)

checkboard,

#endif

NULL,

};

执行初始化函数的代码如下:

for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {

if ((*init_fnc_ptr)() != 0) {

hang ();

}

}

2. 配置可用的Flash区

flash_init ()

3. 初始化内存分配函数

mem_malloc_init()

4. nand flash初始化

#if (CONFIG_COMMANDS & CFG_CMD_NAND)

puts ("NAND:");

nand_init(); /* 初始化NAND */

5. 初始化环境变量

env_relocate ();

6. 外围设备初始化

devices_init()

7. I2C总线初始化

i2c_init();

8. LCD初始化

drv_lcd_init();

9. VIDEO初始化

drv_video_init();

10. 键盘初始化

drv_keyboard_init();

11. 系统初始化

drv_system_init();

2.5.

3.2初始化网络设备

初始化相关网络设备,填写IP、MAC地址等。

2.5.

3.3进入主UBOOT 命令行

进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应

的工作。

for (;;) {

main_loop (); /* 在common/main.c */

}

2.6u-boot命令使用说明

2.6.1命令配置

2.6.2命令帮助获取

通过help可以获得当前开发板的UBOOT中支持的命令.

# help

? - alias for 'help'

autoscr - run script from memory

base - print or set address offset

bdinfo - print Board Info structure

boot - boot default, i.e., run 'bootcmd'

bootd - boot default, i.e., run 'bootcmd'

bootelf - Boot from an ELF image in memory

bootm - boot application image from memory

bootp - boot image via network using BootP/TFTP protocol

bootvx - Boot vxWorks from an ELF image

cmp - memory compare

coninfo - print console devices and information

cp - memory copy

crc32 - checksum calculation

date - get/set/reset date & time

dcache - enable or disable data cache

echo - echo args to console

erase - erase FLASH memory

flinfo - print FLASH memory information

go - start application at address 'addr'

help - print online help

icache - enable or disable instruction cache

iminfo - print header information for application image

imls - list all images found in flash

itest - return true/false on integer compare

loadb - load binary file over serial line (kermit mode)

loads - load S-Record file over serial line

loop - infinite loop on address range

md - memory display

mm - memory modify (auto-incrementing)

mtest - simple RAM test

mw - memory write (fill)

nand - NAND sub-system

nboot - boot from NAND device

基于32位ARM920T内核的微处理器的嵌入式Linux系统构建详解

基于32位ARM920T内核的微处理器的嵌入式Linux系统构建详解目前,在嵌入式系统中基于ARM微核的嵌入式处理器已经成为市场主流。随着ARM技术的广泛应用,建立面向ARM构架的嵌入式操作系统成为当前研究的热点问题。 已经涌现出许多嵌入式操作系统,如VxWork,windows-CE,PalmOS,Linux等。在众多的嵌入式操作系统中,Linux以其开源代码及免费使用倍受开发人员的喜爱。本文选用的微处理器S3C2410是基于32位ARM920T内核的微处理器,基于此处理器构造一Linux 嵌入式操作系统,将其移植到基于32位的ARM920T内核的系统中,在此基础上进行应用程序开发。 l、开发环境介绍 1.1、基于S3C2410ARM920T的硬件平台 该系统的硬件平台为深圳旋极公司提供,硬件的核心部件为三星$3C2410ARM920T芯片,外围还包括:64MNANDFLASH和RAM外围存储芯片;串口、网口和USB外围接口;CSTNLCD和触摸屏外围显示设备;UDAl34lTS的外围音频设备。S3C2410处理器和外围设备共同构成了基于ARM920T的开发板。 1.2、嵌入式Limlx软件系统 该嵌入式Linux的软件系统包括以下4个部分:引导加载程序vivi;Linux2.6.14内核;YAFFS2文件系统以及用户程序。他们的可执行映像依次存放在系统存储设备上. 与通常的嵌入式系统布局有所不同,本系统在引导加载程序和内核映像之间还增加了一个启动参数区,在这个区里存放着系统启动参数。引导加载程序通过调用这些参数来决定启动模式、启动等待时间等,这些启动参数的增加加强了系统的灵活性。本系统采用64MNANDFLASH的存储设备。 2、嵌入式Linux系统设计与实现 2.1、引导加载程序vivi

LInux 嵌入式操作系统期末试题

1.简答题:请简单概括什么是嵌入式系统、并举出嵌入式系统的特点;(6分) 答: 嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可剪裁,适用于应用系统,对功能、可靠性、成本、体积、功耗等方面有特殊要求的专用计算机系统; 其特点如下: (1)嵌入式系统是面向特定系统应用的。 (2)嵌入式系统涉及计算机技术、微电子技术、电子技术、通信和软件等各个行业; 是一个技术密集、资金密集、高度分散、不断创新的知识集成系统; (3)嵌入式系统的硬件和软件都必须具有高度可定制性;只有这样才能适应嵌入式系 统应用的需要,在产品价格和性能方面具备竞争力; (4)嵌入式系统的生命周期相当长。 (5)嵌入式系统不具备本地系统开发能力,通常需要有一套专门的开发工具和环境。 2.嵌入式操作系统的优势:1.低成本开发系统 2.可应用多种硬件平台 3.可定制内核 4. 性能优异 5.良好的网络支持 3.linux文件类型:1.普通文件 2.目录文件 3.链接文件 4.设备文件 a.块设备文件(硬 盘:/dev/hda1)b.字符设备(串行端口接口设备) 4.linux文件属性:访问权限:r:可读w:可写x:可执行用户级别:u:文件拥有者g:所 属用户组 o:其他用户第一个字符显示文件类型:-普通d目录 l 链接… 5.简答题:(6分) linux目录结构:/bin 存放linux常用操作命令的执行文件(二进制文件) /boot 操作系统启动时所需要的程序 /dev Linux系统中使用的外部设备 /etc 系统管理时所需要的各种配置文件和子目录 /etc/rc.d Linux启动和关闭时要用到的脚本 /etc/rc.d/init Linux默认服务的启动脚本 /home 系统中默认用户工作根目录 /lib 存放系统动态链接共享库 /mnt软驱、光驱、硬盘的挂载点 /proc存放系统核心与执行程序所需信息、 /root超级用户登陆时的主目录 /sbin 存放管理员常用系统管理程序 /usr存放用户应用程序和文件 /var存放日志信息(答六点即可) 6.编写一个shell文件:创建studen01 –student30这30个用户,用户组为class1,之 后编写shell文件,删除所有用户

探究linux内核,超详细解析子系统

探究linux内核,超详细解析子系统 Perface 前面已经写过一篇《嵌入式linux内核的五个子系统》,概括性比较强,也比较简略,现在对其进行补充说明。 仅留此笔记,待日后查看及补充!Linux内核的子系统 内核是操作系统的核心。Linux内核提供很多基本功能,如虚拟内存、多任务、共享库、需求加载、共享写时拷贝(Copy-On-Write)以及网络功能等。增加各种不同功能导致内核代码不断增加。 Linux内核把不同功能分成不同的子系统的方法,通过一种整体的结构把各种功能集合在一起,提高了工作效率。同时还提供动态加载模块的方式,为动态修改内核功能提供了灵活性。系统调用接口用户程序通过软件中断后,调用系统内核提供的功能,这个在用户空间和内核提供的服务之间的接口称为系统调用。系统调用是Linux内核提供的,用户空间无法直接使用系统调用。在用户进程使用系统调用必须跨越应用程序和内核的界限。Linux内核向用户提供了统一的系统调用接口,但是在不同处理器上系统调用的方法

各不相同。Linux内核提供了大量的系统调用,现在从系统 调用的基本原理出发探究Linux系统调用的方法。这是在一个用户进程中通过GNU C库进行的系统调用示意图,系 统调用通过同一个入口点传入内核。以i386体系结构为例,约定使用EAX寄存器标记系统调用。 当加载了系统C库调用的索引和参数时,就会调用0x80软件中断,它将执行system_call函数,这个函数按照EAX 寄存器内容的标示处理所有的系统调用。经过几个单元测试,会使用EAX寄存器的内容的索引查system_call_table表得到系统调用的入口,然后执行系统调用。从系统调用返回后,最终执行system_exit,并调用resume_userspace函数返回用户空间。 linux内核系统调用的核心是系统多路分解表。最终通过EAX寄存器的系统调用标识和索引值从对应的系统调用表 中查出对应系统调用的入口地址,然后执行系统调用。 linux系统调用并不单层的调用关系,有的系统调用会由

linux下jdk安装及环境变量的配置

1.先准备好jdk ,制作iso 映像文件。 jdk 下载: https://www.360docs.net/doc/e312839314.html,/technetwork/java/javase/downloads /java-se-jdk-7-download-432154.html 2.在虚拟机中设置加载光驱iso 文件。(注意要启动光驱) 3.进入客户机系统,使用命令mount /mnt/cdrom 加载光驱到cdrom ,在使用cp 命令将cdrom 中的jdk 文件复制到home 文件夹中,用命令./jdk1.6.0_34运行即可。 1.修改/etc/profile 文件

如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的shell 都有权使用这些环境变量,但可能会给系统带来安全性问题。 (1)用文本编辑器打开/etc/profile (2)在profile 文件末尾加入: JAVA_HOME=/usr/share/jdk1.5.0_05 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOM E/lib/tools.jar export JAVA_HOME export PATH export CLASSPATH (3)重新登录 注解: a. 你要将 /usr/share/jdk1.5.0_05jdk 改为你的jdk 安装目录 等同于CLASSPATH=.:$JAVA_HOM E/jre/lib/rt.jar

b. linux下用冒号“:”来分隔路径 c. $PATH / $CLASSPATH / $JAVA_HOME 是用来引用原来的环境变量的值,在设置环境变量时特别要注意不能把原来的值给覆盖掉了,这是一种常见的错误。 d. CLASSPATH中当前目录“.”不能丢,把当前目录丢掉也是常见的错误。 e. export是把这三个变量导出为全局变量。 f. 大小写必须严格区分。 2. 修改.bashrc文件 这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别,如果你需要给某个用户权限使用这些环境变量,你只需要修改其个人用户主目录下的.bashrc文件就可以了。 (1)用文本编辑器打开用户目录下的.bashrc文件 (2)在.bashrc文件末尾加入: set JAVA_HOME=/usr/share/jdk1.5.0_05 export JAVA_HOME set PATH=$JAVA_HOME/bin:$PATH

嵌入式Linux内核移植详解(顶嵌)

内核移植阶段 内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的,所以内核通常提供一种硬件抽象的方法来完成这些操作。硬件抽象隐藏了复杂性,为应用软件和硬件提供了一套简洁,统一的接口,使程序设计更为简单。 内核和用户界面共同为用户提供了操作计算机的方便方式。也就是我们在windows下看到的操作系统了。由于内核的源码提供了非常广泛的硬件支持,通用性很好,所以移植起来就方便了许多,我们需要做的就是针对我们要移植的对象,对内核源码进行相应的配置,如果出现内核源码中不支持的硬件这时就需要我们自己添加相应的驱动程序了。 一.移植准备 1. 目标板 我们还是选用之前bootloader移植选用的开发板参数请参考上文的地址: https://www.360docs.net/doc/e312839314.html,/thread-80832-5-1.html。bootloader移植准备。 2. 内核源码 这里我们选用比较新的内核源码版本linux-2.6.25.8,他的下载地址是 ftp://https://www.360docs.net/doc/e312839314.html,/pub/linux/kernel/v2.6/linux-2.6.25.8.tar.bz2。 3. 烧写工具 我们选用网口进行烧写这就需要内核在才裁剪的时候要对网卡进行支持 4. 知识储备 要进行内核裁剪不可缺少的是要对内核源码的目录结构有一定的了解这里进 行简单介绍。 (1)arch/: arch子目录包括了所有和体系结构相关的核心代码。它的每一个子 目录都代表一种支持的体系结构,例如i386就是关于intel cpu及与之相兼容体 系结构的子目录。PC机一般都基于此目录。 (2)block/:部分块设备驱动程序。 (3)crypto:常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验 算法。 (4) documentation/:文档目录,没有内核代码,只是一套有用的文档。 (5) drivers/:放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目 录:如,/block 下为块设备驱动程序,比如ide(ide.c)。 (6)fs/:所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持 一个文件系统, 例如fat和ext2。

Linux安装与环境配置

实验一Linux安装与环境配置 【实验目的】 1.了解Linux系统的特点,掌握Linux的安装方法; 2.理解虚拟机、虚拟系统、虚拟终端等概念; 3.理解Linux系统的内核版本和发行版本; 4.了解超级用户和普通用户的权限差别; 5.熟悉系统登录、注销、重启和关机。 【实验内容】 1.安装VMware Workstation。 VMware可以虚拟现有任何操作系统,只要真实主机的配置允许,还可以虚拟多个系统。 2.新建虚拟机。 按“新建虚拟机向导”可顺利完成虚拟机安装。安装过程中注意以下选项: (1)虚拟机配置 选“自定义”,以便后面可以自行规划设备,内存和硬盘容量等。 (2)虚拟机内存 VMWare本身不占用太大内存,但处于开启状态的虚拟机会占用较大内存,占用内存量由配置决定,建议直接使用“推荐配置”。临时挂起虚拟机或关闭虚拟机,这些内存会立即释放。 (3)网络类型 网络类型有四个选项,分别为: ●使用桥接网络:通过你的计算机中的一块以太网适配器卡直接连接到一个本地 以太网。 ●使用网络地址翻译(NA T):允许客户操作系统使用主机的IP 地址访问主机的 拨号或者外部以太网连接。 ●使用仅为主机网络:通过一个虚拟网络从内部连接客户操作系统到主机。 ●不使用一个网络连接。 前三个选项中可先任选一个,之后配置网络的时候再改。但勿选最后一个,否则将无法创建网络。 (4)指定磁盘容量 第一项定义磁盘大小。第二项允许虚拟机无限使用磁盘空间,但需要真实磁盘足够大。第三项限制了每块虚拟磁盘的最大容量为2G。 在VMware安装目录下就有一个vmware-vdiskmanager.exe程序,它是一个命令行工具,可用来修改虚拟机硬盘的大小。 (5)创建一块磁盘 第一次建立虚拟机时,一般选择第一项,第二项适用于建立第二个或更多虚拟机,即使用已经建立好的虚拟机磁盘,这样可以减少虚拟机占用的真实磁盘空间。第三项允许虚拟机直接读写磁盘空间,慎选!适合熟悉使用磁盘的高级用户,如果操作失误会把真实磁盘里的内容删掉。

linux内核IMQ源码实现分析

本文档的Copyleft归wwwlkk所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。 E-mail: wwwlkk@https://www.360docs.net/doc/e312839314.html, 来源: https://www.360docs.net/doc/e312839314.html,/?business&aid=6&un=wwwlkk#7 linux2.6.35内核IMQ源码实现分析 (1)数据包截留并重新注入协议栈技术 (1) (2)及时处理数据包技术 (2) (3)IMQ设备数据包重新注入协议栈流程 (4) (4)IMQ截留数据包流程 (4) (5)IMQ在软中断中及时将数据包重新注入协议栈 (7) (6)结束语 (9) 前言:IMQ用于入口流量整形和全局的流量控制,IMQ的配置是很简单的,但很少人分析过IMQ的内核实现,网络上也没有IMQ的源码分析文档,为了搞清楚IMQ的性能,稳定性,以及借鉴IMQ的技术,本文分析了IMQ的内核实现机制。 首先揭示IMQ的核心技术: 1.如何从协议栈中截留数据包,并能把数据包重新注入协议栈。 2.如何做到及时的将数据包重新注入协议栈。 实际上linux的标准内核已经解决了以上2个技术难点,第1个技术可以在NF_QUEUE机制中看到,第二个技术可以在发包软中断中看到。下面先介绍这2个技术。 (1)数据包截留并重新注入协议栈技术

(2)及时处理数据包技术 QoS有个技术难点:将数据包入队,然后发送队列中合适的数据包,那么如何做到队列中的数

激活状态的队列是否能保证队列中的数据包被及时的发送吗?接下来看一下,激活状态的队列的 证了数据包会被及时的发送。 这是linux内核发送软中断的机制,IMQ就是利用了这个机制,不同点在于:正常的发送队列是将数据包发送给网卡驱动,而IMQ队列是将数据包发送给okfn函数。

linux下配置android开发环境(图解)

linux下配置android开发环境(Fedora) 1、将配置环境所需要的:jdk、android-sdk、eclipse安装包拷贝到/home目录下,并为为文件增加可修改可执行权限 2、安装JDK 3、配置JDK环境变量 (1)进入profile文件 (2)按i编辑,如下: (3)、按ESC,再按:wq 保存退出 4、安装android sdk 5、安装eclipse 6、运行eclipse

7、安装Eclipse的ADT 插件(开发android应用) (1)离线安装:启动Eclipse,选择Help > Install New Software,在出现的对话框里,点击Add按钮,在对话框的name一栏输入“ADT”(可随意),点击Archive...,选择已下载的ADT插件(ADT-0.9.7.zip)压缩文件。 (2)在线安装:点击Archive,地址栏中输入:https://https://www.360docs.net/doc/e312839314.html,/android/eclipse(如有问题,去掉s,用http) 8、安装完ADT后,会有如下提示:

(1)选择“Apply Changes Now”,会自动联网下载安装android SDK (2)选择“Restart Now”,重新启动eclipse,需手动安装android sdk window->preferences,左边点击android,右边SDK Location中选择Android SDK所在位置。安装模拟器平台:window->Android manager 在线下载不同版本的Android模拟器 如果有已存在的android sdk,可以直接指定: 9、虚拟手机创建 (1)Windows→A VD Manager→new 新建虚拟手机 name:随意; Target:选择平台,即android模拟器 SD card:用于存储文件,

嵌入式Linux系统的搭建与配置过程

1.摘要 (2) 2.UBOOT,LINUX内核,文件系统的介绍及相互关系..3 2.1嵌入式系统简介 (3) 2.2嵌入式Linux概述 (3) 2.3UBOOT简介 (4) 3.UBOOT的启动过程 (6) 4.内核的主要功能和裁剪 (7) 4.1Linux的编译 (7) 4.2嵌入式Linux的配置和剪裁 (8) 5.文件系统的制作过程 (8) 6.交叉编译器的搭建和环境变量的设置 (9) 7.驱动程序的编写过程与关键点 (11) 7.1Linux网络驱动程序的结构 (11) 7.2网络驱动程序的基本方法 (12) 7.3网络驱动程序中用到的数据结构 (12) 7.4常用的系统支持 (14) 7.5编写Linux网络驱动程序中需要注意的问题 (18) 8.参考文献 (20)

嵌入式系统是以应用为中心,以计算机为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。嵌入式系统一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序4部分组成,用于实现对其它设备的控制、监视或管理等功能。其广泛应用于控制领域、消费电子产品等行业,已成为现代电子领域的重要研究方向之一。嵌入式Linux的研究已经成为当前信息技术研究的热点,它的应用蕴含着巨大的商业价值,并且己经广泛的应用于各种信息家电、通讯产品、工业控制中。论文首先介绍了ARM和嵌入式Linux操作系统的特点和当前的发展概况。然后阐述了嵌入式Linux 开发流程以及移植到具体硬件平台需要完成的工作,如U-Boot的移植、Linux内核的编译与裁剪、文件系统的制作、驱动程序的编写等。 关键字:嵌入式;ARM;嵌入式Linux;Linux内核;驱动程序

LInux嵌入式操作系统期末试题

简答题:请简单概括什么是嵌入式系统、并举出嵌入式系统的特点;(6分) 答: 嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可剪裁,适用于应用系统,对功能、可靠性、成本、体积、功耗等方面有特殊要求的专用计算机系统; 其特点如下: (1)嵌入式系统是面向特定系统应用的。 (2)嵌入式系统涉及计算机技术、微电子技术、电子技术、通信和软件等各个行业; 是一个技术密集、资金密集、高度分散、不断创新的知识集成系统; (3)嵌入式系统的硬件和软件都必须具有高度可定制性;只有这样才能适应嵌入式系统应用的需要,在产 品价格和性能方面具备竞争力; (4)嵌入式系统的生命周期相当长。 (5)嵌入式系统不具备本地系统开发能力,通常需要有一套专门的开发工具和环境。 嵌入式操作系统的优势:1.低成本开发系统 2.可应用多种硬件平台 3.可定制内核 4.性能优异 5.良好的网络支持 linux文件类型:1.普通文件2.目录文件3.链接文件4.设备文件a.块设备文件(硬盘:/dev/hda1)b.字符设备(串行端口接口设备) linux文件属性:访问权限:r:可读w:可写x:可执行用户级别:u:文件拥有者g:所属用户组o:其他用户第一个字符显示文件类型:- 普通 d 目录 l 链接… 简答题:(6分) linux目录结构:/bin 存放linux常用操作命令的执行文件(二进制文件) /boot 操作系统启动时所需要的程序 /dev Linux系统中使用的外部设备 /etc 系统管理时所需要的各种配置文件和子目录 /etc/rc.d Linux启动和关闭时要用到的脚本 /etc/rc.d/init Linux默认服务的启动脚本 /home 系统中默认用户工作根目录 /lib 存放系统动态链接共享库 /mnt软驱、光驱、硬盘的挂载点 /proc存放系统核心与执行程序所需信息、 /root超级用户登陆时的主目录 /sbin 存放管理员常用系统管理程序 /usr存放用户应用程序和文件 /var存放日志信息(答六点即可) 编写一个shell文件:创建studen01 –student30这30个用户,用户组为class1,之后编写shell文件,删除所有用户 操作步骤:1.打开Terminal(终端): 2.输入vi shell 3.输入i 进入编辑模式 4.输入 #!/bin/bash groupadd class1 for((i=1;i<10;i++)) do username=student0$i

Linux内核结构详解教程

Linux内核结构详解教程 ─────Linux内核教程 linux内核就像人的心脏,灵魂,指挥中心。 内核是一个操作系统的核心,它负责管理系统的进程,内存,设备驱动程序,文件和网络系统,决定着系统的性能和稳定性。内核以独占的方式执行最底层任务,保证系统正常运行。协调多个并发进程,管理进程使用的内存,使它们相互之间不产生冲突,满足进程访问磁盘的请求等等. 严格说Linux并不能称做一个完整的操作系统.我们安装时通常所说的Linux,是有很多集合组成的.应称为GNU/Linux. 一个Linux内核很少1.2M左右,一张软盘就能放下. 内容基础,语言简短简洁 红联Linux论坛是致力于Linux技术讨论的站点,目前网站收录的文章及教程基本能满足不同水平的朋友学习。 红联Linux门户: https://www.360docs.net/doc/e312839314.html, 红联Linux论坛: https://www.360docs.net/doc/e312839314.html,/bbs 红联Linux 论坛大全,所有致力点都体现在这 https://www.360docs.net/doc/e312839314.html,/bbs/rf/linux/07.htm

目录 Linux内核结构详解 Linux内核主要五个子系统详解 各个子系统之间的依赖关系 系统数据结构 Linux的具体结构 Linux内核源代码 Linux 内核源代码的结构 从何处开始阅读源代码 海量Linux技术文章

Linux内核结构详解 发布时间:2006-11-16 19:05:29 Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。

Linux内核主要五个子系统详解 发布时间:2006-11-16 19:05:54 1.进程调度(SCHED):控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。 2.内存管理(MM)允许多个进程安全的共享主内存区域。Linux的内存管理支持虚拟内存,即在计算机中运行的程序,其代码,数据,堆栈的总量可以超过实际内存的大小,操作系统只是把当前使用的程序块保留在内存中,其余的程序块则保留在磁盘中。必要时,操作系统负责在磁盘和内存间交换程序块。内存管理从逻辑上分为硬件无关部分和硬件有关部分。硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。 3.虚拟文件系统(VirtualFileSystem,VFS)隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指Linux所支持的文件系统,如ext2,fat等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。 4.网络接口(NET)提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。 5.进程间通讯(IPC) 支持进程间各种通信机制。 处于中心位置的进程调度,所有其它的子系统都依赖它,因为每个子系统都需要挂起或恢复进程。一般情况下,当一个进程等待硬件操作完成时,它被挂起;当操作真正完成时,进程被恢复执行。例如,当一个进程通过网络发送一条消息时,网络接口需要挂起发送进程,直到硬件成功地完成消息的发送,当消息被成功的发送出去以后,网络接口给进程返回一个代码,表示操作的成功或失败。其他子系统以相似的理由依赖于进程调度。

Sure HA 双机linux环境配置手册(镜像型)

Sure HA 双机linux环境配置手册(镜像型) 一、基础环境设置 1、设置IP ,请在两个服务器上分别进行操作 host1:公网IP:192.168.2.101 私网IP:192.168.20.101 host2: 公网IP :192.168.2.102 私网IP :192.168.20.102 修改IP的方法为: vi /etc/sysconfig/network/ifcfg-eth0 vi /etc/sysconfig/network/ifcfg-eth1 eth0修改后的结果 eth1修改后的结果 查看并确认IP地址

2、设置/etc/HOSTNAME,请在两个服务器上分别进行操作 vi /etc/HOSTNAME 修改主机名为:host1 查看修改后的结果为: 重启后hostname才能生效 3、查看防火墙的状态,如果是打开状态则关闭防火墙,请在两个服务器上分别进行操作chkconfig --list |grep firewall 注:list前面是两个短线-- 关闭防火墙 chkconfig SuSEfirewall2_setup off chkconfig SuSEfirewall2_init off SuSEfirewall2 stop 4、设置/etc/hosts,请在两个服务器上分别进行操作 修改/etc/hosts文件,内容如下

5、设置硬盘分区,请在两个服务器上分别进行操作 说明:在本文环境中只有两个主分区,故在下文中首先新建了一个扩展分区,然后建立了一个20M的cluster分区,剩余的分区划分成数据分区。 关于fdisk的基础知识,n:新建分区,p:主分区,e:扩展分区,l:逻辑分区,w:把修改写入分区表 1.查看硬盘分区 对/dev/sda进行分区 fdisk /dev/sda 输入n,然后选择e,建立扩展分区,输入分区号3(1和2已经被使用)分区大小选择默认,直接两次回车即可

linux系统环境部署

Jdk安装 1. 登录Linux,切换到root用户 su root 获取root用户权限,当前工作目录不变(需要root密码) 或 sudo -i 不需要root密码直接切换成root(需要当前用户密码) 2. 在usr目录下建立java安装目录 cd /usr mkdir java 3.将jdk-8u60-linux-x6 4.tar.gz拷贝到java目录下 cp /mnt/hgfs/linux/jdk-8u60-linux-x64.tar.gz /usr/java/ 4.解压jdk到当前目录 tar -zxvf jdk-8u60-linux-x64.tar.gz

得到文件夹jdk1.8.0_60 5.安装完毕为他建立一个链接以节省目录长度(我没用这一步) ln -s /usr/java/jdk1.8.0_60/ /usr/jdk 6.编辑配置文件,配置环境变量 vim /etc/profile 添加如下内容:JAVA_HOME根据实际目录来 JAVA_HOME=/usr/java/jdk1.8.0_60 CLASSPATH=$JAVA_HOME/lib/ PATH=$PATH:$JAVA_HOME/bin export PATH JAVA_HOME CLASSPATH 7.重启机器或执行命令:source /etc/profile sudo shutdown -r now 8.查看安装情况 java -version java version "1.8.0_60" Java(TM) SE Runtime Environment (build 1.8.0_60-b27) Java HotSpot(TM) Client VM (build 25.60-b23, mixed mode)

ubuntu下linux 开发环境的搭建以及arm平台的移植

Linux开发环境的搭建 1.arm交叉编译链的安装 2.NFS服务器的安装 3.tftp服务器的安装 4.触摸屏驱动库的安装编译 5.编译安装qt-everywhere-opensource-src-4.8.1 需要的文件及库: 1.arm-2009q1-203-arm-none-linux-gnueabi 2.fs.tar.gz 3.tslib-1.4 4.qt-everywhere-opensource-src-4.8.1 1.arm交叉编译链的安装 见附录6:arm-2009q1-203-arm-none-linux-gnueabi安装 测试交叉编译器是否安装成功,执行如下命令: HOST $ arm-none-linux-gnueabi-gcc -v 如果显示编译器的版本信息说明安装成功。 2.NFS服务器的安装 见附录7: 安装完成后,在/home/wws/目录下执行如下指令: sudo gedit nfs.sh nfs.sh的内容如下: HOST $ sudo /etc/init.d/portmap restart HOST $ sudo /etc/init.d/nfs-kernel-server restart 保存后执行 source nfs.sh 以后只要在主目录下执行上述source命令就可以重启nfs服务器 测试 NFS 服务器是否安装成功,执行如下命令: HOST $ showmount -e 若显示 /home/wws/wws_nfs*则说明安装成功。 3.tftp服务器的安装 具体安装过程见附录8: 安装完成后,执行: sudo gedit tftp.sh其内容如下: HOST $ sudo /etc/init.d/xinetd restart HOST $ sudo /etc/init.d/tftpd-hpa restart 保存在主目录下,当开发板找不到链接,出现T T T T.......等时,无需重启系统,只需执行source tftp.sh重启tftp服务器即可,或者直接执行上述两条指令来重启服务器。 4.触摸屏驱动库的安装编译 Tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触摸屏容易存在点击不准确、有抖动等问题。

Linux内核分析-网络[五]:网桥

看完了路由表,重新回到netif_receive_skb ()函数,在提交给上层协议处理前,会执行下面一句,这就是网桥的相关操作,也是这篇要讲解的容。 view plaincopy to clipboardprint? 1. s kb = handle_bridge(skb, &pt_prev, &ret, orig_dev); 网桥可以简单理解为交换机,以下图为例,一台linux机器可以看作网桥和路由的结合,网桥将物理上的两个局域网LAN1、LAN2当作一个局域网处理,路由连接了两个子网1.0和2.0。从eth0和eth1网卡收到的报文在Bridge模块中会被处理成是由Bridge收到的,因此Bridge也相当于一个虚拟网卡。 STP五种状态 DISABLED BLOCKING LISTENING LEARNING FORWARDING 创建新的网桥br_add_bridge [net\bridge\br_if.c] 当使用SIOCBRADDBR调用ioctl时,会创建新的网桥br_add_bridge。 首先是创建新的网桥: view plaincopy to clipboardprint?

1. d ev = new_bridge_dev(net, name); 然后设置dev->dev.type为br_type,而br_type是个全局变量,只初始化了一个名字变量 view plaincopy to clipboardprint? 1. S ET_NETDEV_DEVTYPE(dev, &br_type); 2. s tatic struct device_type br_type = { 3. .name = "bridge", 4. }; 然后注册新创建的设备dev,网桥就相当一个虚拟网卡设备,注册过的设备用ifconfig 就可查看到: view plaincopy to clipboardprint? 1. r et = register_netdevice(dev); 最后在sysfs文件系统中也创建相应项,便于查看和管理: view plaincopy to clipboardprint? 1. r et = br_sysfs_addbr(dev); 将端口加入网桥br_add_if() [net\bridge\br_if.c] 当使用SIOCBRADDIF调用ioctl时,会向网卡加入新的端口br_add_if。 创建新的net_bridge_port p,会从br->port_list中分配一个未用的port_no,p->br会指向br,p->state设为BR_STATE_DISABLED。这里的p实际代表的就是网卡设备。 view plaincopy to clipboardprint? 1. p = new_nbp(br, dev); 将新创建的p加入CAM表中,CAM表是用来记录mac地址与物理端口的对应关系;而刚刚创建了p,因此也要加入CAM表中,并且该表项应是local的[关系如下图],可以看到,CAM表在实现中作为net_bridge的hash表,以addr作为hash值,链入 net_bridge_fdb_entry,再由它的dst指向net_bridge_port。

Ubuntu linux驱动安装及3D桌面启用

系统需求 ?硬件及软件环境需求 启用3D桌面的硬件,显卡推荐使用Nvidia及ATI主流独立显卡,对于 Intel显卡、集成显卡、老旧显卡、以及最后刚新推出市场的新显卡,可能不适于使用本文的“最简便的驱动安装方法(经测试,Intel G965集成显卡3100在Ubuntu 8.04上会自动安装好显卡驱动,可以安装启用 Compiz 3D桌面效果)”,如果Ubuntu系统自带的"非受限驱动"安装不成功,请另行查找解决方案。CPU和内存自然是越高配置越好。 本文已在Ubuntu 8.04和8.10上测试通过,适用于i386,amd64及DVD 版本 ?网络环境 本文涉及到的软件需要系统联入互联网下载安装,请确保系统已联入网络 ?涉及到的软件清单 envyng-gtk compizconfig-settings-manager emerald fusion-icon RecordMyDesktop。 操作步骤 1.安装envyng辅助工具[Ubuntu 10.04及以后版本不支持] 让envyng这个傻瓜软件帮助你吧!用envyng安装驱动有个好处就是,有些需要卸载的冲突软件包它会自动帮你卸载,有些3D桌面需要安装的支持软件包它会自动帮你安装。例如,Nvidia的glx相关软件包等。这些软件之间的关联比较复杂,如果采用手工安装的方法很麻烦且容易出错。 首先,确保已经能连上网了,图形界面下,点击任务栏“系统”-“系统管理”-“软件源”在弹出的窗口中“下载自”的下拉菜单里,把默认的“中国的服务器”改选为“主服务器”。点击“关闭”然后会自动更新一些文件。 然后,点击任务栏“系统”-“系统管理”-“新立得软件包管理器”在菜单栏里点击“编辑”-“搜索”-输入envyng-gtk并勾选它,会提示安装envyng-core,勾选后点击“应用”即可自动下载安装(如果你的Ubuntu安装有KDE,还可以下载envyng-qt安装)。

史上最全linux内核配置详解

对于每一个配置选项,用户可以回答"y"、"m"或"n"。其中"y"表示将相应特性的支持或设备驱动程序编译进内核;"m"表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;"n"表示内核不提供相应特性或驱动程序的支持。只有<>才能选择M 1. General setup(通用选项) [*]Prompt for development and/or incomplete code/drivers,设置界面中显示还在开发或者还没有完成的代码与驱动,最好选上,许多设备都需要它才能配置。 [ ]Cross-compiler tool prefix,交叉编译工具前缀,如果你要使用交叉编译工具的话输入相关前缀。默认不使用。嵌入式linux更不需要。 [ ]Local version - append to kernel release,自定义版本,也就是uname -r可以看到的版本,可以自行修改,没多大意义。 [ ]Automatically append version information to the version string,自动生成版本信息。这个选项会自动探测你的内核并且生成相应的版本,使之不会和原先的重复。这需要Perl的支持。由于在编译的命令make-kpkg 中我们会加入- –append-to-version 选项来生成自定义版本,所以这里选N。 Kernel compression mode (LZMA),选择压缩方式。 [ ]Support for paging of anonymous memory (swap),交换分区支持,也就是虚拟内存支持,嵌入式不需要。 [*]System V IPC,为进程提供通信机制,这将使系统中各进程间有交换信息与保持同步的能力。有些程序只有在选Y的情况下才能运行,所以不用考虑,这里一定要选。 [*]POSIX Message Queues,这是POSIX的消息队列,它同样是一种IPC(进程间通讯)。建议你最好将它选上。 [*]BSD Process Accounting,允许进程访问内核,将账户信息写入文件中,主要包括进程的创建时间/创建者/内存占用等信息。可以选上,无所谓。 [*]BSD Process Accounting version 3 file format,选用的话统计信息将会以新的格式(V3)写入,注意这个格式和以前的v0/v1/v2 格式不兼容,选不选无所谓。 [ ]Export task/process statistics through netlink (EXPERIMENTAL),通过通用的网络输出工作/进程的相应数据,和BSD不同的是,这些数据在进程运行的时候就可以通过相关命令访问。和BSD类似,数据将在进程结束时送入用户空间。如果不清楚,选N(实验阶段功能,下同)。 [ ]Auditing support,审计功能,某些内核模块需要它(SELINUX),如果不知道,不用选。 [ ]RCU Subsystem,一个高性能的锁机制RCU 子系统,不懂不了解,按默认就行。 [ ]Kernel .config support,将.config配置信息保存在内核中,选上它及它的子项使得其它用户能从/proc/ config.gz中得到内核的配置,选上,重新配置内核时可以利用已有配置Enable access to .config through /proc/config.gz,上一项的子项,可以通过/proc/ config.gz访问.config配置,上一个选的话,建议选上。 (16)Kernel log buffer size (16 => 64KB, 17 => 128KB) ,内核日志缓存的大小,使用默认值即可。12 => 4 KB,13 => 8 KB,14 => 16 KB单处理器,15 => 32 KB多处理器,16 => 64 KB,17 => 128 KB。 [ ]Control Group support(有子项),使用默认即可,不清楚可以不选。 Example debug cgroup subsystem,cgroup子系统调试例子 Namespace cgroup subsystem,cgroup子系统命名空间 Device controller for cgroups,cgroups设备控制器

linux lamp环境搭建教程

linux 环境搭建教程 [url=https://www.360docs.net/doc/e312839314.html,]https://www.360docs.net/doc/e312839314.html,[/url] 一、系统约定 软件源代码包存放位置:/usr/local/src 源码包编译安装位置(prefix):/usr/local/software_name 脚本以及维护程序存放位置:/usr/local/sbin MySQL 数据库位置:/var/lib/mysql(可按情况设置) Apache 网站根目录:/var/www/wwwroot(可按情况设置) Apache 虚拟主机日志根目录:/var/logs/httpd/(可按情况设置) Apache 运行账户:apache:apache 二、系统环境部署及调整 1. 检查系统是否正常 # more /var/log/messages(检查有无系统级错误信息) # dmesg(检查硬件设备是否有错误信息) # ifconfig(检查网卡设置是否正确) # ping [url=https://www.360docs.net/doc/e312839314.html,]https://www.360docs.net/doc/e312839314.html,[/url](检查网络是否正常) 2. 关闭不需要的服务 # ntsysv 以下仅列出需要启动的服务,未列出的服务一律推荐关闭: atd crond irqbalance microcode_ctl network sendmail sshd syslog 3. 重新启动系统 # init 6 4. 配置vim # vi /root/.bashrc 在alias mv='mv -i' 下面添加一行:alias vi='vim' 保存退出。 # echo 'syntax on' > /root/.vimrc 5. 使用yum 程序安装所需开发包(以下为标准的RPM 包名称) # yum install ntp vim-enhanced gcc gcc-c++ gcc-g77 flex bison autoconf automake bzip2-devel ncurses-devel libjpeg-devel libpng-devel libtiff-devel freetype-devel pam-devel kernel 6. 定时校正服务器时钟,定时与中国国家授时中心授时服务器同步 # crontab -e 加入一行: */30 * * * * ntpdate 210.72.145.44 7. 源码编译安装所需包(Source) (1) GD2 # cd /usr/local/src

相关文档
最新文档