实验6 ——Linux 内核移植实验
linux系统移植实验手册
实验四 Linux-2.6.14内核移植--网卡驱动的添加【实验目的】本实验通过在上个实验结果的linux2.6.14内核上移植CS89900A网卡驱动,使其可以通过网络nfs的方式挂载在ubantu主机环境上的文件系统,从而实现linux系统的完全启动。
【实验环境】1、Ubuntu 7.0.4发行版2、GEC2410平台以及开发板中移植好的u-boot3、交叉编译器arm-linux-gcc【实验步骤】(1) 下载linux内核/pub/linux/kernel/v2.6/linux-2.6.14.1.tar.bz2 ,下载linux2.6.14内核致/source/kernel目录,如果没有/source/kernel目录,自行建立目录。
root@:/source/kernel# cd /source/kernel/root@:/source/kernel# tar -xjvf linux-2.6.14.tar.bz2root@:/source/kernel/linux-2.6.14# pwd/source/kernel/linux-2.6.14root@:/source/kernel# cd linux-2.6.14进入内核解压后的目录,以后示例中,只要是相对路径全部是相对于/source/kernel/linux-2.6.14这个目录。
(2) 修改Makefile文件修改内核目录树根下的的Makefile,指明交叉编译器:root@:/source/kernel/linux-2.6.14# vim Makefile找到ARCH和CROSS_COMPILE,修改ARCH = armCROSS_COMPILE = arm-softfloat-linux-gnu-保存退出,然后设置你的PATH环境变量,使其可以找到你的交叉编译工具链:root@:/source/kernel/linux-2.6.14# echo $PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games如果第一个路径为/home/linux/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin,则不用再进行设置,如果不是则进行下面步骤进行设置:root@:/source/kernel/linux-2.6.14#export PA TH=$PA TH:/home/linux/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin:(动态加载环境变量,终端关闭后,自己所加载的环境变量立即消失)。
linux内核移植、根文件系统、busybox
/ #通过共享目录
为了方便使用 arm-linux-gcc,我们可以把它所在的目录添加到环境变量中 在 export PATH 前面插入 PATH=/arm2410/crosstool/gcc-4.1.1-glibc-2.3.2/arm-linux/bin/:$PATH 这样一句,以后启动就可以直接使用 arm-linux-gcc 了。 要使环境变量立马生效,可以使用下面的命令。 source /etc/profile 我们可以用 arm-linux-gcc -v 来查看交叉编译器版本,如果是 4.1.1 就是正确的。 (3)设置 Nand Flash 分区信息表 设置 Nand Flash 的分区信息表是为内核启动以后加载文件系统用的,可以将 Nand Flash 看成我们 PC 机的硬盘,对 Nand Flash 的分区看成是对硬盘的分区,硬盘可以分成 C 盘,D 盘之类,而 Nand Flash 则可以分成很多块,每块有不同的名字、大小和用途。下面 是对 Super-ARM 实验箱的 Nand Flash 进行分区的情况(参考表 5-1-1): � 第 0 块命名为 "uboot" ,它用来存放 u-boot.bin 映像,起始地址是 Nand Flash 的 0x000000,最大 0x30000 个字节;
var
� �
第七行创建 var 目录下的子目录。 第八行更改 var/tmp 目录的权限。
3、创建设备文件 先了解一下 Linux 的设备:Linux 中主要有 2 种类型的设备:字符设备(无缓冲且只能顺 序存取)、块设备(有缓冲且可以随机存取)。每个设备都必须有主、次设备号,主设备号相同 的设备是同类设备(使用同一个驱动程序)。这些设备中,有些设备是对实际存在的物理硬件 的抽象,而有些设备则是内核自身提供的功能(不依赖于特定的物理硬件,又称为"虚拟设备 ")。每个设备在 /dev 目录下都有一个对应的文件(节点)。可以通过 cat /proc/devices 命令查 看当前已经加载的设备驱动程序的主设备号。 你可以在你的宿主机上执行这个命令看看你的 宿主机所拥有的设备文件,可以看到,Linux 有很多很多的设备文件,在嵌入式 Linux 中并 没有这么多的设备,下面用 mknod 命令创建一些主要设备文件。 关于 Linux 的设备号:很多设备在 Linux 下已经有默认的主次设备号,如帧缓冲设备是 Linux 的标准字符设备,主设备号是 29,如果 Linux 下有多个帧缓冲设备,那么这些帧缓冲 设备的次设备号就从 0~31(Linux 最多支持 32 个帧缓冲设备)进行编号,比如 fb0 对应的 次设备号就是 0,fb1 为 1,类推。用户也可以创建自己的设备文件,比如下一篇章中我们 要讨论的 Led 设备,需要注意的是用户自己的设备号不能与一些标准的系统设备号重叠。 Linux 下创建设备节点的命令是 mknod,下面是它的命令格式: mknod Name { b | c } Major Minor Name 是设备名称,“b”或“c”用来指定设备的类型是块设备还是字符设备。Major 指定设备的主设备号,Minor 是次设备号。 下面我们来创建嵌入式 Linux 系统中一些基本的设备文件, 必须是 root 权限, 命令如下: mknod -m 600 dev/console c 5 1 #创建系统控制台设备 mknod -m 666 dev/null c 1 3 #创建空设备, 任何写入都将被丢弃, 任何读取都得到 EOF mknod dev/fb0 c 29 0 #创建第一个帧缓冲设备,显示接口 mknod dev/tty c 5 0 #创建 TTY 设备 mknod dev/tty0 c 4 0 #创建当前虚拟控制台 mknod dev/tty1 c 4 1 mknod dev/tty2 c 4 2 mknod dev/tty3 c 4 3 mknod dev/tty4 c 4 4 ln -s dev/fb0 dev/fb #创建创建 fb 到 fb0 的链接 4、准备启动配置文件 Linux 启动所需要的文件有 etc/inittab、 etc/init.d/rcS、 etc/fstab 这三个文件(以下均假定当 前路径在/arm2410/rootfs)。 下面创建 inittab 文件,命令:gedit etc/inittab, 在文件中添加如下内容: ::sysinit:/etc/init.d/rcS ::askfirst:-/bin/sh ::respawn:-/bin/sh ::restart:/sbin/init ::ctrlaltdel:/sbin/reboot
linux操作系统内核实验报告
linux操作系统内核实验报告篇一:linux操作系统实验报告LINUX操作系统实验报告姓名班级学号指导教师XX 年 05月 16 日实验一在LINUX下获取帮助、Shell实用功能实验目的:1、掌握字符界面下关机及重启的命令。
2、掌握LINUX下获取帮助信息的命令:man、help。
3、掌握LINUX中Shell的实用功能,命令行自动补全,命令历史记录,命令的排列、替换与别名,管道及输入输出重定向。
实验内容:1、使用shutdown命令设定在30分钟之后关闭计算机。
2、使用命令“cat /etc/cron.daliy”设置为别名named,然后再取消别名。
3、使用echo命令和输出重定向创建文本文件/root/nn,内容是hello,然后再使用追加重定向输入内容为word。
4、使用管道方式分页显示/var目录下的内容。
5、使用cat显示文件/etc/passwd和/etc/shadow,只有正确显示第一个文件时才显示第二个文件。
实验步骤及结果:1. 用shutdown命令安全关闭系统,先开机在图形界面中右击鼠标选中新建终端选项中输入命令Shutdown -h 302、使用命令alias将/etc/cron.daliy文件设置为别名named,左边是要设置的名称右边是要更改的文件。
查看目录下的内容,只要在终端输入命令即可。
取消更改的名称用命令unalias命令:在命令后输入要取消的名称,再输入名称。
3.输入命令将文件内容HELLO重定向创建文本文件/root/nn,然后用然后再使用追加重定向输入内容为word。
步骤与输入内容HELLO一样,然后用命令显示文件的全部内容。
4.使用命令ls /etc显示/etc目录下的内容,命令是分页显示。
“|”是管道符号,它可以将多个命令输出信息当作某个命令的输入。
5实验二文件和目录操作命令实验目的:1、掌握LINUX下文件和目录的操作命令,如pwd、cd、ls、touch、mkdir、rmdir、cp、mv、rm等。
Linux内核配置移植及编译实验
return platform_driver_register(&dm9k_driver); } 7.添加 YAFFS 文件系统支持 将我们提供的 YAFFS 的源代码 yaffs2.tar.gz 拷贝到 linux-2.6.24.4 的同 级目录下,解压该源码包,获得 YAFFS 源码: # pwd /root/2410-s # cp /mnt/hgfs/e/yaffs2.tar.gz ./ # tar zxvf yaffs2.tar.gz 然后进入 yaffs2 目录,运行./patch-ker.sh 给内核打上补丁: # cd yaffs2 # ./patch-ker.sh c ../linux-2.6.24.4/ 这样打好补丁以后,再做正确的配置,内核就可以支持 YAFFS 文件系统了。 8.配置和编译内核 到现在,一个简单的内核就准备好了,我们还需要做一些配置,然后编译, 内核才能正常使用。 在内核源代码的根目录下运行 make menuconfig 命令,进入配置界面: # make menuconfig (1)选择硬件系统 做如下选择: System Type --->
S3C2410 Machines ---> [*] SMDK2410/A9M2410 [ ] IPAQ H1940 [ ] Acer N30 [ ] Simtec Electronics BAST (EB2410ITX) [ ] NexVision OTOM Board [ ] AML M5900 Series [ ] Thorcom VR1000
.size = SZ_4M, }, [3] = {
.name = "User Space", .offset = 0x680000, .size = 0x1980000, }, }; 这样就把我们的 64M 的 NAND Flash 分为四个区: 第一个区从 0x00000000 到 0x00080000,大小为 0.5M 第二个区从 0x00080000 到 0x00280000,大小为 2M 第三个区从 0x00280000 到 0x00680000,大小为 4M 第四个区从 0x00680000 到 0x02000000,大小为 25.5M 5.添加 LCD 支持 我们的开发平台上配置有 640*480 的液晶屏,我们来为它加上驱动支持。 需要在 arch/arm/mach-s3c2410/mach-smdk2410.c 中添加一些内容。 # vi arch/arm/mach-s3c2410/mach-smdk2410.c 首先要包含我们的 LCD 使用的数据结构的头文件,增加如下内容: #include <asm-arm/arch-s3c2410/fb.h> #include <linux/platform_device.h> 然后添加如下内容: static struct s3c2410fb_display up2410_fb[] __initdata = { { .lcdcon5 = (1<<12)|(1<<11)|(1<<9)|(1<<8)|(1<<0), .type = (3<<5), .width = 640, .height = 480, .pixclock = 39721,
【IT专家】Linux系统移植实验
本文由我司收集整编,推荐下载,如有疑问,请与我司联系
Ø 配置内核时按“空 ”选择,配置完成后保存退出 $make menuconfig Device Drivers -- Character devices -- * FS4412 LED Device Support Ø 保存退出,重新编译后把 uImage 拷贝到 tftpboot 下 $ makeuImage $ cparch/arm/boot/uImage/tftpboot 重新启动开发板,加载内核并运行。在终端下执行下面操作 Ø 创建设备节点 # mknod/dev/ledc5000 Ø 运行测试程序并观察现象 #./fs4412_led_app 6.编译 LED 驱动为模块 Ø 配置内核时按“空 ”选择,配置完成后保存退出 $ make menuconfig Device Drivers -- Character devices -- M FS4412 LED DeviceSupport Ø 保存退出,重新编译后把 zImage 拷贝到 tftpboot 下,把驱动模块拷贝到 /source/rootfs 下 $ makeuImagemodules $ cparch/arm/boot/uImage/tftpboot/ $ cpdrivers/char/fs4412_led_drv.ko/source/rootfs/ 重新启动开发板,linux 运行起来后在终端下操作 Ø 创建设备节点
# mknod/dev/ledc5000
本文由我司收集整编,推荐下载,如有疑问,请与我司联系
Ø 加载 LED 驱动模块
#insmod fs4412_led_drv.ko
Ø 运行测试程序并观察现象
#./fs4412_led_app
fs4412_led_drv.c 源代码如下:
LINUX内核在arm平台上的移植
◆定义数据、代码段、bbs(未初始化数据段)起始地址变量并对bbs段初始化 ◆设置寄存器以初始化系统硬件 ◆关闭中断 ◆初始化LCD显示 ◆将数据段复制到内存 ◆跳转到内核起始函数start_kernel继续执行 ◆对主寄存器的修改 © 2006 Embedded
Init.S
• • • • • • • • • • • • • • • • • • • /* * linux/arch/arm/boot/bootp/init.S * * Copyright (C) 2000 Russell King * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Header file for splitting kernel + initrd. Note that we pass * r0 through to r3 straight through. */ .section .start,#alloc,#execinstr .type _entry, #function _entry: adr r10, initdata ldr r11, initdata sub r11, r10, r11 @ work out exec offset b splitify .size _entry,. - _entry
Linux2.6.37内核移植到Mini2440(六)
Linux2.6.37内核移植到Mini2440(六)Linux 2.6.37内核移植到Mini2440(六)1. 触摸屏库Tslib移植(1) 解压下载的tslib1.4压缩包下载地址:笔者这里没有使用tslib1.4。
发现根本就无法测试。
总是得不到按下信号。
于是就下载了最新版的tslib。
#tar -zxvf kergoth-tslib-1.0-89.tar.gz#cd tslib- kergoth-tslib-1.0-89(2) 配置tslib编译项#./autogen.sh (注意,就能执行一次,多执行的话可能linux重启后会崩溃很麻烦,要慎用哦)./configure --prefix=/usr/local/tslib1.4/ CC=arm-linux-gcc \--host=arm-linux ac_cv_func_malloc_0_nonnull=yes --enable-inputapi=no【注意】./configure --prefix=/usr/local/tslib1.4/ CC=arm-linux-gcc \--host=arm-linux ac_cv_func_malloc_0_nonnull=yes --enable-inputapi=no1)上面的—prefix后的/usr/local/tslib1.4/表示触摸屏tslib在目标板的路径!在编译安装的时候,先安装到宿主机的/usr/local/tslib1.4下,下载到开发板后依然要放在/usr/local/tslib1.4/下。
2)如果不添加ac_cv_func_malloc_0_nonnull=yes,则编译会出现错误:undefined reference to `rpl_malloc'(3) 编译tslib#make经过一小段时间的编译,如果没出错就OK了(4) 安装tslib到宿主机的/usr/local/tslib1.4#make install(5) 修改/usr/local/tslib1.4/etc/ts.conf把第二行的#号去掉,但其前面不能有空格(6) 复制tslib到开发板的相同路径(下面的路径是NFS中开发板的根位置)#mkdir rootfs/usr/local //rootfs根据自己的根文件系统位置修改#cp -arf /usr/local/tslib1.4/ /root/mywork/mini2440/rootfs/usr/loc al/注意:/usr/local/tslib1.4/下的bin、lib、etc复制到开发板根文件系统下的/usr/local/tslib1.4下。
移植linux内核
此内核移植参考T ekkaman Ninja 的文章在此向他表示感谢前提准备:开发板mini2440开发板linux内核为linux-2.6.22.2NOR FLASH为superVIVI注:本人仅仅是从网上搜集的材料然后根据自己的板子情况一点调试修改的其中可能有些错误或不必要修改的地方,(本人也是新手所以谅解下吧)转载请注明出处-----------------hongshaoone一、将Linux2.6.22.2内核源码放到工作目录的kernel文件夹下,并解压二、修改内核源码根目录下的Makefile文件#ARCH ?= arm#CROSS_COMPILE ?=arm-linux-三、修改arch/arm/plat-s3c24xx/common-smdk.c文件,修改Nand Flash的分区信息和Nand Flash 的硬件信息。
(1)static struct mtd_partition smdk_default_nand_part[] = {[0] = {.name = "vivi",.size = SZ_16K*20,.offset = 0,},[1] = {.name = "kernel",.offset = SZ_16K*20, //SZ_16K*20开始为SZ_32K*10,不过make时出错,换成为SZ_16K*20就OK了不知道为什么.size = SZ_2M,},[2] = {.name = "yaffs2",.offset = SZ_2M+SZ_16K*20,.size = SZ_2M*20, // SZ_2M*20 是我随便写的不想再算了呵呵},此处的分区一定要与supervivi的分区一致我是用的 [x] bon part 0 320k 2368k 所以只分了三个区(2)static struct s3c2410_platform_nand smdk_nand_info = {.tacls = 0,.twrph0 = 30, //这三个数字要改的以前是20 60 20.twrph1 = 0,.nr_sets = ARRA Y_SIZE(smdk_nand_sets),.sets = smdk_nand_sets,};四、修改drivers/mtd/nand/s3c2410.c,去掉nand flash 的ECC。
Linux系统的移植
嵌入式系统设计
Linux 内核的编译菜单有几个版本,运行:
1)基于字符界面的config: make config进 入命令行,可以一行一行的配置;
2)基于图形界面的menuconfig:make menuconfig 进入menuconfig 菜单。(稳定且用得最多)
建议经常使用的部分直接编译到内核中,比如网卡。
嵌入式系统设计
内核源码结构
(存放目录:/usr/src/Linux-)
Linux2.4.18
/arch /drivers
/arm
sparc
/m68k
/kernel /lib /init
/boot mach-s3c2410 /kernel /lib
/ipc /fs
嵌入式系统设计
Network firewalls: 是否让内核支持采用网络防火墙。如果计算机想当 firewalls server或者是处于TCP/IP 通信协议网络的网路结构 下,这一项就选上。 Packet socket mmapped IO : 选该项则Packet socket可以利用端口进行快速通讯。 IP advanced router : 如果你想把自己的Linux 配成路由器功能这项肯定要选。 选上后会带出几个子项。这些子项可以更精确配置相关路由功能。
3)基于图形界面的xconfig: make xconfig 进入xconfig菜单。
嵌入式系统设计
嵌入式系统设计 基于字符界面的make config
嵌入式系统设计 基于图形界面的menuconfig 配置菜单
嵌入式系统设计 基于图形界面的xconfig 配置菜单
Linux内核实验报告——实验6
Linux内核实验报告实验题目:构造新内核同步机制实验实验目的:要设计一组新的内核同步原语,它们具有如下的功能:能够使多个进程阻塞在某一特定的事件上,直到另一进程完成这一事件释放相关资源,给内核发送特定消息然后由内核唤醒这些被阻塞的进程。
如果没有进程阻塞在这个事件上, 则消息被忽略。
可以编写 4 个系统调用来实现这些功能要求:1、生成一个事件的系统调用函数:int myevent_open(int eventNum);生成一个事件,返回该事件的 ID,如果参数为 0,表示是一个新的事件,否则就是一个存在的事件。
2、将进程阻塞到一个事件的系统调用函数:int myevent_wait(int eventNum);进程阻塞到 eventNum 事件,直到该事件完成才被唤醒。
3、唤醒等某事件进程的系统调用函数:int myevent_signal(int eventNum);唤醒所有等 eventNum 事件的进程,如果队列为空,则忽略。
4、撤销一个事件的系统调用函数:int myevent_close(int eventNum);撤销一个参数代表的事件,成功返回 eventNum。
最后重新设计这些系统调用,模拟实现信号量机制。
硬件环境:Pentium(R)*************************软件环境:Ubuntu12.04gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)内核版本:3.0.24实验步骤:1、代码分析结构体:typedef struct __myevent{int eventNum; // 事件号atomic_t value;wait_queue_head_t p; // 系统等待队列首指针struct __myevent *next; // 队列链指针}myevent_t;P操作:asmlinkage int sys_myevent_wait(int eventNum){myevent_t *tmp;myevent_t *prev = NULL;//取出指定事件的等待队列头指针?只是在事件队列上找到对应的事件吧,然后把该事件上的等待队列头指针取出来用if((tmp = scheventNum( eventNum, &prev)) != NULL){printk("[wait]:value is %u",atomic_read(&tmp->value));if (atomic_read(&tmp->value) > 0){ //YJ:有可用资源,减1并立即返回;不然等待atomic_dec(&tmp->value);printk("[wait]:i've dec value to <%u>",atomic_read(&tmp->value));return eventNum;}printk("[wait]:value should be 0 to sleep-->value:%u\n",atomic_read(&tmp->value));DEFINE_WAIT(wait); //初始化等待队列入口//使调用进程进入阻塞状态//prepare_to_wait(&tmp>p,&wait,TASK_INTERRUPTIBLE);set_current_state(TASK_INTERRUPTIBLE);add_wait_queue_exclusive(&tmp->p,&wait); //独占等待,放到队尾并置标志schedule(); //引发系统重新调度finish_wait(&tmp->p,&wait); // 设置当前进程状态为RUNNING,并且从队列中删除之(如果队列非空)printk("[wait]:now i'm back and value is :%u\n",atomic_read(&tmp->value));return eventNum;}return 0;}V操作:asmlinkage int sys_myevent_signal(int eventNum)myevent_t *tmp = NULL;myevent_t *prev = NULL;//取出指定事件的等待队列头指针if((tmp = scheventNum(eventNum,&prev)) != NULL) {if (list_empty(&(tmp->p.task_list))) { //没有进程在队列上atomic_inc(&tmp->value);printk("[signal]:so list is empty and value now is(added):%u\n",atomic_read(&tmp->value));return eventNum;}//唤醒操作,由于独占等待,只会唤醒一个进程,而且DEFINE_W AIT时挂上了autoremove_wake_up方法,进程会自动从队列上删除,wake_up和add_wait_queue这些都自动加spinlock了printk("[signal]:so i'm going to wake up one exclusive process\n");wake_up(&tmp->p);return eventNum;}return 0;}2、设计说明在这里着重说明信号量机制的实现。
LINUX移植和编译实验,实验六Linux内核移植实验.doc
LINUX移植和编译实验,实验六Linux内核移植实验.doc实验六Linux内核移植实验实验六 Linux内核移植实验⼀、实验⽬的1. 掌握交叉编译环境的建⽴和使⽤;2. 熟悉 Linux 开发环境,掌握 Linux 内核的配置和裁减;3. 了解 Linux 的启动过程。
⼆、实验环境预装Fedora10的pc机⼀台,CVT-A8系列实验箱$cd /opt/cvtech/kernel-s5pv210$make menuconfig如下图所⽰,在提⽰框中键⼊ config-s5pv210-b4y2 配置⽂件名,然后选择“Ok”确认,将退回到主菜单。
然后按“Esc”键退出,并将提⽰是否保存,请选择“Yes”保存。
2.编译:可以通过 make 或者 make zImage 进⾏编译,它们的差别在于 make zImage将 make ⽣成的核⼼进⾏压缩,并加⼊⼀段解压的启动代码,本实验采⽤ make zImage 编译。
$make zImage⽣成的 Linux 映像⽂件 zImage 保存在/opt/cvtech/kernel-s5pv210/arch/arm/boot/⽬录下。
5. 下载 Linux 核⼼并运⾏编译成功后的 Linux 核⼼为/opt/cvtech/kernel-s5pv210/arch/arm/boot/zImage。
通过 u-boot将该核⼼ zImage 下载到 SDRAM 中。
具体步骤:1. 编译 Linux 核⼼;$cd /opt/cvtech/kernel-s5pv210$make menuconfig选择“Load an Alternate Configuration File”,加载 config-s5pv210-b4y2 配置⽂件,保存并退出。
$make zImage编译成功后,拷贝 zImage 到下载⽬录$cp /opt/cvtech/kernel-s5pv210/arch/arm/boot/zImage /mnt/hgfs/share2. 下载 Linux 核⼼并运⾏。
第6章_Linux内核移植
Linux 内核源代码的结构
Linux内核源代码位于/usr/src/linux目录下。 /include子目录包含了建立内核代码时所需的大部分包含文件, 这个模块利用其他模块重建内核。 /init 子目录包含了内核的初始化代码,这是内核工作的开始的起 点。 /arch子目录包含了所有硬件结构特定的内核代码。如: i386,alpha,arm等 /drivers子目录包含了内核中所有的设备驱动程序,如块设备和 SCSI设备。 /fs子目录包含了所有的文件系统的代码。如:ext2,vfat等。 /net子目录包含了内核的连网代码。 /mm子目录包含了所有内存管理代码。 /ipc子目录包含了进程间通信代码。 /kernel子目录包含了主内核代码。
Linux内核源代码导读
进程间通信: 所有的SystemVIPC对象权限都包含在ipc_perm数据结构中,这可以 在include/linux/ipc.h中找到。SystemV消息是在ipc/msg.c中实现。共享 内存在ipc/shm.c中实现。信号量在ipc/sem.c中,管道在/ipc/pipe.c中实 现。 中断处理: 内核的中断处理代码几乎所有的微处理器特有的。中断处理代码在 arch/i386/kernel/irq.c中,其定义在include/asm-i386/irq.h中。 在Internet,有人制作了源代码导航器,为阅读源代码提供了良好的条 件,站点为lxr.linux.no/source。 对内核的修改用补丁文件的方式发布。patch实用程序用来对内核源文 件进行一系列的修改。例如:你有2.2.9的源代码,但想移到2.2.10。就 可以获得2.2.10的补丁文件,应用patch来修改2.2.9源文件。例如: # cd /usr/src/linux # patch –pl < patch-2.2.10
实验六 Linux内核编译实验
实验六Linux内核编译讲师:杨行【实验目的】1、掌握Linux内核编译2、了解Linux内核Makefile3、了解Linux内核Kbuild系统【实验原理】网站可以下载标准内核文件;本次实验使用的内核源码详见,ARM裸板驱动开发课程所发的arm_linux文件夹;一、编译内核1 内核源码目录分析2 内核编译主要过程;du -hs linux-2.6.32.2.tar.gztar xzvf linux-2.6.32.2-mini2440-20130614.tar.gz -C /find -name "*" | wc –ltreecp config_mini2440_w35 .configmake menuconfigmake zImage3 编译主要过程讲解将所有目标连接为:LD vmlinux去除vmlinux生成纯二进制文件OBJCOPY arch/arm/boot/Image提示镜像文件编译生成Image Kernel: arch/arm/boot/Image is ready汇编编译程序启动头AS arch/arm/boot/compressed/head.o 压缩源码Image:GZIP arch/arm/boot/compressed/piggy.gz 汇编编译产生压缩程序AS arch/arm/boot/compressed/piggy.o 链接LD arch/arm/boot/compressed/vmlinux 纯二进制文件生成:OBJCOPY arch/arm/boot/zImage最终生成:Kernel: arch/arm/boot/zImage is ready/linux-2.6.32.2/arch/arm/boot$ du -hs Image/linux-2.6.32.2/arch/arm/boot$ du -hs zImage4 运行内核copy zImage 到tftpboot目录中;tftp 下载zImage到0到0x30008000地址后;使用bootm 0x30008000 启动内核;查看内核是否可以正常启动;未能启动内核的原因有两种:第一种:未配置网络文件系统;第二种:未正确设置u-boot启动参数;4.1 配置nfs文件系统1. sudo apt-get install nfs-kernel-server2. sudo vim /etc/exports+/nfsroot *(rw,sync,no_root_squash)3. sudo /etc/init.d/portmap restart4. sudo /etc/init.d/nfs-kernel-server restart5. showmount –e切换到/home/spring/arm_linux/mini2440/src目录下:6 sudo tar xvf nfsroot.tar -C /4.2 设置u-boot的启动参数在u-boot命令行模式下:set bootargs root=/dev/nfs rw nfsroot=192.168.0.1:/nfsroot ip=192.168.0.230 console=ttySAC0,115200save5 编写测试程序hello.c#include<stdio.h>int main(){ printf("hello world!\n");while(1);}5.1 在PC机上面编译hello.carm-linux-gcc –c helo.c –o hello.oarm-linux-gcc hello.o –o hellocp hello /nfsroot5.2 在mini2440平台上后台运行hello,并使用命令杀死hello进程/sq1415 # lshello/sq1415 # ./hello &/sq1415 # hello world!/sq1415 #/sq1415 # ps -a |grep hello729 0 0:50 ./hello731 0 0:00 grep hello/sq1415 # kill -9 729/sq1415 # jobs[1]+ Killed ./hello/sq1415 #6.设置自启动参数set bootcmd tftp 0x30008000 zImage\; bootm 0x30008000save二、内核Makefile分析1. 查看fs/Makefile 文件Var = deferred 延时变量Var ?= deferred 延时变量Var := immediate 立即变量Var += deferred or immediate延时变量:在使用时才确定变量的值立即变量:在定义时已确定变量的值2.查看顶层Makefile文件顶层Makefile文件通过include包含子目录中的Makefile文件$(srctree)代表的是当前源码路径3 Makefile文件中包含auto.config 文件:一般配置变量是在auto.conf文件中定义;4 查看arch/arm/Makefile 文件分析顶层Makefile中SRCARCH=ARCH=arm所以该Makefile 将产生arm架构的编译过程;5 make zImage 编译过程分析5.1 首先我们在顶层Makefile文件中查找zImage文件结果是查找不到在Image目标5.2 在arch/arm/Makefile 中查找在zImage,结果是在zImage依赖于vmlinux 5.3 在arch/arm/Makefile 中查找zImage,未找到vmlinux: 目标5.4 在顶层Makefile 中查找vmlinux:5.5 在顶层Makefile中依次查找vmlinux-lds、vmlinux-init、vmlinux-main、vmlinux.o、kallsyms.o5.5.1 查找vmlinux-init的依赖:5.5.1.1 查找head-y的依赖:5.5.1.2 查找init-y的依赖:继续查找:$(patsubst %/, %/built-in.o, $(init-y))该函数实现在init-y变量中的所有带有/路径之后添加built-in.o 则。
操作系统实验---配置和编译Linux内核
实验题目
姓名:
学号:
课程名称:
操作系统
所在学院:
信息科学与工程学院
专业班级:
计算机
任课教师:
实验项目名称
在Ubuntu16.04上配置和编译Linux内核
一、实验目的与要求:
1.按照提供的连接认真准备实验。
2.提前了解Linux内核的特点以及编译方法。
3.熟悉相关的指令代码并知道其作用。
4.编译完成可使用的内核,内核以姓名和学号命名,请勿直接拷贝其他同学的内核。
二、实验设备及软件:
计算机一台
Linux操作系统
三、实验方法(原理、流程图)
1、构建内核源码树
1)下载安装包
2)解压到内核源码目录下
2、编译内核
1)安装基本工具软件
2)在终端进入你的解压的内核源码的目录
3)依次执行相对应的命令
七、教师批阅意见:
成绩评定:
教师签字:
年月日
八、备注:
(4)依次执行以下命令
$ cd linux-3.19.0
$ cp /boot/config-$(uname -r) .config
$ make menuconfig
$ kg clean
$ fakeroot make-kpkg--initrd--revision166003566.001--append-to-version--20160906 kernel_image kernel_headers
3.编译完成可使用的内核
得到最终文件
四、实验过程、步骤及内容
五、编译内核
(1)安装基本的工具软件。
(2)我是在这里下载的源码包:https:///pub/linux/kernel/v3.x/,我下载的源码包是linux-3.19.0.tar.xz
linux内核移植-共同成长
Tiny6410 的内核移植(拿来主义)一、环境环境fedoral13编译器,友善自带arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz硬件,tiny6410,核心板号1106 NAND 2G RAM 256M注意:移植内核时,确保引导文件为u-boot类型,否则到后面下载到开发板使会出现乱码以及不必要的错误二、移植nand_flash1 下载linux-2.6.38的源码ftp:///pub/linux/kernel/v2.6/linux-2.6.38.tar.bz22 解压#tar xvfj /mnt/ubuntu/linux-2.6.38.tar.bz2 -C .3 修改根下的Makefile#vi Makefile191行改为ARCH ?= armCROSS_COMPILE ?= arm-linux- (找到其交叉编译环境)4 生成默认配置文件#cp arch/arm/configs/s3c6400_defconfig .config(如果省略的话,后面会找不到System Type)5 修改配置项(基本配置)#make menuconfigGeneral setup->(/usr/4.5.1/bin/arm-linux-) Cross-compiler tool prefix 我将编译器解压到了/opt/Friendly/toolschain/4.5.1/bin目录(如果第三步中以修改“plier ? = arm-linux- ”此项,这步可以不作)System Type->[*] MINI6410 选上,其他的可以去掉,不确定的可以参考友善之臂的(这样编译出来的内核是可以被uboot引导的,然后是增加nand flash支持)vi arch/arm/mach-s3c64xx/mach-mini6410.c第117行struct mtd_partition mini6410_nand_part[] = {{.name = "Bootloader",.offset = 0,.size = (4 * 128 *SZ_1K),.mask_flags = MTD_CAP_NANDFLASH,},{.name = "Kernel",.offset = (4 * 128 *SZ_1K),.size = (5*SZ_1M) ,.mask_flags = MTD_CAP_NANDFLASH,},{.name = "File System",.offset = MTDPART_OFS_APPEND,.size = MTDPART_SIZ_FULL,}}; //update at 2011-8-26 经过测试发现,这里改完后根本不起作用,甚至将整个注释也无妨,估计分区已经固死在后面的s3c_nand_mlc.fo 中6 拷贝NAND FLASH驱动(将6410内核中的如下文件拷到相应的目录下)需拷贝文件:drivers/mtd/nand/s3c_nand.carch/arm/plat-samsung/include/plat/regs-nand.hdrivers/mtd/nand/s3c_nand_mlc.fo《s3c_nand_mlc.fo友善没有开源的一个驱动之一,所以不用研究了,拷过来就是了。
嵌入式Linux内核移植试验
07秋嵌入式实验1. 实验设备的连接1. 参看《JXARM9-2410-1用户手册》中第一章,熟悉目标设备硬件,进行硬件检测。
2. 参看《JXARM9-2410-1用户手册》中第二章,安装好实验设备:电源,并口等。
3. 参看《JXARM9-2410-1用户手册》中第三章,了解目标设备硬件资源。
2. 软件安装与设置参看《JXARM9-2410-1用户手册》中第四章,在主机Windows环境下安装实验环境:ADT,而DNW(一种超级终端软件)和tftp可以直接运行。
3. ADT IDE 开发流程参看《JXARM9-2410-1用户手册》中第五章,通过并口线连接目标机的简易仿真口(ARM9SIMPLE),进行无操作系统实验:(实验教材P38)(1)对于包含ADT 1000仿真器的用户,请选择ARM9LPT,对于简易调试器的用户,请选择ARM9SIMPLE,本实验选择ARM9SIMPLE。
(2)导入examples目录中的工作区文件“examples.aws”,调试运行leddemo、stepper 等程序(3)注意:要运行的工程需设置为当前工程4. Uboot基本实验参看《JXARM9-2410-1用户手册》中第七章的“7.2 Windows环境下使用u-boot”:(实验教材P186)(1)将连接目标机简易仿真口的并口线去掉,连接好UART0串口线,网线。
(2)在宿主机打开远程登陆软件DNW(或者超级终端),选择115200,COM1,建立与目标机的连接(3)重新启动目标机,在DNW中会看到与目标机LCD相同的信息,表示连接成功!(4)在超级终端中使用Uboot命令行接口,练习Uboot的基本命令:help、flinfo、bdinfo、md、dmp、printenv、setenv、saveenv、run等5. 嵌入式Linux内核移植实验参看《JXARM9-2410-1用户手册》中第六章(1)参看6.1和6.2节,熟悉交叉开发环境,建立宿主机环境。
第06部分 Linux内核移植及调试
6.1.2 开发板内核移植
1.获得Linux内核源码并解压缩 2.修改Makefile文件 ARCH ?= $(SUBARCH) CROSS_COMPILE ?= 修改成如下两行: ARCH ?= arm CROSS_COMPILE ?= arm-linux3.得到.config文件 由于我们的配置和SMDK2410开发板的类似,因此可以 使用它的.config文件,只需要把它的.config文件拷贝到 源代码根目录下的.config文件即可: #cp arch/arm/configs/s3c2410_defconfig .config
6.2 Linux内核启动过程分析
Linux内核启动就是引导内核映像启动的过 程。典型的内核映像是zImage,包含自引导程 序和压缩的vmlinux这两部分。启动过程从内核 映像入口开始执行,解压vmlinux并且转换到虚
拟地址空间,再调用统一的内核启动函数
start_kernel(),从而启动整个Linux系统。
6.2.6 初始化设备驱动
这里内核子系统已经基本上初始化好 了,CPU子系统已经正常工作,内存管理 和进程管理已经正常运转,但是还没有使
用任何设备。接下来继续初始化内核设备
驱动程序,然后才能访问设备,做系统真
正想要做的任务。
6.2.7 启动用户空间init进程
Linux 系 统 在挂 接 根 文 件 系 统 之后,要执行文件系统的中的应用
动态加载驱动和Linux内核移植
项目三:Linux内核移植1.能力培养目标●了解嵌入式Linux内核的构成●掌握内核裁减定制的方法●掌握内核编译的方法●掌握内核烧写的方法2.项目任务要求(1)项目任务Linux内核的裁剪、编译和烧写。
(2)项目来源及应用对于较复杂的嵌入式系统项目,当硬件平台制作好之后,就需要向其移植操作系统,如果移植的是嵌入式Linux且为GUI应用,那么移植过程一般包含:第一步,移植引导程序(Vivi、BLOB、uBoot等);第二步,移植内核kernel;(本次实验内容)第三步,移植根文件系统;第四步,移植库文件,如QT库;第五步,运行项目程序。
(3)功能需求裁减一个可用的Linux内核●选择正确的处理器类型●使其支持网卡、小键盘、USB鼠标、声卡等设备●成功编译后烧写到目标机上●内核能正确加载运行●键盘驱动可用(4)项目开发环境需求3.项目预习(1)了解项目目标、项目任务要求、项目设计和项目实施步骤。
(2)下载本次实验所需要的软件和代码。
将3_kbd_test目录放到linux虚拟机的up-techpxa270cl目录下。
(3)完成内核裁剪及编译好内核映像,即完成第5大项中的步骤(4)-(5)。
(4)回答以下问题如何能够在目标机上访问宿主机上的文件?说明使用mount命令进行文件挂载的方法。
说明mount命令执行不成功可能的原因和解决方法。
说明本实验所使用的Linux内核版本。
说明Linux内核裁减定制的方法。
4.项目设计4.1选择Linux内核裁减方法Linux内核的裁减配置的三种命令:1、make config:命令行模式,一行一行的配置,不推荐使用。
2、make menuconfig:大多人熟悉的menuconfig菜单。
3、make xconfig:基于QT图形化配置,菜单结构清晰。
所有内核裁减配置过程,都是通过Config.in(2.4内核)或Kconfig(2.6内核)经由不同脚本解释器产生.config配置文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验 6 Linux-2.6.28移植实验
【实验目的】
熟悉Linux-2.6.28移植过程。
【实验步骤】
第一步:从/pub/linux/kernel/v2.6下载linux-2.6.28.tar.bz2压缩文件(或光盘中提供);
【图5-3-1】
第二步:将linux-2.6.28.tar.bz2压缩文件复制到Linux工作目录;
第三步:在Linux下利用tar jxvf linux-2.6.28.tar.bz2命令解压linux-2.6.28.tar.bz2压缩文件。
第四步:进入解压后的linux-2.6.28目录下,利用vi编辑工具修改linux-2.6.28目录下的顶层Makefile文件。
第五步:修改linux-2.6.28目录下的顶层Makefile文件,设置编译linux操作系统的CPU体系架构变量ARCH 和所使用的交叉编译工具链变量CROSS_COMPILE(注:实验使用arm-linux交叉编译工具链 4.2.1版本,可从/pub/snapgear/tools/arm-linux/下载arm-linux-tools-20070808.tar.gz压缩文件,解压到/OPT目录下)。
改为
ARCH ?= arm
CROSS_COMPILE ?=/opt/usr/local/bin/arm-linux-
【图5-3-2】
第六步:将linux-2.6.28目录下的arch/arm/configs/mainstone_defconfig文件复制为xsbase270_defconfig文件。
第七步:在linux-2.6.28/arch/arm/mach-pxa目录下增加一个xsbase270.c文件(实际上从该目录下的mainstone.c复制而来.也可以直接复制实验代码中的文件),然后根据实际平台进行修改。
第八步:修改linux-2.6.28\arch\arm\mach-pxa目录下的Makefile文件,增加编译xsbase270.c 的编译选项,即:obj-$(CONFIG_MACH_XSBASE270) += xsbase270.o。
第九步:修改linux-2.6.28\arch\arm\mach-pxa目录下的Kconfig文件,增加在裁剪内核时支持对EELiod/Liod平台的选择
【图5-3-3】
第十步:linux-2.6.28/drivers/mtd/maps文件夹中增加一个xsbase270-flash.c文件(注:xsbase270-flash.c从该目录下的mainstone-flash.c修改而来, 也可以直接复制实验代码中的文件)。
第十一步:修改linux-2.6.28\drivers\mtd\maps目录下的Makefile文件,增加编译xsbase270-flash.c的编译选项,
即:obj-$ (CONGIG_MTD_XSBASE270 ) += xsbase270-flash.o。
第十二步:修改linux-2.6.28\drivers\mtd\maps目录下的Kconfig文件,增加在裁剪内核时支持对EELiod/Liod平台flash驱动的选择
【图5-3-4】
第十三步:在linux-2.6.28\arch\arm\mach-pxa\include\mach目录下增加一个xsbase270.h的头文件。
第十四步:修改linux-2.6.28\arch\arm\mach-pxa\include\mach目录中irqs.h文件(也可以直接复制实验代码中的文件),在文件最后增加EELiod/Liod平台相关中断定义,内容如下。
【图5-3-5】
第十五步:在linux-2.6.28目录下执行make xsbase270_defconfig。
第十六步:在linux-2.6.28目录下执行make menuconfig命令,进入内核配置主菜单。
第十七步:在内核配置主菜单中选择System Type---> Intel PXA2xx Implementations ---> Select target board 选择(X) Emdoor EELiod/Liod Development Platform,该选项对应于第九步修改的内容。
【图5-3-6】
第十八步:在内核配置主菜单中选择Device Drivers---> Memory Technology Device (MTD)support ---> Mapping drivers for chip access ---> 选择(*) CFI Flash device mapped on Emdoor EELiod board,该选项对应于第12步修改的内容。
【图5-3-7】
第十九步:在内核配置主菜单中选择Boot options--->(root=/dev/nfs ip=bootp console=tyyS0,115200 mem=64)改为root=/dev/mtdblock2 rootfstype=jffs2 console=tyyS0, 115200 mem=64M。
【图5-3-8】
第二十步:配置完成后,在提示是否保存内核配置的提示对话框中选择<Yes>。
【图5-3-9】
第二十一步:配置完成后,在Linux-2.6.28目录下运行make zIamge编译内核,编译后的内核文件保存在Linux-2.6.28/arch/arm/boot/目录下。
第二十二步:将编译好的内核文件zImage下载到目标平台,(必须同时要下载Linux文件系统),重新启动开发平台,查看内核启动情况(注:Bootloader源码中的command.c文件中kernel(0,###)函数,其中###必须与1141对应才能引导内核)。