×

内核编程

内核编程(内核编程语言与环境重点)

admin admin 发表于2023-04-11 19:36:10 浏览83 评论0

抢沙发发表评论

本文目录一览:

在Ubuntu上做内核编程,要安装哪个包?怎么做?

1、gcc (C编译器)

安装 apt-get install gcc

2、make (源代码维护工具,它能自动检测出需要重新编译的源文件并根据你设定的编译规则去重新编译程序)

安装 apt-get install make

3.kernel-source (内核源码包。你可以apt-cache search kernel-source搜索到内核源代码包,并用uname -r命令查看到当前系统内核版本,然后用apt-get install kernel-source-xxxx来安装和你内核版本一致的内核源代码包)-内核编程

如果你不想重新编译内核,内核源代码包kernel-source是完全可以不下载的。

4.kernel-headers(内核源代码头文件包,不管你是要进行内核模块开发还是进行驱动程序开发,这个包都是必须 要安装的。因为作为一个内核模块编写者,通常会调用内核里的一些东西,比如内核头文件,内核数据结构申明等。它里面包含了一些关键的内核头文件)-内核编程

安装 apt-cache search kernel-headers

uname -r

apt-get instakk kernel-headers-xxxx

5.kernel-kbuild(用来编译内核模块的,下载安装这个包后会发现在/usr/src目录下多了一个kernel-kbuild-xxxx开头的目录,下面只有scripts一个目录,这是用来编译内核模块的一些脚本程序)-内核编程

安装 apt-cache search kernel-kbuild

uname -r

apt-get install kernel-kbuild-xxxx

6.build-essential(包含一个在建立deb包过程中起关键作用的包的信息列表,如果你不想建立deb包你就不需要安装此表)

安装 apt-get install build-essential

7.kernel-package(如果你想把内核镜像做成一个deb包来用,那么必须用安装这个包了)

安装 apt-get install kernel-package

8.initrd-tools(如果你想制作启动过程的initrd镜像,则这个包是必不可少的)

安装 apt-get instakk initrd-tools

假设你编写了一个内核模块程序,源代码如下:

/* hello.c */

#include linux/init.h

#include linux/module.h

#include linux/kernel.h

static int hello_init(void)

{

printk(KERN_ALERT "Hello, linux kernel module

");

return 0;

}

static void hello_exit(void)

{

printk(KERN_ALERT "Goodbye, I've created a linux kernel module sucessfully

");

}

module_init(hello_init);

module_exit(hello_exit);

MODULE_LICENSE("GPL");

 你需要这此源程序编写一个makefile,内容如下:

#Makefile for hello.c file

#

KERNEL_DIR:=/usr/src/linux

obj-m:=hello.o

default:

$(MAKE) -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules

clean:

$(RM) .*.cmd *.mod.c *.o *.ko -r .tmp

注意:这里的KERNEL_DIR是指内核源代码头文件所在目录的上一级目录,通常就是指内核源代码目录。该目录一般包括有arch,drivers,fs,include,init,ipc,kernel,lib,mm,net,scripts,usr,sound,security等目录。-内核编程

在本示例中,/usr/src/linux是一个链接,指向了/usr/src/kernel-headers-2.6.8-3目录。

编写好makefile后就可以输入make命令生成hello.ko内核模块了,然后你可以用:

insmode hello.ko

命令来加入内核模块,然后用:

rmmod hello

来删除内核模块。

请简要叙述内核编程的注意点即和普通应用程序编程的不同之处

1.linux内核编程和用户应用程序编程最大的不同是,前者是在内核态下运行的,而后者主要在用户态下运行,有时通过一些系统调用切换到内核态下运行,但这时间不会太长。

2.内核编程引进的头文件都在内核源码的include文件夹下,比如我的debian linux 2.6环境下是:/usr/src/linux/include下,而用户应用程序编程引进的头文件都是从开发环境头文件的include文件夹下,比如我的环境下是:/usr/include下。也就是凡是要include的头文件在内核源码include底下没有的都不能用。-内核编程

3.要查询一个函数能否在内核编程中用,可以通过查(这是针对linux2.6内核,也有针对2.4内核的),如果能查到Defined as a function,那就可以用,否则就不行。

4.举个简单的例子:当socket编程时,用户在应用程序编程时,基本上都用到socket()函数创建一个socket描述符,include的头文件主要是,和,这几个头文件在内核源码include下都没有,所有不能用,但内核编程有它自己的一套。内核socket编程时,需要用sock_create()得到一个socket结构体,如果想跟用户应用程序一样用socket描述符来操作socket,可以再用sock_map_fd()新建一个对应的描述符,而且需要时可以通过sockfd_lookup(),实现通过描述符查找对应的socket结构体。其实socket函数内核实现时就是先有sock_create(),再有sock_map_fd()。-内核编程

什么是LINUX内核编程

真佩服楼上的2位对“内核编程”的理解力!

简单说,Linux内核编程就是开发Linux驱动程序,学会内核编程后,将会对操作系统的内部机制和工作原理有充分了解,可以从事硬件驱动开发、嵌入式系统开发等。内核编程的语言仍是传统的C语言,但其编写方法和调用接口与传统应用程序的差别较大,你必须了解如何处理中断、如何在内核态和用户态之间转换、PCI、DMA、内核地址映射、内核I/O等,这不是《UNIX高级编程》所涉及的内容,可以找一本专门讲Linux驱动编程的书看看,或在网上搜寻相关资料(关键词:Linux DDK)。不过先提醒一句,学习内核编程的难度很大,必须做好长期心理准备-内核编程

学习windows内核编程可以干什么

可以进行操作系统级的控制、病毒防护、网络安全、设备驱动等应用。还有在需要系统底层的功能支持的应用开发上,这类应用也需要掌握内核编程。

内核编程与驱动编程有什么不同

问题1: 驱动是运行在内核层的程序。Windows操作系统为了安全起见,设计了WIN32层,内核层,这样分层设计使得操作系统更加安全稳定避免了用户无意间访问非法的硬件地址而导致蓝屏,WIN32层不能直接访问硬件和接受中断(如PCI总线,USB总线,ISA总线等一些总线的控制和传输协议)还有其优先级别不如内核层。驱动是运行在内核层的程序,也就是说其可以直接访问硬件和接受硬件产生的中断。你把这个问题搞清楚就知道针对WINDOWS的“驱动编程”实际是指编写运行在内核层下的程序。可以阅读WIN DDK文档了解更多。 问题2:Nt开头的函数是运行在内核层的函数。WIN32下可以通过一些NT函数访问内核程序(如驱动)一一些NT函数是“WIN32层下的程序”通向“内核层程序”的通道。 问题3:参看WIN DDK文档和驱动程序设计方面的书籍。GOOD LUCK TO U. : )-内核编程