5(g)内核操作Linux2.6内核驱动移植参考
DM9000驱动移植详解及问题点
OK6410、2.6.36内核移植,dm9000 驱动移植,详细!分类:嵌入式学习Linux学习2012-04-27 00:54 3004人阅读评论(7) 收藏举报interfaceccompressionresourcesstructtable还是先来吐槽:本来我是在上一个星期的周末已经把Linux2.6.34.11 的驱动已经成功的移植到,OK6410 的开发板上的,并且能够启动主机上的NFS 根文件系统,可是我在周一的时候,开始学习LCD 的驱动程序,在修改内核文件的时候,有几处错误修改,将原来自己做的2.6.34.11 的内核源码搞的乱七八糟的,在这里还是自己在修改内核的时候没有提注重注释,并且没有记录下来自己的操作步骤,以至于我没办法,恢复2.6.34 的内核,所以也就只能重新先开始最基础的内核移植了。
这次我选择的是2.6.36.2 的内核,谁知到一开始移植就出现一大堆问题。
在这里我不得不说,飞凌开发人员对内核修改的代码,管理真的是太扯了,自己在注销任何一个设备是没有一点点注释,就把这个设备原有的线性地址分配给其它设备了,让我让我们这些菜鸟干看着一大堆的报错信息顶个什么用,真的是伤不起。
好了不乱扯了,现在开始记录。
我的开发环境是:VMware Ubuntu 10.10 。
OK6410 A版256M+2G 的开发板。
主机系统:XP。
Uboot:飞凌提供的Uboot。
参考内核:飞凌提供的Forlinx 的2.6.36.2 内核操作步骤以下./ 均代表你的内核根目录1、修改./Makefile191 ARCH ?=arm // 指定cpu类型,arm后面不要有空格,要不然编译是会提醒ARCH 不能为一个目录192 CROSS_COMPILE ?=/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux- // 指定交叉编译器的路径,按照你自己的进行指定路径2、先来说说nand flash 的驱动涉及到的文件:MTD 通用nand flash 驱动程序位置:./drivers/mtd/nand/.nand_base.cNAND Flash 的platform 设备信息: ./drivers/mtd/nand/s3c_nand.c有了上面的依赖驱动依赖程序、接下来修改./arch/arm/mach-s3c64xx/mach-smdk6410.c 1) nandflash 驱动,修改方法加载头文件[cpp]view plaincopyprint?1.#include <linux/mtd/mtd.h>2.#include <linux/mtd/partitions.h>3.#include <plat/nand.h> //这些头文件放在./arch/arm/plat-samsung/include/ 下面添加nand 结构体[cpp]view plaincopyprint?1.// add by acanoe first2.extern void s3c64xx_reserve_bootmem(void); //add by acanoe3.4.5.struct mtd_partition ok6410_nand_part[] = {6. {7. .name = "Bootloader",8. .offset = 0,9. .size = (1 * SZ_1M),10. .mask_flags = MTD_CAP_NANDFLASH,11. },12. {13. .name = "Kernel",14. .offset = (1 * SZ_1M),15. .size = (5*SZ_1M) ,16. .mask_flags = MTD_CAP_NANDFLASH,17. },18. {19. .name = "User",20. .offset = (6 * SZ_1M),21. .size = (120*SZ_1M) ,22. },23. {24. .name = "File System",25. .offset = MTDPART_OFS_APPEND,26. .size = MTDPART_SIZ_FULL,27. }28.};29.30.31.static struct s3c2410_nand_set ok6410_nand_sets[] = {32. [0] = {33. .name = "nand",34. .nr_chips = 1,35. .nr_partitions = ARRAY_SIZE(ok6410_nand_part),36. .partitions = ok6410_nand_part,37. },38.};39.40.41.static struct s3c2410_platform_nand ok6410_nand_info = {42. .tacls = 25,43. .twrph0 = 55,44. .twrph1 = 40,45. .nr_sets = ARRAY_SIZE(ok6410_nand_sets),46. .sets = ok6410_nand_sets,47.};48.//add by acanoe first修改 smdk6410_devices[] __initdata = {对照这个结构体将那些进行修改,注意 by acanoe 的语句为修改重点。
Linux操作系统考试题库
一、选择题1)下列关于操作系统的叙述中,哪一条是不正确的?( C )A.操作系统管理计算机系统中的各种资源B.操作系统为用户提供良好的界面C.操作系统与用户程序必须交替运行D.操作系统位于各种软件的最底层2)Linux的发展始于()年,它是有()的一名大学生开发的。
( B )A. 1990、芬兰B. 1991、芬兰C. 1993、美国D. 1991、波兰3)内核不包括的子系统是( D )。
(进程管理系统\内存管理系统\I/O管理系统\ 虚拟文件系统\进程间同性间通信子系统)A.进程管理系统B.内存管理系统C.I/O管理系统D.硬件管理系统4)Linux 中权限最大的账户是( B )。
A. adminB. rootC. guestD. super5)在通常情况下,登录Linux 桌面环境,需要( B )。
A.任意一个帐户B.有效合法的用户帐号和密码C.任意一个登录密码D.本机IP 地址6)Linux文件权限中保存了( D )信息。
A.文件所有者的权限B.文件所有者所在组的权限C.其他用户的权限D.以上都包括7)Linux文件系统的文件都按其作用分门别类地放在相关的目录中,对于外部设备文件,一般应将其放在( C )目录中。
A./binB./etcC./devD./lib8)某文件的组外成员的权限为只读;所有者有全部权限;组内的权限为读与写,则该文件的权限为( D )。
A. 467B. 674C. 476D. 7649)文件exer1的访问权限为rw-r--r--,现要增加所有用户的执行权限和同组用户的写权限,下列命令正确的是( A )。
A. chmod a+x g+w exer1B. chmod 765 exer1C. chmod o+x exer1D. chmod g+w exer110)当前安装Linux的主机中位于第二个IDE接口的master接口挂接一块40GB的硬盘,其在Linux中的设备文件名为( B )。
Linux kernel内核升级全过程,教你一次成功
序言由于开发环境需要在linux-2.6内核上进行,于是准备对我的虚拟机上的Linux系统升级。
没想到这一弄就花了两天时间(反复装系统,辛苦啊~~),总算把Linux系统从2.4.20-8内核成功升级到了2.6.18内核。
网上虽然有很多介绍Linux内核升级的文章,不过要么过时,下载链接失效;要么表达不清,不知所云;更可气的是很多文章在转载过程中命令行都有错误。
刚开始我就是在这些“攻略”的指点下来升级的,以致于浪费了很多时间。
现在,费尽周折,升级成功,心情很爽,趁性也来写个“升级攻略”吧!于是特意又在虚拟机上重新安装一个Linux系统,再来一次完美的升级,边升级边记录这些步骤,写成一篇Linux内核升级记实录(可不是回忆录啊!),和大家一起分享~~!一、准备工作首先说明,下面带#号的行都是要输入的命令行,且本文提到的所有命令行都在终端里输入。
启动Linux系统,并用根用户登录,进入终端模式下。
1、查看Linux内核版本# uname -a如果屏幕显示的是2.6.x,说明你的已经是2.6的内核,也用不着看下文了,该干什么干什么去吧!~~~如果显示的是2.4.x,那恭喜你,闯关通过,赶快进行下一步。
2、下载2.6内核源码下载地址:/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz23、下载内核升级工具(1)下载module-init-tools-3.2.tar.bz2/pub/linux/utils/kernel/module-init-tools/module-init-tools-3.2.tar.bz2(2)下载mkinitrd-4.1.18-2.i386.rpm/fedora/linux/3/i386/RPMS.core/mkinitrd-4.1.18-2.i386.rpm(3)下载lvm2-2.00.25-1.01.i386.rpm/fedora/linux/3/i386/RPMS.core/lvm2-2.00.25-1.01.i386.rpm(4)下载device-mapper-1.00.19-2.i386.rpm/fedora/linux/3/i386/RPMS.core/device-mapper-1.00.19-2.i386.rpm(2.6.18内核和这4个升级工具我都有备份,如果以上下载地址失效,请到/guestbook留下你的邮箱,我给你发过去)好啦,2.6内核和4个升级工具都下载完了(少一个也不行,如果没有下载齐全,请不要尝试下面的步骤,升级是不会成功的),下面回到Linux系统中开始配置工作吧。
linux 2.6 kernel移植到QEMU Mips的源代码文档.
Port Linux 2.6 Kernel to Qemu MipsAuthor: Joy Tang2009.1Version 1.02Overview•Use open source to study, no confidential information inside.•If we need deep view inside linux, we must understand what kernel do.•This doc is for build up mips for linux environment run on X86 emulator machine.I, Build Kernel•Target•Main CPU: QEMU emulate Mips•Cross Compile:mips-linux•Develop Environment: Red Hat•Notes, QEMU also support melta board, and MIPSsim. Reference web page: https:///mailarchive/git-commits-head/2008/1/29/636729/thread, from version linux 2.6.25, it remove qemu mips inside.Prepare Working•Prepare Working:•Download source code of Linux:•Annymos login •Go to the folder "/pub/linux/kernel/v2.6" inside FTP.•Get the source code:tar -jxvf linux-2.6.22.19.tar.bz2•2.6.21 will be another choice.Add Toolchain to Search Path•vi /etc/profile, add following lines•PATH="$PATH:/opt/hardhat/devkit/mips/lexra_fp_b e/bin"•PATH="$PATH:/opt/hardhat/devkit/mips/lexra_fp_b e/target/bin"•PATH="$PATH:/opt/build_mips_nofpu/mips-uClibc-linux/usr/bin“•…Change Makefile•vi Makefile, search SUBARCH•Change toSUBARCH := mips•Find CROSS_COMPILE, change toCROSS_COMPILE ?= mips-linux-•vi arch/mips/Makefile, search cflags-y:=, if it is cflags-y:= mips1, change it to cflags-y:=•The change base on user itself environment.Start to Build, Step1•Make config or make menuconfig or make xconfig •Change CPU to QEMU•Add support for “Initial RAM filesystem and RAM disk”. (Initial RAM filesystem and RAM disk (initramfs/initrd) support (BLK_DEV_INITRD) [N/y/?] n change to Y)•Change many other settings, such as MAP_RAM, MTD support, MTD_PLATRAM•Attach .config file for reference. (end of this doc)•File system analyses•In company file system, there are 4 mtds, •1, busybox=> mtd1•2, kernel=>mtd2•3, workdir=>mtd3•4, jffs etc folder=> mtd4•This step will mount all this 4 files.•Change source:go to drivers/mtd/maps.•Run cp cfi_flagadm.c qemuflash.c•Change linux/drivers/mtd/maps/Kconfig, find config MTD_CDB89712, after it, addconfig MTD_QEMU_EMUFLASHtristate"gggggg qemu emu flash”•Also change Makefile under linux/drivers/mtd/maps/ Find obj-$(CONFIG_MTD_CDB89712)+= cdb89712.o, after it, addobj-$(CONFIG_MTD_QEMU_EMUFLASH)+= qemuflash.o•See attach (makefile& kconfig, end of this doc)•For the file, qemuflash.c, there is some comments:•mtd0,mtd1, mtd2 is not used. Mtd3 is for workdir, mtd4 is for jffs etc folder.•Here is attach. (end of this doc)•Go to folder \fs\jffs2, open earse.c, line 350, function jffs2_block_check_erase, add a qemu patch#ifdef CONFIG_QEMU#elseprintk(KERN_WARNING"Newly-erased block ……#endif•Goto root folder, run make config, press enter until it quit. This is for correct errors in the file “.config”•Run build commandmake all•Run commandcp -f ./vmlinux/opt/emularor/qemu/mips/myimages2…After that, kernel elf file will be send to qemu folderII, Build Qemu•Download qemu packet on web/qemu/download.html•Get the file /qemu/qemu-0.9.1.tar.gz •Uncompress it. In order to save time, inside file config-host.mak: change TARGET_DIRS to mips-softmmu.•Open root folder\vl.c•Add following lineschar g_mtdFileName_etcSave[1024];char g_mtdFileName_workdir[1024];•At beginning of main function, addmemset(g_mtdFileName_etcSave, 0, 1024);memset(g_mtdFileName_workdir, 0, 1024);At the end of function drive_init, add following lines if (type == IF_PFLASH && g_mtdFileName_etcSave[0] == 0){//mtd will load to bios mem, save file name firstsprintf(g_mtdFileName_etcSave, "%s", file);}if (type == IF_MTD && g_mtdFileName_workdir[0] == 0){//mtd will load to bios mem, save file name firstsprintf(g_mtdFileName_workdir, "%s", file);}•Go to “hw”folder, open mips_r4k.c, add following lines •extern char g_mtdFileName_etcSave[1024]; //2M •extern char g_mtdFileName_workdir[1024]; //30M•#define START_ADDR_ETC_SAVE 0x1fc00000•#define SIZE_ETCSAVE 0x00200000•#define START_ADDR_WORKDIR 0x1fe00000•At the end of function, mips_r4k_init, add following lines, add processing of g_mtdFileName_etcSave andg_mtdFileName_workdir.Build QEMU Step 3(continue) if (g_mtdFileName_etcSave[0]){bios_offset= ram_size+ vga_ram_size;bios_size= load_image(g_mtdFileName_etcSave, phys_ram_base+ bios_offset);if ((bios_size> 0) && (bios_size<= BIOS_SIZE))cpu_register_physical_memory(START_ADDR_ETC_SAVE,BIOS_SIZE, bios_offset| IO_MEM_ROM);else/* not fatal */ fprintf(stderr, "qemu: Warning, could not load MIPS bios '%s'\n",buf);}if (g_mtdFileName_workdir[0]){bios_offset= ram_size+ vga_ram_size+ SIZE_ETCSAVE;bios_size= load_image(g_mtdFileName_workdir, phys_ram_base+ bios_offset);if ((bios_size> 0) && (bios_size<= BIOS_SIZE))cpu_register_physical_memory(START_ADDR_WORKDIR,BIOS_SIZE, bios_offset| IO_MEM_ROM);else/* not fatal */fprintf(stderr, "qemu: Warning, could not load MIPS bios '%s'\n",buf);}Attach mips_r4k.c, end of this doc•Open root folder sysemu.h, change 4m to 32m#define MAX_BIOS_SIZE (32 * 1024 * 1024)…#elif defined(TARGET_MIPS)#define BIOS_SIZE (32 * 1024 * 1024) //we want use bios ram to be mtd area #endif•Here is attach file for it. (end of this doc)•Run following command: ./configuremakemake installIII, Build busybox •Find web /downloads/, choose/downloads/busybox-1.6.1.tar.bz2•Uncompress it.•Change make file, like the build kernel,•vi Makefile, search SUBARCH•Change toSUBARCH := mips•Find CROSS_COMPILE, change toCROSS_COMPILE ?= mips-linux-Build busybox Step2•make xconfig•Change settings for it, make sure the mount & fdisk is inside.•make\n•make install\n•cd./_install\n•rm dev -rf\n•cp /opt/source/flashmaster_prxxx_fe-1.0.linux-2.6-2/res/1.0/rootfs.mips_nofpu/dev/ ./dev -rf\n•cd-\n•cp -f --reply=yes /opt/source/flashmaster_prxxx_fe-1.0.linux-2.6-2/res/1.0/rootfs.mips_nofpu/sbin/portmap ./_install/sbin\n•../flashmaster_prxxx_fe-1.0.linux-2.6-2/bin/mkcramfs -Nb_install/ a.mtd\n •cp -f --reply=yes a.mtd../emulator/qemu/mips/\nIV,MTD files, step 1•There are 4 MTD files in real system, now we design each to a file,•A, MTD1, it will be busy-box => -initrd“filename”•B, MTD2, it will be kernel=>-kernel “filename”•C, MTD3, it will be workdir=>-mtdblock“filename”•D, MTD4, it will jffs2 format etc/save=>-pflash“filename”•MTD files Step 2•For 1st, busybox, run following command to create it cd/opt/…/flashmaster_prxxx_fe-1.0.linux-2.6-2/res/1.0 mkdir rootfs.mips_nofpu/dev/netmknod rootfs.mips_nofpu/dev/net /tun c 10 200chmod0666 rootfs.mips_nofpu/dev/net /tun../../bin/mkcramfs -Nb rootfs.mips_nofpu a.mtd•or directly use exist one “mtd1.img”.•For 2nd, use build kernel file “vmlinux”•For 3rd, use workdir•For 4th, run following command../../bin/mkfs.jffs2 -o etcsave.mtd-d ./etc -e 65535 -p ff -bComments of MTD•For 1st, parameter –initrd use it as ram-disk. It will loaded to ram of qemu memory space.•For 2nd, parameter –kernel use same concept of 1st.•For 3rd, it emulate a flash, it start address will be 2M, 0x1fc00000 + 0x00200000, size 30M, 0x01E00000•For 4th, its start address will be 0M0x1fc00000 + 0x0000000, size 2MV, Create script fileto run kernel •Its contentsinitarg="init=/linuxrc root=/dev/hda root2=/dev/hd18" mtdparameter="-mtdblock./boot/workdir.mtd“pflashparameter="-pflash./boot/etcsave.mtd“time \${qemupath}qemu-system-mips\-kernel ./myimages2/vmlinux \-initrd a.mtd\-append "console=ttyS0 $initarg" \-nographic\-m 128 \$pflashparameter\$mtdparameter\-net nic,vlan=1 -net user,vlan=1Comments for the script file•-nographic can be removed. If it is exist, qemu emulator will not show command console, we can use secure-crt’s SSH2 account to do this.•If it is not exist, we must run under x window in linuxAdd function for readphysical memory in QEMU •Add a function in monitor.c, do_phymemory_save •Detail is in attachment monitor.cFor run qemu command•Use graphic, ctrl+alt+2•Run command•Here is help:•help|? [cmd] --show the help•commit device|all--commit changes to the disk images (if -snapshot is used) or backing files •info subcommand --show various information about the system state•q|quit--quit the emulator•eject [-f] device --eject a removable medium (use -f to force it)•change device filename --change a removable medium•screendump filename --save screen into PPM image 'filename'•logfile filename --output logs to 'filename'•log item1[,...] --activate logging of the specified items to '/tmp/qemu.log'•savevm tag|id--save a VM snapshot. If no tag or id are provided, a new snapshot is created •loadvm tag|id--restore a VM snapshot from its tag or id•delvm tag|id--delete a VM snapshot from its tag or id•stop --stop emulation•c|cont--resume emulation•gdbserver[port] --start gdbserver session (default port=1234)•x /fmt addr--virtual memory dump starting at 'addr'•xp/fmt addr--physical memory dump starting at 'addr'•p|print/fmt expr--print expression value (use $reg for CPU register access)•i /fmt addr--I/O port read•sendkey keys --send keys to the VM (e.g. 'sendkey ctrl-alt-f1')•system_reset--reset the system•system_powerdown--send system power down event•sum addr size --compute the checksum of a memory region•usb_add device --add USB device (e.g. 'host:bus.addr' or 'host:vendor_id:product_id')•usb_del device --remove USB device 'bus.addr'•cpu index --set the default CPU•mouse_move dx dy[dz] --send mouse move events•mouse_button state --change mouse button state (1=L, 2=M, 4=R)•mouse_set index --set which mouse device receives events •wavcapture path [frequency bits channels] --capture audio to a wave file (default frequency=44100 bits=16 channels=2)•stopcapture capture index --stop capture•memsave addr size file --save to disk virtual memory dump starting at 'addr' of size 'size'•pmemsave addr size file --save to physical memory memory dump starting at 'addr' of size 'size'VI,Study on mount cd iso,harddiskand share files•1)For mount hda and cdrom correctly, we need open following kernel options:•A, ATA IDE support option.•B, VFS support•C, CDROM ISO9660 file system support•(“make xconfig”to find&open it. Recompile and build kernel again)•2)Go to /dev folder inside root file system prepare folder, run following command:•mknod hdc b 22 0•3)inside run-qemu script file, add•-cdrom./cd.ISO-hda linux.img.•(cd.ISO can be any cdrom iso file, linux.img copy fromhttp://lassauge.free.fr/qemu/release/Qemu-0.9.1-windows.zip. ./share is a folder for share between qemu and host x86 linux system)•4)After all file prepared, in qemu kernel, test this:•mount /dev/hda/tmp3 => hda will be linux.img’s data•mount /dev/hdc/tmp4 => hdc will be cdrom’s dataMount(continued)Now I want to share data with vmware. Here is steps to share data with vmware:1, inside vmware, create a IDE harddisk disk, select persistent and independent. Minimum size is 0.1GB, (100MB). Suppose it use hdd inside vmware, its file name is “vmware-qemu-flat.vmdk”. When generate it, choose a special folder for it. It is for share purpose.2, let the share folder inside a folder /mnt/hgfs. (The other topic, vmware tools.)3, inside vmware, run command: fdisk/dev/hdd. Use “n”command to create a new partition.4, inside vmware, run mkfs/dev/hdd. Then vmdk file is formatted. Copy new vmdk file to qemu’s folder, suppose it is “./share”. Make sure don’t format other partition inside vmware. ☺5, add parameter in run qemu-mips-system script: -hda/mnt/hgfs/share-qemu/vmware-qemu-flat.vmdk. Start the qemu-mips-system. Use this command in vm: mount /dev/hda/tmp3.6, With upper steps, the vmdk file can be share between qemu and vmware. It will be useful to share files.7, Before transfer the vmdk files between vmware and qemu, pls run “sync”. It is for write buffer’s data. “sync”may not enough. Maybe need “poweroff”VII. GDB for debug kernel•Step1, need re-build kernel. Run “make xconfig”, open many options in “kernel hacking”, such as “compile kernel with debug info”etc.After compile, we can find kernel image size change from about 4m to about 20m. This is normal.•Step2,use X window linux, in command script, remove –nographic, add a paramter–S, it is for stop kernel and wait for gdb command.•Step3, after qemu window start, you will see black screen but press Ctrl-Alt-3 to see bash prompt. Press Ctrl-Alt-2, go to qemu command window, press “gdbserver”, at this time, qemu will start to listen port 1234.•Step4, start another linux terminal, run “mips-linux-gdb vmlinux”, in gdb, run command “(gdb)target remote localhost:1234”, you will find gdb can trace kernel now.VIII network1, host preparation in linux •From /progDownload/tunctl-Download-41592.html download tunctl-1.5.tar.gz•Comment 2 lines,•#docbook2man $(PACKAGE).sgml•#install $(MAN) $(DESTDIR)$(MAN_DIR)•make•make install•Find if host linux kernel have “tun.ko”•[root@...~]# find /lib -name "tun.ko"•/lib/modules/2.6.9-22.EL/kernel/drivers/net/tun.konetwork•Goto guest kernel folder, run “make xconfig”•Find “network device support”=> “other ISA cards”=>”ne2000/ne1000 support”, open it.•Re-compile your guest kernel after the change.network•-----------------------------------------"create /usr/local/sbin/tap.sh file (e1000g0 is network card label, this file is at host) -----------------------------------------#!/bin/sh•IF=e1000g0•TAP=tap0•case "$1" in•"start")•sudo tunctl-t $TAP•ifconfig$TAP plumb•brdgadm-a $IF•brdgadm-a $TAP•;;•"stop")•#brdgadm-d $IF•#brdgadm-d $TAP•ifconfig$TAP unplumb•sudo tunctl-d $TAP•;;•esac•exit 0•------------------------------------# /usr/local/sbin/tap.sh start## /usr/local/sbin/tap.sh stop------------------------------------network•After run “tap.sh start”on host of linux, we check if tun.ko is probed: “lsmod | grep tun“,•tun 9153 0•And also we check if tap0 device is power up,•ifconfig –a, we can find a new device tap0 is power on.•We can run following command in host linux:“ifconfig tap0 192.168.200.1“.•Create a file, vi /etc/qemu-ifup#!/bin/shifconfig$1 192.168.200.10Network2, guest•Add following string to qemu-run script:•-net nic,vlan=1,macaddr=00:aa:00:00:01:01 -net tap,vlan=1,ifname=tap0•Startup qemu-system-mips by the added script file.•In guest linux shell, run:•ifconfig eth0 192.168.200.11•ping -c 4 192.168.200.1 to check if network is ok.Network error•I meet this error:•# ping -c 3 192.168.200.10•PING 192.168.200.10 (192.168.200.10): 56 data bytes•NETDEV WATCHDOG: eth0: transmit timed out•NETDEV WATCHDOG: eth0: transmit timed out•---192.168.200.10 ping statistics ---• 4 packets transmitted, 0 packets received, 100% packet loss•After I change this file, arch/mips/kernel/i8259.c , I solve the issue on guest linux2.6.21.•add .disable = disable_8259A_irq,on line 39•[root@localhost linux-2.6.21.7]#diff ./arch/mips/kernel/i8259.c ./arch/mips/kernel/i8259_test.c•39d38•< .disable = disable_8259A_irq•Reference web for the patch:•/mm-commits@/msg24505.html or •/Mailing-Lists/Kernel/2007-07/msg12733.html3, Network prepare inhost Windows XP host system•1, go to /BBS/thread-3209-1-1.html, download tapnic.rar.•After click “addtap.bat”, a new driver for virtual XP network is generated. Please rename it to tap0.•Reference web http://www.h7.dion.ne.jp/~qemu-win/TapWin32-en.html.XP windows hostprepare for network •Force IP address of tap0:Windows XPprepare•Run this command for windows XP:•qemu-system-mips.exe-L . -m 192 -kernel .\myimages2\vmlinux -initrd a.mtd-append "console=ttyS0 init=/linuxrc root=/dev/hda pci=noapicisa=noapic" -M mips-cdrom./cd.ISO-hda./share/vmware-qemu-flat.vmdk-net nic,vlan=1,macaddr=00:aa:00:00:01:01 -net tap,vlan=1,ifname=tap0,vlan=1,ifname=tap0•Guest OS preparation same as upper mentioned hostlinux+guest linux.Rootfs changefor the network•In order to mount nfs server on host linux or windows host, I add nfs support in guest kernel option, but still cannot mount nfs folder.•Later I add follow lines in rc.sysinit and solve the unable mount issue.ifconfig lo 127.0.0.1netmask255.0.0.0 broadcast 127.255.255.255 portmapmount -t ramfs ramfs/tmp-o maxsize=4000More Host Preparationfor Network•1, windows, for NFS work, need install cygwin, make sure NFS module is installed. We need edit “C:\cygwin\etc\hosts”and “C:\cygwin\etc\exports”for NFS setting•2, Linux, make sure NFS work. It is at “start menu”=>”system setting”=> “server setting”=> “nfs setting”Malta board(Mips24k)& Graphics study•MTD_PHYSMAP need to be closed.•Because Malta board has graphics card support, now I start to study malta board.•1) get svn code from internet:•svn co svn:///qemu/trunk•2)don’t change anything on qemu code like before because there is a crash on change code and I find workdir also can be mounted on /dev/hdc. Also don’t need to change guest kernel code, it can be optional.•3)copy malta/.config to guest kernel folder. Build guest kernel with 2 commands: make config, make allMalta (continue)•4, create a script file, my-run-qemu without graphic support(in attachment, /malta/script) and another script file, graphics-qemu with graphic support. •run the graphic script file. For malta board, we don’t need change arch/mips/kernel/i8259.c like the fake qemu board.•Under guest linux, run “mount /dev/hdc/tmp3”to check if workdir is mounted on /tmp3.Some capture imageon malta platform•Graphic display after press “ctrl+alt+1”•After run some command, network mount is working.Futher topic & summerize•There are still 1 important topics Emulate every device inside Mips chip.•That’s all•Because pdf file don’t support *.rar file asas attachment, pls rename the txt to rar.。
Linux2.6内核移植系列教程
Linux2.6内核移植系列教程第一:Linux 2.6内核在S3C2440平台上移植此教程适合2.6.38之前的版本,其中2.6.35之前使用同一yaffs补丁包,2.6.36--2.6.28 yaffs文件系统有所改变,2.6.39之后的暂时不支持,源码下载请到:/1.解压linux-2.6.34.tar.bz2源码包#tar jxvf linux-2.6.34.tar.bz22.修改linux-2.6.34/Makefile文件,在makefile中找到以下两条信息并做修改ARCH ? =armCROSS_COMPILE?=/usr/local/arm/4.3.2/bin/arm-linux-注意:交叉编译器的环境变量也需要改为4.3.2#export PATH=/usr/local/arm/4.3.2/bin/:$PATH其中ARCH变量用来决定:配置、编译时读取Linux源码arch目录下哪个体系结构的文件PATH 用来决定交叉编译器版本3.修改机器类型ID号Linux源码中支持多种平台的配置信息,内核会根据bootloader传进来的mach-types决定那份平台的代码起作用,本人手里的板子是仿照三星公司官方给出的demo板改版而来,所以采用arch/arm/mach-s3c2440/mach-smdk2440.c此配置文件,打开此文件,翻到最后,有以下信息:MACHINE_START(S3C2440, "SMDK2440")/* Maintainer: Ben Dooks <ben@> */.phys_io= S3C2410_PA_UART,.io_pg_offst= (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,.boot_params= S3C2410_SDRAM_PA + 0x100,.init_irq= s3c24xx_init_irq,.map_io= smdk2440_map_io,.init_machine= smdk2440_machine_init,.timer= &s3c24xx_timer,MACHINE_ENDMACHINE_START(S3C2440, "SMDK2440")决定了此板子的mach-types,可以在以下文件中找到S3C2440对应的具体数字,"arch/arm/tools/mach-types"文件查找S3C2440,362,这里刚好与我们的bootloader相同,所以不用做修改,直接保存退出即可,如果不同则根据bootloader的内容修改此文件,或根据此文件修改boorloader的内容(在vivi中可通过param show查看,u-boot在Y:\test\u-boot_src\u-boot_edu-2010.06\board\samsung\unsp2440\unsp2440.c文件:gd->bd->bi_arch_number = MACH_TYPE_S3C2440;中决定)。
第4章 Linux内核裁剪与移植 Linux系统移植(第2版) 教学课件
4.1 Linux内核结构 4.2 内核配置选项 4.3 内核裁剪及编译 4.4 内 核 升 级
4.1.2 内核源码目录介绍
Linux内核代码以源码树的形式存放,如 果在安装系统的时候已经安装了源码树, 其源码树就在/usr/src/linux下。
1.arch目录
禁用随机heap(heap堆是一个应用层的概念,即堆对CPU是不可见的,它 的实现方式有多种,可以由OS实现,也可以由运行库实现,也可以在一个 栈中来实现一个堆)
Choose SLAB allocator Profiling support Kprobes
选择内存分配管理器,建议选择 支持系统评测,建议不选 探测工具,开发人员可以选择,建议不选
5.init目录
init子目录包含核心的初始化代码(注意, 不是系统的引导代码)。它包含两个文件 main.c和version.c,这是研究核心如何工 作的一个非常好的起点。
6.ipc目录
ipc子目录包含核心进程间的通信代码。 Linux下进程间通信机制主要包括管道、 信号、消息队列、共享内存、信号量、套 接口。
Physical 选择XIP后,内核存放的物理地址
Kexec system call
Kexec系统调用
4.2.4 网络协议支持相关选项
菜单选项(Networking Support)的子菜 单中包含一些网络协议支持的选项。
选项名 Networking options Amateur Radio support
arch子目录包括了所有和体系结构相关的 核心代码。它的每一个子目录都代表一种 支持的体系结构,例如arm子目录是关于 ARM平台下各种芯片兼容的代码。
Linux操作系统应用编程课件(完整版)
2.Linux操作系统的发行版
Linux操作系统发行版实际就是Linux内核加上外围实用程序 组成的一个大软件包。相对于Linux操作系统的内核版本,发行版 的版本号随发布者的不同而不同,与Linux操作系统内核的版本号 是相对独立的。因此把SUSE、RedHat、Ubuntu、Slackware等直 接称为Linux是不确切的,它们是Linux操作系统的发行版。更确 切地说,应该将它们称为“以Linux为核心的操作系统软件包”。
Shell是Linux操作系统的一种用户界面,它作为操作系统 的“外壳”,为用户提供使用操作系统的接口。Shell主要有以 下两大功能特点。
(1)Shell是一个命令解释器,它拥有自己内建的Shell命令集。 (2)Shell的另一个重要特性是它自身就是一种解释型的程序设 计语言。
当用户成功登录Linux系统后,系统将执行一个Shell程序。 正是Shell进程提供了命令提示符。作为默认值,Shell对普通用 户用“$”作提示符,对超级用户(root)用“#”作提示符。
1.4.4 联机手册
联机手册命令man可向用户提供系统中各种命令、系统调用、 库函数和重要系统文件的详细说明,包括名字、使用语法、功能 描述、应用实例和相关参考文件等。其格式如下:
$ man [拥有哪个级别的帮助。 -k:查看和命令相关的所有帮助。
查看who命令的详细说明示例如下。 $ man who
Linux操作系统 应用编程
本章主要介绍Linux文件系统,包括文件系统的结构、文 件的定义与分类、目录与文件操作命令、文件的权限管理等, 让读者对Linux文件系统有一定的认识和理解,为后文的学习 打下基础。
2.1.1 组织结构
Linux操作系统中所有文件存储在文件系统中,文件被组织 到一棵“目录树”中,其文件系统层次结构(树状目录结构)如 图2.1所示。树根在该层次结构的顶部,树根的下方衍生出子目 录分支。
Linux环境下flash文件系统JFFS2移植指南
Linux环境下flash文件系统JFFS2移植指南Linux环境下flash文件系统JFFS2移植指南目录1 文件系统 (3)2 Flash存储器 (3)3 Flash文件系统 (4)3.1 flash文件系统基本结构 (4)3.2 日志文件系统 (4)3.3 MTD驱动程序 (5)3.4 JFFS2文件系统 (5)4 JFFS2移植 (5)4.1 MTD配置 (5)4.2 FLASH分区 (7)4.3 jffs2镜像制作 (8)4.4 jffs2镜像烧写 (9)4.4.1 烧录方法1 (9)4.4.2 烧录方法2 (9)4.5 使用jffs2作为根文件系统rootfs (9)1 文件系统文件系统是一个操作系统中最重要的部分之一,它为操作系统提供了一种结构化存储和管理数据的方式。
文件系统的主要功能是对数据的物理存储进行管理,并向用户提供对数据的访问接口。
用户程序建立在文件系统上,通过文件系统访问数据,而不需要直接对物理存储设备进行操作。
最初的操作系统一般都只支持单一的一种文件系统,并且文件系统和操作系统内核紧密关联在一起,而Linux操作系统的文件系统结构是树状的,在根目录“/’下有许多子目录,每个目录都可以采用各自不同的文件系统类型。
Linux中的文件不仅指的是普通的文件和目录,而且将设备也当作一种特殊的文件,因此,每种不同的设备,从逻辑上都可以看成是一种不同的文件系统。
在Linux操作系统中,为了支持多种不同的文件系统,采用了虚拟文件系统(VFS,Visual Filesystem Switch)技术,虚拟文件系统是对多种实际文件系统的共有功能的抽象,它屏蔽了各种不同文件系统在实现细节上的差异,为用户程序提供了统一的、抽象的、标准的接口对文件系统进行访问,如open(),read(),write()等。
这样,用户程序就不需要关心所操作的具体文件是属于哪种文件系统,以及这种文件系统是如何设计与实现的,对所有文件的访问方式都是完全相同的。
LINUX-2.6内核移植过程中常见问题及解决方法
LINUX-2.6内核移植过程中常见问题及解决方法1、内核启动后,出现如下提示后停住UNCOMPRESSING LINUX........................................................... DONE, BOOTING THE KERNEL一般情况下,这个时候内核已经启动了,只不过在控制台CONSOLE中没有打印信息而已。
所以问题主要锁定在串口这一块。
首先确定你的板子包括硬件都是没有问题的。
可以分以下几种情况,最常见的原因是在内核启动命令行这块CMDLINE,一般情况下LINUX-2.4内核中,CONSOLE=TTYS0,而LINUX-2.6内核则用CONSOLE=TTYSAC0。
还有一个原因,不多见,我当时用的是S3C2410的板子,BOOTLOADER用的是U-BOOT-1.0.0,内核移植的是LINUX-2.6.16,结果出现这个问题,在网上查了很多资料,最后找出来问题。
U-BOOT把S3C2410的时钟设置为202MHZ,而内核启动时使用的是200MHZ,修改U-BOOT中的MPLLCON:CLK_POWER->MPLLCON MPLLCON = 0X0005C040;//MPLL=200MHZ2、内核编译成功后,启动后出现如下提示后就停住了。
FREEING INIT MEMORY: 72KWARNING: UNABLE TO OPEN AN INITIAL CONSOLE.这个也是控制台CONSOLE的问题,LINUX-2.6.13以后的内核都支持DEVFS,而之后版本的内核就把DEVFS这块去掉了,虽然还能在内核源码中找到对应的源码,你也可以把它加进内核,但是也不是太好用。
2.6.13 后的版本改为支持UDEV了,UDEV这块我也没太弄懂,正在研究。
因此如果你是LINUX-2.6.13版本一下的内核,编译的时候在PSEUDO FILESYSTEMS添加DEV FILESYSTEM SURPPORT选项,也就是添加DEVFS的支持,如果LINUX-2.6.13之后的版本,你就看看你的ROOTFS下有没有/DEV/CONSOLE这个文件,没有的话,自己做一个就可以#MKNOD CONSOLE C 5 13、内核启动后,打印出一大堆提示信息UNABLE TO HANDLE KERNEL XXXX POINTER DEREFERENCE AT VIRTUAL ADDRESS XXXXXX ……R10: 00000000 R9 : 00000000 R8 : 00500001R7 : 00000001 R6 : C011AB50 R5 : C3726C00 R4 : C013E024R3 : 00000000 R2 : 00000000 R1 : 00000000 R0 : C3726C00….<0>KERNEL PANIC - NOT SYNCING: ATTEMPTED TO KILL INIT!这个提示是内核启动加载驱动时出错,那就只有找到出错的驱动,不加载它,如果必须要用这个驱动,只有自己修改源代码,一般问题都在对硬件的地址操作有问题。
麒麟操作系统内核同其他操作系统内核的相似性分析
麒麟操作系统内核同其他操作系统内核的相似性分析Copyright (c) 2006 Dancefire (dancefire#gmail).Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".作者:Dancefire (dancefire # gmail dot com ) 2006/04/27( PDF格式及分析所用脚本程序下载连接:/file/kernel_similarity_analysis_1.0.zip )原始链接:/DanceFire/archive/2006/04/27/679782.aspx/article/Kernel_Similarity_Analysis.html一、引言麒麟操作系统是由国防科技大学、中软公司、联想公司、浪潮公司和民族恒星公司五家单位合作研制的服务器操作系统。
按照麒麟官方的说法:“Kylin服务器操作系统是国家863计划的重大研究成果,拥有完全自主版权的内核,与Linux 在应用上二进制兼容,并支持64位,是中国独立研发成功的、具有完全自主知识产权的服务器操作系统。
”[1]--- 来自麒麟官方网站/news.htm和863计划官方网站[2]/863_105/indust/indust_news/200409160008.html“银河麒麟操作系统是针对未来的主流网络服务和高性能计算服务的需求,参照国际主流标准,参考Darwin、FreeBSD、Linux和其它商用操作系统,借鉴UNIX操作系统和微内核操作系统的设计思想,设计并实现具有自主版权的、可支持多种CPU芯片和多种计算机体系结构的、具有高性能、高可用性与高安全性的、并与Linux应用和设备驱动二进制兼容的中文服务器操作系统,”摘自麒麟操作系统2.0.21内自带的帮助文档近日,有不少人对麒麟操作系统宣称的“完全自主版权”和“中国独立研发成功”这两个核心问题产生了质疑。
嵌入式题库
1、下面( B )特性不符合嵌入式操作系统特点。
A、实时性B、不可定制C、微型化D、易移植2. ARM嵌入式系统中,PC指向的是正在(C )的指令地址。
A 执行B 译码C 取指D 都不是3. ARM系统处理16-bit数据时,对应的数据类型是( B )。
A ByteB HalfwordC WordD 三者都不是4、32位数0x12345678用小端格式表示,则在AXD调试器下观察数据在内存中分布的情况是(B)A 12 34 56 78B 78 56 34 12C 21 43 65 87D 87 65 43 215、以下ARM异常中,优先级最高的是(D )。
A Data abortB FIQC IRQD Reset6、哈佛结构和冯诺依曼结构的区别是( A)A 指令和数据分开存储B 不需要程序计数器C 统一编址D 单一数据总线7.二极管具有单向导通性。
该说法( A )A.正确B.错误8. DSP是专门用于数字信号处理方面的处理器。
该说法( A )A.正确B.错误9. Nand Flash的特点是应用程序可以直接在闪存中运行,不需要把代码读到系统RAM中。
该说法( B )A.正确B.错误10、同CISC相比,下面哪一项不属于RISC处理器的特征_ DA、采用固定长度的指令格式,指令规整、简单、基本寻址方式有2~3种。
B、减少指令数和寻址方式,使控制部件简化,加快执行速度。
C、数据处理指令只对寄存器进行操作,只有加载/存储指令可以访问存储器,以提高指令的执行效率,同时简化处理器的设计。
D、RISC处理器都采用哈佛结构11. ARM920T字必须是( B )字节边界对准。
A.2B.412. S3C2410时钟和功率管理模块由( ABC )组成。
A。
时钟控制B.USB控制C.功率控制。
13.根时钟源选择有关的引脚包括( CD )。
A.OM1B.OM2C.OM3D.OM414.根引导方式选择有关的引脚包括( AB )。
Linux系统及编程基础习题答案
Linux系统及编程基础习题答案第1章Linux基础及安装1. 什么是Linux?Linux是一款优秀的计算机操作系统,支持多用户、多进程、多线程,实时性好,功能强大且稳定。
同时,它又具有良好的兼容性和可移植性,被广泛应用于各种计算机平台上。
作为Internet的产物,Linux 操作系统由全世界的许多计算机爱好者共同合作开发,是一个自由的操作系统。
2. Linux的主要特点是什么?Linux具有UNIX的所有特性并且具有自己独特的魅力,主要表现在以下几个方面:(1)开放性(2)多用户(3)多任务(4)出色的稳定性能(5)良好的用户界面:Linux向用户提供了两种界面:用户界面和系统调用界面。
(6)设备独立性:设备独立性是指操作系统把所有外部设备统一当作文件来看,只要安装它们的驱动程序,任何用户都可以像使用文件那样操作并使用这些设备,而不必知道它们的具体存在形式。
(7)丰富的网络功能:完善的内置网络是Linux的一大特点,Linux在通信和网络功能方面优于其他操作系统。
其他操作系统不包含如此紧密的内核结合在一起的联接网络的能力,也没有内置这些联网特性的灵活性。
而Linux为用户提供了完善的、强大的网络功能。
(8)可靠的安全性(9)良好的可移植性:可移植性是指将操作系统从一个平台转移到另一个平台,使它仍然能按其自身的方式运行的能力。
3. Linux的主要组成包括什么?(1)Linux内核(Kernel):内核(Kernel)是系统的心脏,是运行程序和管理硬件设备的内核程序,决定着系统的性能和稳定性,实现操作系统的基本功能。
(2)Linux的Shell:Shell是系统的用户界面,提供用户与内核进行交互操作的一种接口。
Shell是一个命令解释器,它解释由用户输入的命令并且把他们送到内核执行。
Shell编程语言具有普通编程语言的很多特点,用这种编程语言编写shell程序与其他应用程序具有同样的效果。
(3)Linux 文件系统:文件系统是文件存放在磁盘等存储设备上的组织方法。
Linux系统入门教程
book 1991 年 9 月中旬,Linux 内核版本 0.01 问世了,由于它使用了 386 的任务切换特性,所以该操 w 作系统没有可移植性,并且只能使用 AT 硬盘,基本上不支持任何其他硬件。1991 年的 10 月 5 日, w t Torvalds 在 comp.os.minix 新闻组上发布消息,正式向外宣布 Linux 内核系统(free Minix-like kernel ne sources for 386-AT,内核版本 0.02)的诞生。这段消息可以称为 Linux 的诞生宣言,并且一直广为 et k. 流传。源代码被放置到一个 FTP 服务器供人们自由下载,立即引起了计算机迷们的注意,源代码被 n o 下载、测试、修改,并且结果最终被反馈给 Torvalds。 k. bo 在 0.02 版本发布的几周后,Linux 0.03 版本发布了;12 月份,又发布 0.10 版本3......然而 Linux o cn 并非仅由 Torvalds 一人独自开发,是由全世界不同地方的优秀程序员通过互联网共同开发的。加入 w. 开发的人由 comp.os.minix 新闻组上的计算机迷们增加到一百, 然后是数千,然后是数十万,这群 w 素未谋面的程序员们通过计算机网络使得 Linux 拥有世界上最大的开发群体和测试队伍。
et 1991 年,芬兰赫尔辛基大学的一位名叫李纳斯 托沃兹(Linus Torvalds)的学生为了解决 Minix .n 的接口及相关硬件设备的驱动程序的更新、添加新的协议等等问题,决定为使用 Minix 的用户写一 ook c 个可用于 386、486 或奔腾处理器的个人计算机上的类 UNIX 操作系统。和当时的许多其他学生一样, b . Torvalds 编写内核的另外一个动机是为了节省购买昂贵的 UNIX 计算机和软件的费用,同时也把它 cn ww 作为自己的校园实践,就这样 Torvalds 开始了 Linux 雏形的设计。 www. w 2 类 UNIX 是英文单词“UNIX-Like”的翻译,一个类 UNIX 操作系统是指其特性和运行方式和 UNIX 相似的操作系统,比如 BSD、FreeBSD、 t HP-UX、Minix、Linux、Mac OS X、Solaris 等等,但是类 UNIX 并不一定要遵守某一个 UNIX 版本的规范。
嵌入式Linux内核模块的配置与编译
嵌入式Linux内核模块的配置与编译一、简介随着 Linux操作系统在嵌入式领域的快速发展,越来越多的人开始投身到这方面的开发中来。
但是,面对庞大的Linux内核源代码,开发者如何开始自己的开发工作,在完成自己的代码后,该如何编译测试,以及如何将自己的代码编译进内核中,所有的这些问题都直接和Linux的驱动的编译以及Linux的内核配置系统相关。
内核模块是一些在操作系统内核需要时载入和执行的代码,它们扩展了操作系统内核的功能却不需要重新启动系统,在不需要时可以被操作系统卸载,又节约了系统的资源占用。
设备驱动程序模块就是一种内核模块,它们可以用来让操作系统正确识别和使用使用安装在系统上的硬件设备。
Linux内核是由分布在全球的Linux爱好者共同开发的,为了方便开发者修改内核,Linux的内核采用了模块化的内核配置系统,从而保证内核扩展的简单与方便。
本文通过一个简单的示例,首先介绍了如何在Linux下编译出一个内核模块,然后介绍了Linux内核中的配置系统,讲述了如何将一个自定义的模块作为系统源码的一部分编译出新的操作系统,注意,在这里我们介绍的内容均在内核2.6.13.2(也是笔者的开发平台的版本)上编译运行通过,在2.6.*的版本上基本上是可以通用的。
二、单独编译内核模块首先,我们先来写一个最简单的内核模块:#include <linux/module.h>#include <linux/kernel.h>#include <linux/errno.h>#define DRIVER_VERSION "v1.0"#define DRIVER_AUTHOR "RF"#define DRIVER_DESC "just for test"MODULE_AUTHOR(DRIVER_AUTHOR);MODULE_DESCRIPTION(DRIVER_DESC);MODULE_LICENSE("GPL");staticintrfmodule_init(void){printk("hello,world:modele_init");return 0;}static void rfmodule_exit(void){printk("hello,world:modele_exit");}module_init (rfmodule_init);module_exit (rfmodule_exit);这个内核模块除了在载入和卸载的时候打印2条信息之外,没有任何其他功能,不过,对于我们这个编译的例子来讲,已经足够了。
嵌入式系统设计与应用[共5篇]
嵌入式系统设计与应用[共5篇]第一篇:嵌入式系统设计与应用第一章:嵌入式系统定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能,可靠性,成本,体积,功耗严格要求的专用计算机系统。
(一切非PC计算机系统)嵌入式系统特点:“专用”计算机系统,运行环境差异很大,比通用PC系统资源少,功耗低,体积小,集成度高,成本低,具有完整的系统测试和可靠性评估体系,具有较长的生命周期,需要专用开发工具和方法进行设计,包含专用调试电路,多学科知识集成系统。
嵌入式系统应用范围:汽车,工业控制,通信设备,消费电子,商业终端,航空航天,军事需求。
嵌入式系统的基本开发流程:系统定义与需求分析阶段,方案设计阶段,详细设计阶段,软、硬件集成测试阶段,系统功能性测试及可靠性测试阶段。
系统定义与需求分析阶段:对系统需求进行分析,制定系统的设计依据。
方案设计阶段:确定系统初步设计方案并形成设计描述文档。
详细设计阶段:完善初步方案,对方案实施详细设计。
软硬件集成测试阶段:对系统软硬件进行综合测试,验证系统设计功能。
系统功能性能测试及可靠性测试测试:对系统功能,性能,可靠性进行综合测评。
对于使用操作系统的嵌入式系统来说,嵌入式系统软件结构一般包含4个层面:板级支持包层,实时操作系统(RTOS)层,应用程序接口(API)层,应用程序层。
有些资料将应用程序接口API归属于OS层,按3层划分的应用程序控制系统的运作和行为;操作系统与硬件无关,不同的嵌入式操作系统其组成结构也不尽相同嵌入式操作系统种类繁多,大体分为两种:商用型和免费型商用型:VxWorks,Windows CE,pSoS,Palm OS,OS-9,LynxOS,QNX和LYNX 免费型:Linux和uC/OS—II uC/OS—II具有执行效率高,占用空间小,可移植性及扩展性强,实施性能优良,稳定性和可靠性良好等特点。
其内核采用微内核结构,将基本功能(如进程管理,存储管理,中断处理)放在内核中,留给用户一个标准API 函数,并根据各个任务的优先级分配CPU时间。
《Linux设备节点创建》内核kobject上报uevent过滤规则
《Linux设备节点创建》内核kobject上报uevent过滤规则/tankai19880619/article/details/11776589说明:本文基于Android2.3和Linux2.6,其余版本仅供参考。
Android2.3及Linux2.6.29内核模拟器版本编译与调试阅读本文前请阅读:Linux总线、设备、驱动与设备节点创建、用户测试程序一、netlink监听程序testnet.c[cpp]view plain copy1.#include <stdio.h>2.#include <stdlib.h>3.#include <string.h>4.#include <errno.h>5.#include <sys/types.h>6.#include <asm/types.h>7.//该头文件需要放在netlink.h前面防止编译出现__kernel_sa_family未定义8.#include <sys/socket.h>9.#include <linux/netlink.h>10.11.void MonitorNetlinkUevent()12.{13.int sockfd;14.struct sockaddr_nl sa;15.int len;16.char buf[4096];17.struct iovec iov;18.struct msghdr msg;19.int i;20.21. memset(&sa,0,sizeof(sa));22. sa.nl_family=AF_NETLINK;23. sa.nl_groups=NETLINK_KOBJECT_UEVENT;24. sa.nl_pid = 0;//getpid(); both is ok25. memset(&msg,0,sizeof(msg));26. iov.iov_base=(void *)buf;27. iov.iov_len=sizeof(buf);28. msg.msg_name=(void *)&sa;29. msg.msg_namelen=sizeof(sa);30. msg.msg_iov=&iov;31. msg.msg_iovlen=1;32.33. sockfd=socket(AF_NETLINK,SOCK_RAW,NETLINK_KOBJECT_UEVENT);34.if(sockfd==-1)35. printf("socket creating failed:%s\n",strerror(errno));36.if(bind(sockfd,(struct sockaddr *)&sa,sizeof(sa))==-1)37. printf("bind error:%s\n",strerror(errno));38.while(1){39. memset(buf,0,sizeof(buf));40. len=recvmsg(sockfd,&msg,0);41.if(len<0){}42.//printf("receive error\n");43.else if(len<32||len>sizeof(buf))44. printf("invalid message");45.for(i=0;i<len;i++)46.if(*(buf+i)=='\0')47. buf[i]='\n';48. printf("received %d bytes\n%s\n",len,buf);49. }50.}51.52.int main(int argc,char **argv)53.{54. MonitorNetlinkUevent();55.return 0;56.}Android.mk[plain]view plain copy1.LOCAL_PATH:= $(call my-dir)2.include $(CLEAR_VARS)3.4.LOCAL_SRC_FILES:= \5. testnet.c6.7.LOCAL_SHARED_LIBRARIES := \8. libutils9.10.LOCAL_MODULE:= testnet11.12.LOCAL_MODULE_TAGS := optional13.14.include $(BUILD_EXECUTABLE)二、如下是添加打印后的信息(Android用户空间udev为ueventd,属于init的一个软连接)1.总线驱动root@android:/data/tank # insmod testbus.ko[plain]view plain copy1.//内核模块加载成功,会上报netlink------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env3.kobject: 'testbus' (bf02d1c8): kobject_uevent_env------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env>>>>netlink_broadcast5.//总线注册上报netlink---testlddbus.c----->>>>ldd_bus_init--------->>>>>>bus.c>>>>>>bus_register,,,bus->name is ldd-------_>>>>kobject.c>>>>>>>kset_register-------_>>>>kobject.c>>>>>>>kset_register>>>kobject_uevent------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env11.kobject: 'ldd' (cfcdb1c8): kobject_uevent_env------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env>>>>netlink_broadcast13.//设备注册由于没有分配主设备号,不上报netlink-------_>>>>>>>>core.c>>>>>device_register-------_>>>>>>>>core.c>>>>>device_add-------_>>>>>>>>core.c>>>>>device_add>>>>>kobject_uevent------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env-------_>>>>>>drivers/base/core.c>>dev_uevent_filter>>ktype is 0xc032137c,&device_ktype is 0xc032137c-------->>>>drivers/base/core.c>>dev_uevent_filter>>dev->uevent_suppress is 0-------->>>>drivers/base/core.c>>dev_uevent_filter>>dev->bus is 0x0-------->>>>drivers/base/core.c>>dev_uevent_filter>>dev->class is 0x022.kobject: 'ldd0' (bf02d074): kobject_uevent_env23.kobject: 'ldd0' (bf02d074): kobject_uevent_env: filter function caused the event to drop!24.//用户空间ueventd的处理,2个uevent事件25.init: TK-------_>>>>>uevent.c>>>>>>ueventd_main>>>>ufd.fd is 426.init: TK-------_>>>>>>device.c.>>>>>>handle_device_fd27.init: TK------------>>>>device.c>>>>>>handle_device_event>>>>uevent->major is -1,uevent->minor is -128.init: TK------------>>>>device.c>>>>>>handle_device_event>>>>>>uevent->majorand minor < 029.init: TK------------>>>>device.c>>>>>>handle_device_event>>>>uevent->major is -1,uevent->minor is -130.init: TK------------>>>>device.c>>>>>>handle_device_event>>>>>>uevent->majorand minor < 031.received 83 bytes32.add@/module/testbus33.ACTION=add34.DEVPATH=/module/testbus35.SUBSYSTEM=module36.SEQNUM=64937.38.received 66 bytes39.add@/bus/ldd40.ACTION=add41.DEVPATH=/bus/ldd42.SUBSYSTEM=bus43.SEQNUM=650说明:drivers/base/bus.c[plain]view plain copy1.int bus_register(struct bus_type *bus){2. retval = kset_register(&priv->subsys);3. /*4. lib/kobject.c5. int kset_register(struct kset *k){6. kobject_uevent(&k->kobj, KOBJ_ADD);7. }8. */9. retval = bus_create_file(bus, &bus_attr_uevent);10. priv->devices_kset = kset_create_and_add("devices", NULL, &priv->subsys.kobj);11. priv->drivers_kset = kset_create_and_add("drivers", NULL, &priv->subsys.kobj);12.}2.插入设备root@android:/data/tank # insmod testdev.ko[plain]view plain copy1.//内核模块加载会上报netlink------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env3.kobject: 'testdev' (bf0334e0): kobject_uevent_env------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env>>>>netlink_broadcast5.//没有主设备号,不会上报netlink---testdev.c----->>>>mini_init-------_>>>>>>>>core.c>>>>>device_register-------_>>>>>>>>core.c>>>>>device_add-------_>>>>>>>>core.c>>>>>device_add>>>>>kobject_uevent------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env11.kobject: 'mini' (bf0333dc): kobject_uevent_env-------_>>>>>>drivers/base/core.c>>dev_uevent_filter>>ktype is 0xc032137c,&device_ktype is 0xc032137c-------->>>>drivers/base/core.c>>dev_uevent_filter>>dev->uevent_suppress is 0-------->>>>drivers/base/core.c>>dev_uevent_filter>>dev->bus is 0xbf001130---testlddbus.c----->>>>ldd_uevent-------_>>>>>>drivers/base/core.c>>dev_uevent>>retval is -1217.kobject: 'mini' (bf0333dc): kobject_uevent_env: uevent() returned -1218.//用户空间ueventd的处理,1个uevent事件19.init: TK-------_>>>>>uevent.c>>>>>>ueventd_main>>>>ufd.fd is 420.init: TK-------_>>>>>>device.c.>>>>>>handle_device_fd21.init: TK------------>>>>device.c>>>>>>handle_device_event>>>>uevent->major is -1,uevent->minor is -122.init: TK------------>>>>device.c>>>>>>handle_device_event>>>>>>uevent->majorand minor < 023.received 83 bytes24.add@/module/testdev25.ACTION=add26.DEVPATH=/module/testdev27.SUBSYSTEM=module28.SEQNUM=6513.设备驱动root@android:/data/tank # insmod testdriver.ko[plain]view plain copy1.//内核模块成功加载,会上报netlink------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env3.kobject: 'testdriver' (bf039c34): kobject_uevent_env------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env>>>>netlink_broadcast5.//类注册会上报netlink(class_creat)---testdriver.c----->>>>driver_init--------->>>>>driver.c>>>>>>driver_register---------_>>>>>bus.c>>>>>>>bus_add_driver---testbus.c----->>>>ldd_match---testbus.c----->>>>ldd_match---testlddbus.c----->>>>ldd_drv_probe----testdriver.c------>>>>driver_probe mini-------_>>>>kobject.c>>>>>>>kset_register-------_>>>>kobject.c>>>>>>>kset_register>>>kobject_uevent------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env16.kobject: 'mymodule' (cfee5b68): kobject_uevent_env------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env>>>>netlink_broadcast18.//有主设备号时设备注册上报netlink-------->>>>>core.c>>>>device_create-------_>>>>>>>>core.c>>>>>device_register-------_>>>>>>>>core.c>>>>>device_add-------_>>>>>>>>core.c>>>>>device_add>>>>>kobject_uevent------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env24.kobject: 'mymod0' (caa4e724): kobject_uevent_env-------_>>>>>>drivers/base/core.c>>dev_uevent_filter>>ktype is 0xc032137c,&device_ktype is 0xc032137c-------->>>>drivers/base/core.c>>dev_uevent_filter>>dev->uevent_suppress is 0-------->>>>drivers/base/core.c>>dev_uevent_filter>>dev->bus is 0x0-------->>>>drivers/base/core.c>>dev_uevent_filter>>dev->class is 0xcaade760-------_>>>>>>drivers/base/core.c>>dev_uevent>>retval is 0------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env>>>>netlink_broadcast31.//驱动注册都会上报netlink---------_>>>>>bus.c>>>>>>>bus_add_driver>>>>kobject_uevent------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env34.kobject: 'mini' (c8aa48c0): kobject_uevent_env------->>>>>>kobject_uevent.c>>>>>kobject_uevent_env>>>>netlink_broadcast36.//用户空间ueventd的处理,4个uevent事件37.init: TK-------_>>>>>uevent.c>>>>>>ueventd_main>>>>ufd.fd is 438.init: TK-------_>>>>>>device.c.>>>>>>handle_device_fd39.init: TK------------>>>>device.c>>>>>>handle_device_event>>>>uevent->major is -1,uevent->minor is -140.init: TK------------>>>>device.c>>>>>>handle_device_event>>>>>>uevent->majorand minor < 041.init: TK------------>>>>device.c>>>>>>handle_device_event>>>>uevent->major is -1,uevent->minor is -142.init: TK------------>>>>device.c>>>>>>handle_device_event>>>>>>uevent->majorand minor < 043.init: TK------------>>>>device.c>>>>>>handle_device_event>>>>uevent->major is 248,uevent->minor is 044.init: TK------_>>>>>>>>>make_devices45.init: TK------------>>>>device.c>>>>>>handle_device_event>>>>uevent->major is -1,uevent->minor is -146.init: TK------------>>>>device.c>>>>>>handle_device_event>>>>>>uevent->majorand minor < 047.received 89 bytes48.add@/module/testdriver49.ACTION=add50.DEVPATH=/module/testdriver51.SUBSYSTEM=module52.SEQNUM=65253.54.received 82 bytes55.add@/class/mymodule56.ACTION=add57.DEVPATH=/class/mymodule58.SUBSYSTEM=class59.SEQNUM=65360.61.received 137 bytes62.add@/devices/virtual/mymodule/mymod063.ACTION=add64.DEVPATH=/devices/virtual/mymodule/mymod065.SUBSYSTEM=mymodule66.MAJOR=24867.MINOR=068.SEQNUM=65469.70.received 96 bytes71.add@/bus/ldd/drivers/mini72.ACTION=add73.DEVPATH=/bus/ldd/drivers/mini74.SUBSYSTEM=drivers75.SEQNUM=655说明:drivers/base/driver.c[cpp]view plain copy1.int driver_register(struct device_driver *drv){2. ret = bus_add_driver(drv);3./*4. drivers/base/bus.c5. int bus_add_driver(struct device_driver *drv){6. kobject_uevent(&priv->kobj, KOBJ_ADD);7. }8. */9.}include/linux/device.h[cpp]view plain copy1.#define class_create(owner, name) \2.({ \3.static struct lock_class_key __key; \4. __class_create(owner, name, &__key); \5./*6. drivers/base/class.c7. retval = __class_register(cls, key);8. int __class_register(struct class *cls, struct lock_class_key *key){9. error = kset_register(&cp->subsys);10. }11. lib/kobject.c12. int kset_register(struct kset *k){13. kobject_uevent(&k->kobj, KOBJ_ADD);14. }15. */16.})drivers/base/core.c[cpp]view plain copy1.struct device *device_create(struct class *class, struct device *parent,2. dev_t devt, void *drvdata, const char *fmt, ...){3. dev = device_create_vargs(class, parent, devt, drvdata, fmt, vargs);4./*5. struct device *device_create_vargs(struct class *class, struct device *parent,6. dev_t devt, void *drvdata, const char *fmt,7. va_list args){8. retval = device_register(dev);9. }10. int device_register(struct device *dev){11. return device_add(dev);12. }13. int device_add(struct device *dev){14. error = kobject_add(&dev->kobj, dev->kobj.parent, "%s", dev_name(dev));15. if (MAJOR(dev->devt)) { //有设备号才会上报uevent事件!!16. error = device_create_file(dev, &devt_attr);17. if (error) goto ueventattrError;18. error = device_create_sys_dev_entry(dev);19. if (error) goto devtattrError;20. }21. kobject_uevent(&dev->kobj, KOBJ_ADD);22. }23. */24.}总结:bus_register,driver_register,class_create,device_create以及内核模块加载有uevent 通过netlink上报,device_register的uevent会根据是否有设备号来决定是否上报事件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
内核操作Linux2.6内核驱动移植参考
随着Linux2.6的发布,由于2.6内核做了教的改动,各个设备的驱动程序在不同程度上要进行改写。
为了方便各位Linux爱好者我把自己整理的这分文档share出来。
该文当列举了2.6内核同以前版本的绝大多数变化,可惜的是由于时间和精力有限没有详细列出各个函数的用法。
特别声明:该文档中的内容来自,该网也上也有各个函数的较为详细的说明可供各位参考。
1、使用新的入口
必须包含<linux/init.h>
module_init(your_init_func);
module_exit(your_exit_func);
老版本:int init_module(void);
void cleanup_module(voi);
2.4中两种都可以用,对如后面的入口函数不必要显示包含任何头文件。
2、GPL
MODULE_LICENSE("Dual BSD/GPL");
老版本:MODULE_LICENSE("GPL");
3、模块参数
必须显式包含<linux/moduleparam.h>
module_param(name, type, perm);
module_param_named(name, value, type, perm);
参数定义
module_param_string(name, string, len, perm);
module_param_array(name, type, num, perm);
老版本:MODULE_PARM(variable,type);
MODULE_PARM_DESC(variable,type);
4、模块别名
MODULE_ALIAS("alias-name");
这是新增的,在老版本中需在/etc/modules.conf配置,现在在代码中就可以实现。
5、模块计数
int try_module_get(&module);
module_put();
老版本:MOD_INC_USE_COUNT 和MOD_DEC_USE_COUNT
6、符号导出
只有显示的导出符号才能被其他模块使用,默认不导出所有的符号,不必使用EXPORT_NO_SYMBOLS
老板本:默认导出所有的符号,除非使用EXPORT_NO_SYMBOLS
7、内核版本检查
需要在多个文件中包含<linux/module.h>时,不必定义__NO_VERSION__
老版本:在多个文件中包含<linux/module.h>时,除在主文件外的其他文件中必须定义__NO_VERSION__,防止版本重复定义。
8、设备号
kdev_t被废除不可用,新的dev_t拓展到了32位,12位主设备号,20位次设备号。
unsigned int iminor(struct inode *inode);
unsigned int imajor(struct inode *inode);
老版本:8位主设备号,8位次设备号
int MAJOR(kdev_t dev);
int MINOR(kdev_t dev);
9、内存分配头文件变更
所有的内存分配函数包含在头文件<linux/slab.h>,而原来的<linux/malloc.h>不存在老版本:内存分配函数包含在头文件<linux/malloc.h>
10、结构体的初试化
gcc开始采用ANSI C的struct结构体的初始化形式:
static struct some_structure = {
.field1 = value,
.field2 = value,
..
};
老版本:非标准的初试化形式
static struct some_structure = {
field1: value,
field2: value,
..
};。