《嵌入式Linux基础教程学习笔记一》

 

 

常用书目下载地址:http://www.cnblogs.com/pengdonglin137/p/3688029.html

 

第二章

1、经过上下文和刹车上下文(Page20)

当应用程序执行系统调用,造成上下文的切换而上本时,内核会代表者过程执行本代码。你见面时时听到,这种情景称内核运行于经过上下文中。相反,处理IDE驱动器的刹车处理程序(ISR)也是外核代码,但运行时连无意味任何特定的过程。这种情形普通被号称内核运行为中断上下文中。

2、独立处理器、配套芯片组和合并处理器 (Page26)

      独立处理器是恃那些专注于令处理效果的处理器。与合处理器相比,独立处理器需要格外的支撑电路完成其基本操作。在多数场面下,这象征处理器周围需要配备一个芯片组或者一个定制的逻辑芯片,已落实有增长力量,包括DRAM控制器、系统总线寻址配置和外围设备(比如键盘控制器和串行端口)。独立处理器一般会提供最好强之完整CPU性能。

单独处理器都得连续支撑逻辑芯片才会顾外设,这些外设包括系统主内存(DRAM)、ROM或者闪存、系统总线(比如PCI)或者其他外设,比如键盘控制器、串行端口和IDE接口,诸如此类。执行逻辑芯片的的机能相似由配套的芯片组来好,而这芯片组很可能是专程为某某系列之计算机设计之。

尽管如此独自处理器的利用非常普遍,包括部分高负载处理引擎,但是大部分之微型嵌入式系统还使某种集成处理器或者片及系(System
On Chip,SOC)。

参照阅读:

http://pan.baidu.com/s/1eQGbs5c

http://www.cnblogs.com/pengdonglin137/p/3690410.html

3、查询本机的本的宣布信息

cat /proc/version

4、顶层源码目录

于本书中,会时时提到顶层源码目录。这时,我们借助的凡内核源码树的嵩一交汇目录。顶层源码目录包含以下列出的子目录:

            arch/         block/        
crypto/        Documentation/ 
            drivers/     firmware/   
fs/               include/   
            init/         
ipc/             kernel/         lib/ 
            mm/         net/           
samples/      scripts/   
            security/    sound/      
usr/              virt/

5、编译内核是亮详细编译过程

如: make  ARCH=arm
CROSS_COMPILE=arm-linux- V=1
uImage

   1: make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build

   2: make V=2   [targets] 2 => give reason for rebuild of target

   3: make O=dir [targets] Locate all output files in "dir", including .config

   4: make C=1   [targets] Check all c source with $CHECK (sparse by default)

   5: make C=2   [targets] Force check of all c source with $CHECK

6、清理

有几个make命令会删除配置文件要非见面吃做何警告。最普遍的就是make
distclean(此外还有make
mrproper)。这个make目标的规划初衷是达标基本代码树回到原有之、未配备的状态。这包括去源码树被颇具的安排数据,当然也会去除原先的.config文件。

   1: Cleaning targets:

   2:   clean          - Remove most generated files but keep the config and

   3:                     enough build support to build external modules

   4:   mrproper      - Remove all generated files + config + various backup files

   5:   distclean      - mrproper + remove editor backup and patch files

7、bzImage和zImage  (Page61)

重重搭和机具类型且要一个次之前进制镜像目标,而之目标与实际应用的架和导加载程序有关。比较常见的当下看似对象是zImage。对于多搭来说,这就是是默认的第二前行制镜像目标,可以给加载到目标嵌入式系统中连运行。新手常犯的一个错就是将bzImage指定为make的对象。然而,bzImage目标是对准x86/PC架构的。有一个广阔的错误观点,认为bzImage是乘经压缩工具bzip2压缩了之镜像,其实不然,bzImage是指大(big)的zImage。

8、make menuconfig

在顶层目录执行make menuconfig
,然后再顶层Makefile中之:

459 %config: scripts_basic outputmakefile FORCE

460         $(Q)mkdir -p include/linux include/config

461         $(Q)$(MAKE) $(build)=scripts/kconfig $@

 

%config可以配合*config,然后上script/kconfig中执行
make  menuconfig,

 

7 ifdef KBUILD_KCONFIG

8 Kconfig := $(KBUILD_KCONFIG)

9 else

0 Kconfig := arch/$(SRCARCH)/Kconfig

1 endif

2 

3 xconfig: $(obj)/qconf

4         $< $(Kconfig)

5 

6 gconfig: $(obj)/gconf

7         $< $(Kconfig)

8 

9 menuconfig: $(obj)/mconf                                                    

0         $< $(Kconfig)

1 

2 config: $(obj)/conf

3         $< $(Kconfig)

4 

5 oldconfig: $(obj)/conf

6         $< -o $(Kconfig)

其中Kconfig是arch/arm/Kconfig,对于menuconfig,配置工具是mconf,他得分析Kconfig文件。

 

9、嵌入式Linux发行本所蕴涵的底组件   (Page73)

Linux内核

因势利导加载程序,你要以它移植到一定的硬件平台上,并开相应的安排;

入吃您所选架构的交叉编译器同有关的工具链

文件系统,其中蕴涵众多软件包——主要是二进制可执行文件和程序库,而且他们是对准本土硬件架构和电脑而编译的;

装备驱动程序,内核通过它们访问硬件板卡上的定制硬件;

开条件,包括主机上的工具和软件;

Linux内核源码树,并且称给特定的微机以及硬件板卡;

10、单体内核

Linux采用单体(monolithic)内核结构。也就是说,这个基本是出于代码编译并静态链接生成的,是一个纯净的可执行文件。然而,也堪编译一组源码文件,并经过增量链接的措施转变一个对象模块,他得动态加载到运行的基本中。

基本的构建过程,不管采取哪种架构,构建时犹见面扭转有通用文件,其中某即是名也vmlinux的ELF二进制文件(处于顶层内核源码目录中)。这个二进制文件就是单体内核(monolithic
kernel)本身,我们啊称它为内核主体。

下是tq2440在变更内核源码顶层目录下之vmlinux时的链接命令:

arm-linux-ld -EL  -p --no-undefined -X --build-id -o vmlinux  \

                                                              \

-T arch/arm/kernel/vmlinux.lds                                \

                                                              \

arch/arm/kernel/head.o                                        \

arch/arm/kernel/init_task.o                                   \

                                                              \

init/built-in.o                                               \

--start-group                                                 \

usr/built-in.o                                                \

                                                              \

arch/arm/kernel/built-in.o                                    \

arch/arm/mm/built-in.o                                        \

arch/arm/common/built-in.o                                    \

arch/arm/mach-s3c2410/built-in.o                              \

arch/arm/mach-s3c2400/built-in.o                              \

arch/arm/mach-s3c2412/built-in.o                              \

arch/arm/mach-s3c2440/built-in.o                              \

arch/arm/mach-s3c2442/built-in.o                              \

arch/arm/mach-s3c2443/built-in.o                              \

arch/arm/plat-s3c24xx/built-in.o                              \

arch/arm/plat-s3c/built-in.o                                  \

arch/arm/nwfpe/built-in.o                                     \

                                                              \

kernel/built-in.o                                             \

mm/built-in.o                                                 \

fs/built-in.o                                                 \

ipc/built-in.o                                                \

security/built-in.o                                           \

crypto/built-in.o                                             \

block/built-in.o                                              \

arch/arm/lib/lib.a                                            \

lib/lib.a                                                     \

arch/arm/lib/built-in.o                                       \

lib/built-in.o                                                \

drivers/built-in.o                                            \

sound/built-in.o                                              \

firmware/built-in.o                                           \

net/built-in.o                                                \

                                                              \

--end-group .tmp_kallsyms2.o

 

11、内核是哪些合成的? (具体用参见第五章节的第一节P75)

图片 1

因arm为例,其中vmlinusx
在本源码顶层目录,Image在arch/arm/boot/下,piggy.gz在arch/arm/boot/compressed/下,bootable
kernel image在arch/arm/boot/下。

此最主要说明如下俩只概念的差:启动加载程序(Bootstrap
Loader)和引加载程序(Bootloader)

带加载程序简单了解呢uboot或者Bootloader或者第1级的加载程序,可以将开行加载程序当做是第2号的加载程序(简单明了为:zImage头部之几乎独公文,负责初始化设置有硬件和解压内核镜像的有)。

甭用开行加载程序与引加载程序模糊,很多架构都采取启动加载程序(第2路加载程序)将Linux内核镜像加载到内存中。有些启动加载程序会对内核镜像开展校验和反省,而多数起动加载程序会解压并重新部署内核镜像。引导加载程序与起步加载程序中的界别也充分简单:但硬件单板加电时,引导加载程序获取该控制权,根本不予赖内核。相反,启动加载程序的要害意图是作裸机引导加载程序和Linux内核之间的粘合剂。启动加载程序负担提供方便的上下文让本运行为其中,并且实施必要之步调为解压和重新部署内核二上制镜像。当时看似于PC架构中的主加载程序与次加载程序的定义。

起步加载程序和内核镜像拼接在同步,用于加载。

(具体参见:Page79)

 

图片 2

12、查看内核初始化细节  (page96)

initcall_debug是一个雅有意思之内核命令行参数,它同意而相启动过程被的函数调用。只待于起步水源是设置一下initcall_debug,就可以看到网输出相关的确诊信息:

下面initcall最后之return x after XX
usecs 表示函数的返回值以及函数调用的持续时间。

calling  spi_init+0x0/0x84 @ 1

initcall spi_init+0x0/0x84 returned 0 after 2936 usecs

calling  i2c_init+0x0/0x60 @ 1

initcall i2c_init+0x0/0x60 returned 0 after 4214 usecs

calling  customize_machine+0x0/0x24 @ 1

S3C Power Management, Copyright 2004 Simtec Electronics

initcall customize_machine+0x0/0x24 returned 0 after 22922 usecs

当时是单翻内核初始化细节之好点子,特别是好了解基本调用各个分支系以及模块的相继。更有趣的凡函数调用的持续时间。如果您体贴系统启动日,通过这种措施可规定启动时是以哪些地方被吃的。

 

13、根文件系统

到底文件系统指的是悬挂在文件系统层次结构根部的文件系统,简单表示也/。

简单的话,根文件系统是基础挂载的首先只文件系统,挂载位置是文件系统层次结构的上。

Linux系统对于到底文件系统有有特殊需求。Linux要求彻底文件系统中寓应用程序和工具软件,通过它们来指点迷津体系、初始化系统服务(比如网络和系统控制台)、加载设备驱动程序和挂于附加的文件系统。

14、根文件系统中之glibc和Linux动态加载器

于嵌入式系统的干净文件系统中貌似还见面生就简单个动态库:glibc(如libc-XXX.so)和Linux动态加载器(如ld-XXX.so)。其中glibc包含标准C程序库的函数,比如printf()和广大旁大部的应用程序都因之常用函数。

Linux动态加载器负责将二进制程序加载到内存中,并且,如果应用程序引用了共享库中之函数,它还得执行动态链接。

15、定制用户空间初始化程序

在init/main.c中:

if (execute_command) {

    run_init_process(execute_command);

    printk(KERN_WARNING "Failed to execute %s.  Attempting "

                "defaults...\n", execute_command);

}

run_init_process("/sbin/init");

run_init_process("/etc/init");

run_init_process("/bin/init");

run_init_process("/bin/sh");

 

panic("No init found.  Try passing init= option to kernel.");

每当面的语句中,如果execute_command非空,它会对一个运作在用户空间的字符串,而之字符串中涵盖了一个定制的、由用户提供的授命。开发人员在基本命令行中指定这个命令,并且他会由于我们面前所研究之__setup宏进行安装。

在init/main.c中:

static int __init init_setup(char *str)

{

    unsigned int i;

 

    execute_command = str;

    /*

     * In case LILO is going to boot us with default command line,

     * it prepends "auto" before the whole cmdline which makes

     * the shell think it should execute a script with such name.

     * So we ignore all arguments entered _before_ init=... [MJ]

     */

    for (i = 1; i < MAX_INIT_ARGS; i++)

        argv_init[i] = NULL;

    return 1;

}

__setup("init=", init_setup);

在include/linux/init.h中:

#define __setup_param(str, unique_id, fn, early)            \

    static char __setup_str_##unique_id[] __initdata __aligned(1) = str; \

    static struct obs_kernel_param __setup_##unique_id    \

        __used __section(.init.setup)            \

        __attribute__((aligned((sizeof(long)))))    \

        = { __setup_str_##unique_id, fn, early }

 

#define __setup(str, fn)                    \

    __setup_param(str, fn, fn, 0)

脚是一个内核命令行的事例:

initcall_debug init=/sbin/myinit
console=ttyS1,115200 root=/dev/hda1

含义:

基础显示有的初始化函数调用,配置起的控制台设备/dev/ttyS1,其数据速率为115Kbit/s,并实施一个定制的、名吧myinit的用户空间初始化进程,这个顺序在根文件系统的/sbin目录中。它还指点本从设备/dev/hda1悬挂载器根文件系统,这个设备是第一单IDE硬盘。

注意一下,一般的话,内核命令行中各个参数的主次顺序无关紧要。

 

16、应用程序依赖关系

大部分应用程序有一定量近乎依赖关系:

1、动态链接的应用程序对程序库的乘,这种应用程序中寓无缓解之援,这要由程序库提供;

2、应用程序可能特需之外部配置文件要数据文件

对于前者,可以使工具来确定,这里介绍两种艺术(XXX代表可执行程序):

1、ldd xxx

2、objdump –x xxx | grep NEEDED

对于后人,至少要针对有关的应用程序有个主导了解。

 

17、rmmod 和 modprobe –r

 如:modprobe –r ext3
可以用来去模块,包括有模块所依靠之模块,而rmmod不会见去一个模块所倚的模块。

18、 /proc 、sysfs以及tmpfs

她俩俩个还是私自文件系统(Pseudo File
Systems)。

/proc
文件系统的称号来他的初期计划目的:它是一个接口,内核通过她可得到一个Linux系统上拥有进程的音信。随着时光之延,它呢不止发展壮大,可以提供再多点的信息,而不光限于进程。很多用户空间的应用程序都凭借/proc文件系统中之始末来完成其的工作。例如mount命令,如果当实践时无带任何参数,会列有系统被时有着曾经挂载文件系统的信息,而它是于/proc/mounts文件被收获这些信之。如果非有/proc文件系统,mount命令直接回。除了mount之外,其他组成部分同/proc文件系统交互的实用程序还有free、pkill、pmap以及uptime。请参考procfs软件包获得更多信息。

挂载/proc文件系统:  mount –t proc /proc
/proc 或者 mount –t proc none /proc

sysfs是本着具体的根本对象(比如物理设备)进行建模,并且提供平等栽将装备与设施驱动程序关联起来的道。从sysfs中可以拿走很多网信息,很多实用工具都使了这些信,比如电源管理暨热插拔能力,还有mtd-utils中的过剩与Flash操作相关的家伙。

tmpfs中的富有内容还是储存于基础的虚拟内存中之,断电或另行开后,这些情节都不见了。tmpfs文件系统对于速临时文件存储很有因此。对于那些会动群小的临时文件的应用程序来说,这好增进其的特性。

挂载tmpfs文件系统:  mount –t tmpfs
/tmpfs /tmp 或者 mount –t tmpfs
none /tmp

嵌入式系统遭到自行挂载这三种植文件系统一般在/etc/fstab中安装:

   1:  # cat /etc/fstab 

   2:  proc            /proc           proc    defaults        0       0

   3:  sysfs           /sys            sysfs   defaults        0       0

   4:  tmpfs           /dev            tmpfs   defaults        0       0

   5:  tmpfs           /tmp            tmpfs   defaults,size=120M      0       0

   6:  tmpfs           /var/run            tmpfs       defaults        0       0

19、MTD概述

      内存技术设备(Memory Technology
Device,MTD)子系的目的是深受本支持项目繁多的切近内存的设施,比如闪存芯片。市面上发出过多不一类型之闪存芯片,对她进行编程的方吧应有尽有,主要缘由是它们一旦支持多独特和飞跃之模式。MTD子系统应用了层次化架构,将根设备的错综复杂和(使用这些内存和闪存设备的)高层的数据组织及仓储格式分隔开。

     
简单来说,MTD是一个装备驱动程序层,它提供了同一拟访问原本闪存设备的通用API接口。MTD支持大多种闪存设备。然而,MTD不是片设备。MTD与装备打交道时凡盖擦除块(erase
block)为单位之,其大小不一,而块设备是为一定大小的块(称为扇区)位操作单位的。块设备产生三三两两种要操作——读取扇区和描写副扇区,而MTD有3种植:读、写及擦除。MTD设备的描写寿命是个别的,所以MTD会包含其中逻辑将写操作分布开来已拉开设备的寿命,这给号称损耗均衡(wear
leveling)。

及常见的想法相反,SD/MMC卡、CompactFlash卡、USB闪存盘以及其它一些看似的配备都未属MTD设备。这些设施的里边都含了闪存转换层,用于完成接近MTD的功用,比如块擦除同消耗均衡。因此,对于网吧,它们看起来就是像是人情的丘设备,不待通过MTD的新鲜处理。

Linux中的大部分装置属字符设备或者块设备遭遇平等种。而MTD既未是字符设备,也不是片设备。虽然部分转换机制可以要MTD看起如字符设备或者块设备,但是以Linux驱动架构中,MTD有该与众不同的远在。这是盖MTD驱动程序必须完成部分闪存特有的操作,比如块擦除操作和消耗均衡,而传统的丘设备驱动程序是无看似操作的。

20、软实时和身心健康时

软实时

大部丁还同意软实时表示操作有工夫范围。如果跨越了光阴限制后操作还无得的讲话,体验的质地就见面下滑,但不会见带致命后果。桌面工作站就是一个索要软实时的绝好的事例。编辑文档时,你期望按键后马上在屏幕上张结果。在播音mp3文件时,你望听到没有外杂音、爆音或者暂停的过人品质音乐。

貌似而言,普通人无法辨认出小于几十毫秒的延时。当然音乐家能够任生比马上还缺乏的延时,并且告诉你它影响了音乐之质。如果这些所谓的软实时事件错过了定期,结果也许不顺手,并导致体验的色持有降低,但马上并无是灾难性的。

硬实时

健康时的特色是去时限会促成惨重结果。在一个强壮时系统被,如果失去了为期,后果往往是惨不忍睹的。当然,“灾难”是对立而言之。但若是你的嵌入式设备正在控制喷气式飞机引擎的燃料流,而它们没有会立刻的响应飞行员输入的命令或者操作特性的转移,致命后果就不可避免了。

在意,时限的持续时间并无是健康时之风味。原子钟中拍卖每个嘀嗒的服务程序就是这么的例证。只要以产一个嘀嗒到来之前的持续1秒的时刻窗口外处理就,数据就是仍有效。但要失去了某个嘀嗒,全球定位系统就可能会见发出几英尺或还几英里的误差!

设想到及时或多或少,我们借鉴了一样组常用的软实时和身心健康时之概念。对于软实时系统,如果失去的了为期,系统的计算值或者结果会不顶好。然而,对于身强力壮时系统,如果失去了某时限,系统就是败退的,而且可能会见招灾难性的结果。

 

 

 

相关文章