当前位置: 首页 > news >正文

西安网站优化平台微信后台网站开发知识体系

西安网站优化平台,微信后台网站开发知识体系,网站logo用什么来做,wordpress评论表单作者#xff1a;蔡伦辉写在前面作者一直支持GPL的精神。允许任何人自由使用、转载、复制和再分发#xff0c;但必须保留作者署名#xff0c;必须保证全文完整转载#xff0c;包括完整的版权声明。由于作者水平有限#xff0c;因此不能保证文章内容准确无误#xff0c;请批…作者蔡伦辉写在前面作者一直支持GPL的精神。允许任何人自由使用、转载、复制和再分发但必须保留作者署名必须保证全文完整转载包括完整的版权声明。由于作者水平有限因此不能保证文章内容准确无误请批判阅读。如果你发现任何错误或对文章内容有任何建议欢迎你与我联系Email: caiallentom.com  QQ群: 14765968设置测试系统在该小节中有以下一段话“不管内核来自哪里想要为2.6x内核构造模块还必须在自己的系统中配置并构造好内核树。这一要求和先前版本的内核不同先前的内核只要有一套内核头文件就够了。但因为2.6内核的模块要和内核源代码树中的文件连接通过这种方式可得到一个更加健壮的模块装载器但也需要这些目标文件存在于内核目录树中。”这段话说出了2.4和2.6两种版本的驱动模块的编写的一个不同之处。问题来自我用的操作系统是Fedora Core 5。FC5在安装时是不安装源代码树在PC上的。所以我必须在我的FC5上建立内核源代码树。最好在构造内核模块时运行的恰好是目标内核。书上的例子是在版本2.6.10中构造的用命令uname -r查看FC5的版本信息为2.6.151.2054_FC5。所以我要建立的内核源代码树的版本为2.6.15。下面详细介绍其建立过程。1。  下载内核rpm包rpm包名称kernel-2.6.15-1.2054_FC5.src.rpm下载地址http://download.fedora.redhat.com/pub/fedora/linux/core/5/source/SRPMS/kernel-2.6.15-1.2054_FC5.src.rpm2。    安装rpm包以root身份登陆以下步骤都以root身份执行。进入保存rpm包的目录下运行命令#rpm -Uvh kernel-2.6.15-1.2054_FC5.src.rpm            该命令将rpm的内容写到路径/usr/src/redhat/SOURSE和/usr/src/redhat/SPECS下。3。   build源码包            #cd /usr/src/redhat/SPECS#rpmbuild -bp --target i686 kernel-2.6.spec该命令将会把内核源码树放到目录/usr/src/redhat/BUILD/kernel-2.6.15/kernel-2.6.15.6864。    配置内核Fedora Core 5附带的内核配置文件在内核源码树的configs/目录下。例如i686 SMP 配置文件被命名为configs/kernel-version-i686-smp.config。但我的PC机为i686,单CPU所以不是SMP应该选的内核配置文件是kernel-2.6.15-i686.config注意如果你的PC是单CPU的而选 configs/kernel-version-i686-smp.config进行内核配置则在建立代码树后运行后面的insmod hello.ko会失败失败原因我在文件/var/log/messages中找到如下Nov 23 04:55:02 localhost kernel: hello: version magic 2.6.15-1.2054_FC5 SMP 686 REGPARM 4KSTACKS gcc-4.1 should be 2.6.15-1.2054_FC5 686 REGPARM 4KSTACKS gcc-4.1一对比2.6.15-1.2054_FC5 SMP 686 REGPARM 4KSTACKS gcc-4.12.6.15-1.2054_FC5 686 REGPARM 4KSTACKS gcc-4.1‘看出区别了吧原因是我选的配置文件不对。我一开始就犯了这个错误错误结果不得不又从头开始进行漫长的编译。使用下列命令来将需要的配置文件复制到合适的位置用来编译#cd /usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686 #cp configs/kernel-version-i686.config .config你也可以在 /lib/modules/version/build/.config 这个位置找到与您当前的内核匹配的 .config 文件。因为build是个连接其连接目标就是/usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686用以下命令调出内核配置菜单。#make menuconfig配置如下Loadable module support --- Enable loadable module supportModule unloading[ ] Module versioning support (EXPERIMENTAL)Automatic kernel module loading       5。    修改Makefile每个内核的名字都包含了它的版本号这也是 uname -r 命令显示的值。内核Makefile 的前四行定义了内核的名字。为了保护官方的内核不被破坏Makefile经过了修改以生成一个与运行中的内核不同的名字。在一个模块插入运行中的内核前这个模块必须针对运行中的内核进行编译。为此,你必须编辑内核的Makefile。例如如果 uname -r 返回字符串 2.6.15-1.2054_FC5就将 EXTRAVERSION 定义从EXTRAVERSION -prep修改为EXTRAVERSION -1.2054_FC5也就是最后一个连字符后面的所有内容。6。    编译内核在目录/usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15.i686下即Makefile所在的目录使用下面命令编译内核#make bzImage           编译内核 #make modules           编译模块 #make modules_install   安装模块这一步可是一个漫长的过程啊花去我差不多一个小时。7。    完成“内核树”的安装以上这一步如果没什么错误到此就完成了内核代码树的建立。目录“/usr/src/redhat/BUILD/kernel-2.6.15/kernel-2.6.15.686/”中就是所谓的“内核代码树”同时“/lib/modules/2.6.15-1.2054_FC5/build”是个符号链接也指向这个目录所以这里也可以叫做“内核代码树”。以上的建立步骤是在参考《在Linux 2.6内核下编译可以加载的内核模块》原文地址http://blog.csdn.net/wooin/archive/2007/05/21/1619141.aspx同时结合自己的实践而得出增加一些说明并修正了其中的一些错误。完成以上的步骤便为我们后面的实践打下了基础。Hello World模块要想验证我们的内核代码树是否成功建立可以写个内核模块测试一下就从Hello world程序开始。以下是名为hello.c的文件的代码                                #include linux/init.h#include linux/module.hMODULE_LICENSE(Dual BSD/GPL);//(1)static int hello_init(void)//(2) {   printk(KERN_ALERT Hello, World!\n);//(3)   return 0;}static void hello_exit(void) {   printk(KERN_ALERT Goodbye, cruel World!\n);}module_init(hello_init);//(4)module_exit(hello_exit);//(5)代码说明    (1):MODULE_LICENSE是一个特殊的宏用来告诉内核该模块采用自由许可证可以不要这样的声明但不要的话运行ismod hello.ko时会出现hello: modulelicense unspecified taintskernel.词典上对taints的解释是感染污点即内核在装载该模块时会产生抱怨内核有情绪还要注意的一点是这句不要写到最后放到(5)后面还是会出现内核污染的提示。    (2):对模块内的函数一般需要加上static关键字进行修饰这样可防止模块外访问该函数这是应该养成的一个好习惯。    (3):printk函数相当于C标准库函数printf, KERN_ALERT是指的输出消息的优先级别。    (4)(5):模块初始化和模块退出时有专门的函数这个函数在2.4和2.6两种版本的内核有所区别。然后编写该程序的Makefile# Makefile for hello.cobj-m:hello.oKDIR:/lib/modules/2.6.15-1.2054_FC5/buildPWD:$(shell pwd)default:    $(MAKE) -C $(KDIR) M$(PWD) modules.PHONY:cleanclean:    rm -f *.o *~ *.ko该Makefile为何这样写可以参考相关资料如我转载的《2.6驱动移植系列之Getting started(2模块编译》和在内核代码的/Documentation/kbuild目录下的makefile.txt这篇文档。简单解析下$(MAKE) -C $(KDIR) M$(PWD) modules命令首先改变目录到-C选项指定的位置即内核源代码目录其中保存有内核的顶层Makefile文件因为build脚本会首先判断有无必要重新编译内核所以如果需要先重新编译内核的话编译过程会运行一段时间。M选项让该Makefile在构造modules目标之前返回到模块源代码目录。然后modules目标指向obj-m变量中设定的模块。有一点需要注意的Makefile文件名一定要大写不能写出makefile否则在你make时会出现“没有规则可以创建目标。停止”类似的提示。执行make命令进行编译就行了 执行完毕后会生成几个文件hello.kohello.mod.chello.mod.ohello.o注意2.6内核的模块后缀名为.ko运行命令#insmod hello.ko挂载成功但看不到输出:Hello World!。然后再运行命令#rmmod hello同样卸载成功但也看不到输出Goodbye, cruel world!后来查看日志文件/var/log/messages哈哈原来输出到这里来了后来查找原因原来在GNOME环境(即图形界面)信息不会输出到终端在在控制台下则可以看到输出信息。按换到控制台模式以root身份登陆再运行insmod hello.ko果然看到输出。再按可以切换回GNOME环境。如果你在运行insmod hello.ko时出现以下提示insmod: error inserting hello.ko: -1 Invalid module format可能的原因有    1。内核源代码树没有建立好。    2。编译器的版本不对。可以查看内核文档中的Documentation/Changes文件列出的需要的工具版本。    3。Makefile编写不对。核心模块与应用程序的对比内核模块与应用程序的不同之处有    1。大多数小规模及中规模应用程序是从头到尾执行单个任务而模块只是预先注册自己以便服务于将来的某个请求然后它的初始化函数就立即结束。    2。应用程序在退出时可以不管资源的释放或者其他的清除工作但模块的退出却必须仔细撤销初始化函数所做的一切否则在系统重新引导之前某些东西就会残留在系统中。    3。模块运行在所谓的内核空间里而应用程序运行在所谓的用户空间中。用户空间和内核空间操作系统的作用是为应用程序提供一个对计算机硬件的一致视图除此之外还必须负责程序的独立操作并保护资源不受非法访问。这两种运行模式都有自己的内存映射也即自己的地址空间。每当应用程序执行系统调用或者被硬件中断挂起时linux将执行模式从用户空间切换到内核空间。而处理硬件中断的内核代码和进程是异步的与任何一个特定的进程无关。模块化代码在内核空间中运行用于扩展内核功能。通常来讲一个驱动程序要执行两类任务模块中的某些函数作为系统调用的一部分而执行而其他函数则负责中断处理。当前进程内核代码可以通过访问全局项current来获得当前进程。current指针指向当前正在运行的进程。在open,read等系统调用的执行过程中当前进程指的是调用这些系统调用的进程。与早期linux内核版本不同2.6中current不再是全局变量。然而设备驱动程序只要包含头文件即可以引用当前进程。编译模块实际上hello world的makefile的一个更容易的写法是# 如果已定义KERNELRELEASE则说明是从内核构造系统调用的。# 因此可以利用其内建语句ifneq ($(KERNELRELEASE),)     obj-m : hello.o# 否则是直接从命令行调用# 这时要调用内核构造系统else     KERNELDIR ? /lib/modules/$(shell uname -r)/build     PWD : $(shell pwd) default:     $(MAKE) -C $(KERNELDIR) M$(PWD) modulesendif KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量在第一次读取执行此Makefile时KERNELRELEASE没有被定义所以make将读取执行else之后的内容。如果make的目标是clean直接执行clean操作然后结束。当make的目标为all时-C$(KDIR) 指明跳转到内核源码目录下读取那里的MakefileM$(PWD)表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时KERNELRELEASE已被被定义kbuild也被启动去解析kbuild语法的语句make将继续读取else之前的内容。else之前的内容为kbuild语法的语句,指明模块源码中各文件的依赖关系以及要生成的目标模块名。continue...转载于:https://www.cnblogs.com/dayuhope/p/3286481.html
http://www.zqtcl.cn/news/732789/

相关文章:

  • 企业信息网站衡阳高端网站建设
  • 中小学网站建设小程序开发费用是多少
  • 网站开发项目可行性分析单位logo设计
  • 做最好的美食分享网站网站源码网站
  • 宝塔搭建app教程360优化大师下载
  • 杭州网站制作 乐云践新开发公司竣工员工奖励计划
  • 绍兴市越城区建设局网站网站策划运营方案书
  • 怎么查网站备案信息查询wordpress 新安装 慢
  • 做一个卖东西的网站深圳市住房和建设局网站变更
  • 一个公司做几个网站绵阳房产网
  • 广州做网站服务怎样做网站反链
  • 淘宝客网站制作视频教程flash做网站的论文
  • wordpress keywords 用逗号 区分关键字南昌网站优化方案
  • 清华大学网站建设方案郑州建网站企业
  • 闸北网站优化公司网站表格代码
  • 网站里面如何做下载的app深圳企业社保登录入口
  • 中国网站建设哪家公司好网站开头flash怎么做
  • 南磨房做网站公司黑马程序员就业情况
  • 电子商务网站运营方案建设银行网站查询密码设置
  • 网站服务器哪些好用php做的录入成绩的网站
  • 网站建设需要哪些信息vi设计什么意思
  • 苏州吴中区专业做网站玉树市公司网站建设
  • wordpress 不换行沈阳网站制作优化
  • 要维护公司的网站该怎么做怎么联系创意设计网站
  • 阿里云wordpress搭建网站网站如何做app
  • 做微商哪个网站比较好wordpress5.0.2运行慢
  • 中牟高端网站建设建自己的个人网站
  • 网站前台架构WordPress 分类 调用
  • 腾讯用户体验网站哈尔滨百姓网
  • 上海品质网站建设深圳自适应网站制作