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

 

 

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

 

第二章

1、进程上下文和间断上下文(Page20)

当应用程序执行系统调用,造成上下文的切换而进入基础时,内核会代表这些历程执行内核代码。你会常常听到,那种情状称为内核运营于经过上下文中。相反,处理IDE驱动器的中止处理程序(IS福睿斯)也是内核代码,但运转时并不意味着任何特定的经过。那种情景普通被誉为内核运维于中断上下文中。

贰、独立处理器、配套芯片组和合并处理器 (Page二陆)

      独立处理器是指那个专注于指令处理效果的处理器。与集成处理器相比,独立处理器要求万分的支撑电路达成其基本操作。在大多数境况下,那象征处理器周边供给配置多少个芯片组或许1个定制的逻辑芯片,已兑现部分增加功效,包涵DRAM控制器、系统总线寻址配置以及外围设备(比如键盘控制器和串行端口)。独立处理器1般会提供最强的一体化CPU品质。

独自处理器都须求接二连三支撑逻辑芯片才能访问外设,那些外设包括系统主内部存款和储蓄器(DRAM)、ROM只怕闪存、系统总线(比如PCI)或然其余外设,比如键盘控制器、串行端口和IDE接口,诸如此类。执行逻辑芯片的的效果相似由配套的芯片组来完毕,而这些芯片组很也许是专门为某些连串的处理器设计的。

固然独自处理器的使用很常见,包罗一些高负载处理引擎,可是超过50%的小型嵌入式系统都使用某种集成处理器只怕片上系统(System
On Chip,SOC)。

参考阅读:

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

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

3、查询本机的根本的宣告新闻

cat /proc/version

四、顶层源码目录

在本书中,会时不时提到顶层源码目录。那时,我们指的是内核源码树的万丈1层目录。顶层源码目录包括以下列出的子目录:

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

伍、编写翻译内核是显得详细编写翻译进程

如: 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)

洋洋架构和机具类型都亟需3个二进制镜像目的,而这么些目的与具体采纳的架构和指点加载程序有关。相比较常见的那类指标是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文件。

 

九、嵌入式Linux发行版所包括的的组件   (Page7三)

Linux内核

引导加载程序,你供给将它移植到一定的硬件平台上,并做相应的布署;

适合于您所选架构的陆续编写翻译器和有关的工具链

文件系统,在那之中包括众多软件包——主假若2进制可执行文件和程序库,而且她们是本着本地硬件架构和电脑而编译的;

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

支付环境,包含主机上的工具和软件;

Linux内核源码树,并且符合于特定的处理器和硬件板卡;

10、单体内核

Linux选用单体(monolithic)内核结构。也等于说,那几个基础是由代码编写翻译并静态链接生成的,是3个纯粹的可执行文件。但是,也得以编写翻译1组源码文件,并由此增量链接的法子生成三个对象模块,他得以动态加载到运维的木本中。

基础的塑造进度,不管选用哪一种架构,营造时都会扭转一些通用文件,个中之1便是名叫vmlinux的ELF2进制文件(处于顶层内核源码目录中)。这几个二进制文件便是单体内核(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

 

1一、内核是什么样合成的? (具体须求参见第四章的首先节P7五)

Bootstrap 1

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

那里关键表达如下俩个概念的两样:运行加载程序(Bootstrap
Loader)和带领加载程序(Bootloader)

辅导加载程序简单明了为uboot或然Bootloader或然第二阶段的加载程序,可以将开发银行加载程序当做是第3等级的加载程序(简单明了为:zImage头部的多少个文本,负责初步化设置有个别硬件以及解压内核镜像的有些)。

永不将起动加载程序和指点加载程序模糊,很多架构都使用运转加载程序(第1等级加载程序)将Linux内核镜像加载到内部存款和储蓄器中。有个别运行加载程序会对内核镜像开始展览校验和检讨,而多数先导加载程序会解压同等看待新布署内核镜像。指导加载程序和起步加载程序之间的分别也很简短:但硬件单板加电时,指导加载程序获取其控制权,根本不予赖内核。相反,运转加载程序的重中之重作用是作为裸机指点加载程序和Linux内核之间的粘合剂。运营加载程序负担提供合适的上下文让内核运营于在那之中,并且实施供给的步骤以解压和重新安插内核2进制镜像。那类似于PC架构中的主加载程序和次加载程序的定义。

运维加载程序和内核镜像拼接在联合署名,用于加载。

(具体参见:Page7玖)

 

Bootstrap 2

12、查看内核初叶化细节  (page9陆)

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

那是个查看内核发轫化细节的好措施,尤其是足以通晓基本调用各样子系统和模块的逐1。更有趣的是函数调用的持续时间。假使您尊崇系统运维时间,通过那种格局能够规定运行时间是在哪些地点被消耗的。

 

一三、根文件系统

根文件系统指的是挂在于文件系统层次结构根部的文件系统,简单表示为/。

粗略的话,根文件系统是内核挂载的首先个文件系统,挂载地点是文件系统层次结构的顶端。

Linux系统对于根文件系统有一些异样要求。Linux必要根文件系统中富含应用程序和工具软件,通过它们来引导迷津体系、开始化系统服务(比如网络和连串控制台)、加载设备驱动程序和挂在附加的文件系统。

1四、根文件系统中的glibc和Linux动态加载器

在嵌入式系统的根文件系统中貌似都会有那个动态库:glibc(如libc-XXX.so)和Linux动态加载器(如ld-XXX.so)。在这之中glibc包罗标准C程序库的函数,比如printf()和无数任何半数以上的应用程序都重视的常用函数。

Linux动态加载器负责将2进制程序加载到内部存款和储蓄器中,并且,若是应用程序引用了共享库中的函数,它还索要实践动态链接。

一伍、定制用户空间初步化程序

在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/ttyS一,其数量速率为115Kbit/s,并实行三个定制的、名称为myinit的用户空间开首化进度,那一个程序位于根文件系统的/sbin目录中。它还指引内核从设备/dev/hda一挂载器根文件系统,那个设备是率先个IDE硬盘。

只顾一下,1般的话,内核命令行中相继参数的程序次序非亲非故主要。

 

16、应用程序重视关系

大部应用程序有两类重视关系:

壹、动态链接的应用程序对程序库的借助,那种应用程序中包蕴未缓解的引用,这亟需由程序库提供;

二、应用程序可能要求的外部配置文件或然数据文件

对在此以前者,可以选拔工具来分明,那里介绍二种方法(XXX代表可执行程序):

1、ldd xxx

2、objdump –x xxx | grep NEEDED

对此后者,至少要对有关的应用程序有个着力精晓。

 

17、rmmod 和 modprobe –r

 如:modprobe –r ext3能够用来删除模块,包含某些模块所依靠的模块,而rmmod不会删除2个模块所重视的模块。

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)子系统的目标是让内核援救项目不足为奇的好像内存的设施,比如闪存芯片。市面上有诸多例外档次的闪存芯片,对它们实行编制程序的章程也五花8门,主要原因是它们要辅助广大特有和高速的方式。MTD子系统采用了层次化架构,将底层设备的复杂和(使用那一个内部存款和储蓄器和闪存设备的)高层的数据协会及仓库储存格式分隔断。

     
简而言之,MTD是2个设备驱动程序层,它提供了一套访问原本闪存设备的通用API接口。MTD支持很两种闪存设备。不过,MTD不是块设备。MTD与设施打交道时是以擦除块(erase
block)为单位的,其大小不一,而块设备是以一直大小的块(称为扇区)位操作单位的。块设备有二种重要操作——读取扇区和写入扇区,而MTD有三种:读、写和擦除。MTD设备的写寿命是有限的,所以MTD会包蕴在那之中逻辑将写操作分布开来已延伸设备的寿命,那被叫做损耗均衡(wear
leveling)。

与平日的想法相反,SD/MMC卡、CompactFlash卡、USB闪存盘以及任何一些看似的设施都不属于MTD设备。这几个设备的中间都富含了闪存转换层,用于完结接近MTD的法力,比如块擦除和消耗均衡。由此,对于系统来说,它们看上去就如传统的块设备,不须求通过MTD的出格处理。

Linux中的一大半设备属于字符设备恐怕块设备中1种。而MTD既不是字符设备,也不是块设备。尽管有个别转换机制能够使MTD看起来像字符设备或块设备,然则在Linux驱动架构中,MTD有其独特之处。这是因为MTD驱动程序必须形成都部队分闪存特有的操作,比如块擦除操作和消耗均衡,而古板的块设备驱动程序是一向不看似操作的。

20、软实时和矫健时

软实时

大多数人都同意软实时表示操作有时间限定。假若跨越了时间限定后操作还未曾做到的话,体验的身分就会减低,但不会推动致命后果。桌面工作站正是三个索要软实时的绝好的例证。编辑文书档案时,你希望按键之后马上在显示器上看出结果。在播音mp叁文件时,你指望听到未有别的杂音、爆音可能暂停的高品质音乐。

貌似而言,普通人不能够辨识出小于几十飞秒的延时。当然美学家能够听出比那越来越短的延时,并且告诉您它们影响了音乐的身分。假使那些所谓的软实时事件错过了时间限制,结果大概壮志未酬,并导致体验的品质有所下落,但那并不是灾祸性的。

硬实时

健全时的性情是错开时限会促成严重结果。在3个年轻力壮时系统中,假使错过了限期,后果往往是灾害性的。当然,“患难”是相对而言的。但假若您的嵌入式设备正在控制喷气式飞机发动机的燃料流,而它没能及时的响应飞银行职员输入的命令大概操作天性的变型,致命后果就不可幸免了。

专注,时间限制的持续时间并不是健全时的特色。原子钟中拍卖每个嘀嗒的服务程序正是这么的事例。只要在下一个嘀嗒到来此前的频频一秒的小时窗口内部处理理到位,数据就照样有效。但假使失去了有些嘀嗒,整个世界定位系统就或然会发出几英尺或甚至几英里的标称误差!

思量到那或多或少,大家借鉴了壹组常用的软实时和强壮时的定义。对于软实时系统,若是错过的了年限,系统的计算值或然结果会不太理想。可是,对于身强力壮时系统,假使失去了有个别时间限制,系统正是战败的,而且说不定会招致灾荒性的后果。

 

 

 

相关文章