总结的知识点有:1、VMWare里Linux使用MINICOM实现与开发板的通讯;2、PC机中Linux系统与目标开发板的NFS文件系统的挂接;3、修改文件的使用权限;4、在Linux系统下设置NFS共享;5、tar压缩、解压用法(platinum);6、NFS网络文件系统的设置;7、修改外壳脚本的权限;8、内核的编译和移植(以PXA270为例);9、编写Red hat内核驱动程序前需要注意的;10、调试过程中利用printk跟踪;11、编写Makefile文件需要注意的;12、设备文件和设备文件系统;13、Linux驱动程序的编写细节点;14、嵌入式根文件系统;15、查看/dev目录下的设备的主次设备号的命令 1、VMWare里Linux使用MINICOM实现与开发板的通讯 一、VMWARE虚拟机添加串口(如果没用虚拟机可以跳过这步) 二 设置MINICOM 提醒一下:LINUX设备的编号是从0开始的 比如串口1也就是COM1在LINUX里的设备号叫ttyS0 在这次的连接开发板的实验过程中,主要的问题有: 1、在试用VMware虚拟机的时候没有给虚拟机添加上串口,所以在Linux虚拟机下的minicom是无法识别到连接到主机的串口上的。解决方法如上所示,在VMware中添加了串口,才可以通过虚拟机访问到串口设备。 2、在启动的时候没有关闭掉windows中的“超级终端”,所以在启动了虚拟机以后显示“com1”不能正常工作,发现该问题后,关闭了Windows中的“超级终端”,然后重启了虚拟机。呵呵,从此Linux虚拟机下终于可以顺利的进行串口的连接了。 最后退出设置菜单就可以使用minicom与开发板通讯了。 2、PC机中Linux系统与目标开发板的NFS文件系统的挂接 设置好相对应的IP地址后,一般我设的Linux系统的IP地址是192.168.0.14,网关是192.168.0.255,子网掩码是255.255.255.0 目标开发板的IP地址操作是: mount eth0 192.168.0.5 broadcast 192.168.0.255 netmask 255.255.255.0 建立好对接后先ping下各自的IP地址看是否都连通了。 用指令mount -t nfs 192.168.0.14:/home /tmp/nfs进行挂接 3、修改文件的使用权限 chmod 777 文件名 4、在Linux系统下设置NFS共享 二、嵌入式目标系统NFS 客户端的配置 #!/bin/sh 总结: 5、tar压缩、解压用法(platinum) 解压实例 压缩实例 6、NFS网络文件系统的设置 NFS本身不提供信息传输的协议和功能,但它的确能够透过网络实现信息的分享,它是Linux系统中广泛使用的文件系统,可以方便地实现异构网络系统的文件共享、数据交换,以及其他分布式的应用。 Linux会默认安装NFS文件系统,查看NFS是否安装,可以执行以下命令: rpm -qa |grep nfs 启动NFS服务器主要分为以下两步: portmap start /etc/rc.d/init.d/nfs start NFS服务器的共享配置保存在/etc/exports文件中,如果用户修改了这个文件,可以运行以下的命令行,以便马上生效。 /etc/rc.d/init.d/nfs restart 挂接可以使用mount进行,挂接前必须创建好要挂接到的目标目录 例如:mount -t nfs 192.168.8.188:/install /home/install 另外如果用户希望开机时自动挂接,也可以用以下方法编辑/etc/fstab文件,在/etc/fstab文件中追加一行:(以IP为192.168.8.188为例) 192.168.8.188:/install /home/install nfs defaults,auto 0 0 192.168.8.188:/Downloads /home Downloads nfs ro 0 0 /etc/fstab文件格式如下: fs_spec fs_file fs_type fs_options fs_dump fs_pass fs_spec-该字段定义要加载的文件系统所在的设备或远程文件系统,对于NFS文件系统一般配置为:192.168.8.188:/install的格式 fs_file-本地的挂载目标路径 fs_type-对于NFS来说文件系统为nfs fs_options-挂载的参数,这个参数可以参考mount命令行 fs_dump-该选项可以设置为0 fs_pass-该选项可以设置为0 7、修改外壳脚本的权限 chmod ug+x filename 只有自己以及同一工作组的人可以执行,其他人不能执行 chmod +x filename 或者 chmod 777 filename 所有人都可以执行 8、内核的编译和移植(以PXA270为例) 针对目前嵌入式系统中最流行的ARM平台,它的这部分工作就是由英国ARM公司的工程师完成的,我们所要做的就是从其网站上下载相关版本Linux内核的补丁(Patch)。把它打到我们的Linux内核上,再进行交叉编译就行。 修改Linux的内核源码: 在Linux启动的第一阶段,内核与体系结构相关部分(arch目录下)首先执行,它完成硬件寄存器设置,内存映像等初始化工作。然后把控制权转给内核中与系统结构无关部分。而我们移植工作中要改动的代码主要集中在与体系结构相关部分。 在arch 目录中我们可以看到有许多子目录,它们往往是用芯片命名的,表示是针对该芯片体系结构的代码。为arm 系列芯片编译内核,就应修改ARM目录下的相关文件。在ARM的子目录下我们可以找到一个boot/bootp目录,在bootp下有一个init.S 的文件,.S表示它是汇编语言文件。这里init.S是用ARM汇编写成的。这个init.S就是引导Linux内核在Arm平台上启动的初始化代码。它里头定义了一个全局符号_start,它定义了默认的起始地址。同时它也是整体内核二进制镜像的起始标志。Init.S主要完成以下功能:(具体的代码可以查阅UP-TECHPXA270A-LINUX实验指导书V5.0) Linux 内核的编译菜单有好几个版本,您运行: 编译内核: 把生成的zImage 文件拷贝到PC 机的tftp 服务目录/tftpboot/下,在进行以下操作前请确保已配置好您的PC 机TFTP 服务器。(安装软件tftp32) 烧录内核: 至此,内核映象文件的烧写完成。 另外,若在vivi的Bootloader引导下,还可以通过串口的方式烧写内核和根文件系统(分别为zImage和root.cramfs两个文件): vivi>load flash kernel x vivi>load flash root x 9、编写Red hat内核驱动程序前需要注意的 需要在usr/src/ 目录下建立指向linux内核的符号连接。若PC机的linux系统内核路径是/usr/src/linux-2.4.xxx,那么执行建立符号连接的命令是: before make , please cd /up-techpxa270/kernel/linux-2.6.9/ directory and run " make zImage" 10、调试过程中利用printk跟踪 printk是一个很有用的函数,利用它可以实现从内核向Linux控制台的格式化输出。其用法与标准C的printf类似。在调试驱动程序时,依靠printk输出信息跟踪程序,也是很有效的方法。 与标准C的printf不同的是,printk支持分级输出。在include/linux/kernel.h中,为输出定义了如下8个级别: #define KERN_EMERG "<0>" /* system is unusable,紧急情况 */ 未指定优先级的默认级别定义在/kernel/printk.c中: 可以用这种方式,即使用:printk(KERN_INFO"your message/n"); 在指定的级别下输出。未使用输出级别定义的printk调用,则用DEFAULT_MESSAGE_LOGLEVEL作为默认的输出级别,它在kernel/printk.c中被定义为第4级的输出,即KERN_WARNING。在include/linux/kernel.h中,定义了宏console_loglevel.任何小于console_loglevel级别的输出,都会被显示在Linux控制台(console)上。console_loglevel的初始值为DEFAULT_CONSOLE_LOGLEVEL(在kernel/printk.c中被定义为7),而且该值可通过sys_syslog系统调用修改。如命令:klogd -C 4 就是利用sys_syslog系统调用把console_loglevel的值改成了4。 为了调试方便,建议在驱动程序中定义DPRINTK宏实现在调试过程中的跟踪。 其命令如下:#define DPRINTK(x... ) printk("s3c2410 - led: " ##x) 用法如下:DPRINTK("write: led=0x%x,count=%d/n",ledstatus,count); DPRINTK("open/n"); DPRINTK("release/n"); 11、编写Makefile文件需要注意的 编写hello.c文件 static void hello_exit(void) module_init(hello_init); //(4) 编写下面的makefile: ifneq($(KERNELRELEASE),) # Otherwise we were called directly from the command else endif clean:
.ko是2.6内核使用的动态连接文件的后缀名,也就是模块文件。 另:在编译内核并安装时,系统会改变或新增哪些文件? 会在/boot/下增加新的内核文件,新的initrd和map文件,修改grub的配置 文件/boot/grub/grub.conf 运行 在内核上成功挂载和卸载了hello模块。知道在执行rmmod hello命令后,hello模块已经卸载了。如果此时我们再执行一遍rmmod hello命令,则会出现类似下面的提示: 12、设备文件和设备文件系统 在Linux系统中,字符设备和块设备是通过文件节点访问的。习惯上,这些设备文件存在于系统的/dev目录下。因为系统不是靠路径去关联设备文件和对应的驱动程序的,所以也可通过mknod命令把设备文件创建在其他位置。通过如下命令:ls -l /dev 可以列出系统的设备文件。 其中:对应的字母表示的是:字符设备文件(c),准予读取(r),准予写入(w),块设备文件(b),所有者(root),组(floppy);第一个数字对应的是主设备号,第二个数字对应的是次设备号。 Linux系统是依靠主次设备号来联系驱动程序和设备文件节点的(而不是设备文件的路径)。系统依靠主设备号标识不同的驱动程序,因此,在同一个系统中,一类设备的主设备号是惟一的。每一个Linux驱动程序都对应了一个主设备号。可以使用以下命令:cat /proc/devices 列出系统内核支持的设备驱动程序和对应的主设备号。 同一个驱动程序可以管理多个设备,它们依靠次设备号来区别。次设备号只在驱动程序内部使用,系统内核直接把次设备号传递给驱动程序,由驱动程序去管理。 对于字符设备和块设备,Linux内核对这些操作进行了统一 的抽象,把它们定义在结构体file_operations中。 Linux下的设备驱动程序通常放在/dev目录下。如果我们进入到/dev目录,然后执行ls -l|more命令,我们会发现下面几点: 13、Linux驱动程序的编写细节点 通常,程序员会通过一个判断语句来观察设备是否被正确打开,如果被正确打开会进行所要的操作,否则便会报错。实现方法如下面的代码所示: if(fd==-1) {printf("open device %s error /n",DEVICE_NAME);} else{//文件打开成功,进行具体的文件操作} driver_register是2.6内核中提供的注册驱动程序的方法,其原型在drivers/base/driver.c中定义: int driver_register(struct device_driver * drv) 它使得系统加载、检测、卸载驱动程序有一个统一的接口。 程序在最外一层的local_irq_restore调用才把中断打开,而__cli和__sti宏则不能嵌套调用。 14、嵌入式根文件系统 目录 习惯用法 对于用途单一的嵌入式系统,上边的一些用于多用户的目录可以省略,例如/home、/opt、/root目录等。而/bin、/dev、/etc、/lib、/proc、/sbin 和/usr 目录,是几乎每个系统必备的目录,也是不可或缺的目录。 15、查看/dev目录下的设备的主次设备号的命令 查看/dev目录下的设备的主次设备号使用如下的命令:ls /dev -l |
虚拟机Linux Redhat 9与目标开发板进行系统编程方面的问题总结(转载)
最新推荐文章于 2023-07-06 16:23:54 发布