实验6 ——Linux 内核移植实验
- 格式:doc
- 大小:2.03 MB
- 文档页数:5
实验四 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操作系统内核实验报告篇一: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等。
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下。
此内核移植参考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内核实验报告实验题目:构造新内核同步机制实验实验目的:要设计一组新的内核同步原语,它们具有如下的功能:能够使多个进程阻塞在某一特定的事件上,直到另一进程完成这一事件释放相关资源,给内核发送特定消息然后由内核唤醒这些被阻塞的进程。
如果没有进程阻塞在这个事件上, 则消息被忽略。
可以编写 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、设计说明在这里着重说明信号量机制的实现。
实验 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对应才能引导内核)。