GVKun编程网logo

基于mykernel完成多进程的简单内核

24

如果您想了解基于mykernel完成多进程的简单内核的相关知识,那么本文是一篇不可错过的文章,我们将为您提供关于Android6.0内核移植(2):kernel编译内核、c–USB的简单内核模块、ce

如果您想了解基于mykernel完成多进程的简单内核的相关知识,那么本文是一篇不可错过的文章,我们将为您提供关于Android6.0内核移植(2):kernel编译内核、c – USB的简单内核模块、centos系统中kernel-devel的简单介绍、docker supervisord 管理多进程的建议的有价值的信息。

本文目录一览:

基于mykernel完成多进程的简单内核

基于mykernel完成多进程的简单内核

学号076,本实验资源来源https://github.com/mengning/mykernel

1.实验准备:

由于在pc上总是装不好qemu,所以采用实验楼配置好的虚拟机进行实验。

打开虚拟机的终端,依次输入以下命令:

cd LinuxKernel/linux-3.9.4

rm -rf mykernel

patch -p1 < ../mykernel_for_linux3.9.4sc.patch

make allnoconfig

结果如下:

分享图片

再输入命令make,进行内核编译,结果如下:

分享图片

在终端输入命令qemu -kernel arch/x86/boot/bzImage,结果如下图所示:

分享图片

关闭QEMU窗口,终端输入cd mykernel,再输入ls可以查看mykernel文件夹里的内容,可以看到里面包含mymain.c以及myinterrupt.c

输入vim mymain.c,可以看到mymain.c的内容如下:

分享图片

my_start_kernel函数中有一个循环,不停地输出my_start_kernel here,同理在终端输入vim myinterrupt.c,可以看到myinterrupt.c的内容如下:

分享图片

my_timer_handler函数会被时钟中断周期调用,输出类似>>>>>my_timer_handler here <<<<< 的字符串。

Android6.0内核移植(2):kernel编译内核

Android6.0内核移植(2):kernel编译内核

普通步骤是:用来编译整个Android源码

source build/envsetup.sh
lunch sabresd_6dq-user
make -j20

 

不过每次这样太繁琐,下面来单独编译kernel分析:在上面make之后的日志中

No private recovery resources for TARGET_DEVICE sabresd_6dq
make -C kernel_imx imx_v7_android_defconfig ARCH=arm CROSS_COMPILE=`pwd`/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi- LOADADDR=0x10008000 KCFLAGS=-mno-android   //编译生成zImage
make[1]: Entering directory `/home/hejin/myandroid/kernel_imx''
#
# configuration written to .config
#
make[1]: Leaving directory `/home/hejin/myandroid/kernel_imx''
install -D kernel_imx/.config out/target/product/sabresd_6dq/.config
make -C kernel_imx -j20 uImage ARCH=arm CROSS_COMPILE=`pwd`/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi- LOADADDR=0x10008000 KCFLAGS=-mno-android   //编译生成uImage
make[1]: Entering directory `/home/hejin/myandroid/kernel_imx''
scripts/kconfig/conf  --silentoldconfig Kconfig
make[1]: Leaving directory `/home/hejin/myandroid/kernel_imx''
make[1]: Entering directory `/home/hejin/myandroid/kernel_imx''
  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  CC      scripts/mod/empty.o
  CC      scripts/mod/devicetable-offsets.s
  MKELF   scripts/mod/elfconfig.h

 

编译:

 1. 根据上面导出环境变量

  export ARCH=arm
  export CROSS_COMPILE=~/myandroid/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-

2. 编译
make savedefconfig //将当前的.config生成defconfig
make imx_v7_android_defconfig //重新生成.config echo $CROSS_COMPILE //make all -j20 >> ~/debug.txt //生成zImage
make -j20 uImage LOADADDR=0x10008000 KCFLAGS=-mno-android //生成uImage,暂时不清楚为何

 接着编译bootimg (uImagel 和ramdisk):

source build/envsetup.sh 
lunch sabresd_6dq-user
make bootimage

 

c – USB的简单内核模块

c – USB的简单内核模块

我正在尝试熟悉 Linux内核模块.所以我写了这个最简单的模块,可以在usb上运行.我不确定我错过了什么.正在加载模块.同样在dmesg我可以看到:

[27245.911387] usbcore: registered new interface driver testusb
   [27245.911392] testusb: driver registered successfully

但是当我插入一个usb棒时,我的testusb_probe函数没有被调用.知道我哪里出错了.
这是模块的代码:

#include <linux/kernel.h>
   #include <linux/module.h>
   #include <linux/usb.h>


   static int testusb_probe(struct usb_interface *interface,const struct usb_device_id *id)
   {
    printk("testusb: probe module\n");
    return 0;
   }


   static void testusb_disconnect(struct usb_interface *interface)
   {
    printk("testusb: disconnect module\n");
   }


   static struct usb_driver testusb_driver = {
           name: "testusb",probe: testusb_probe,disconnect: testusb_disconnect,};

   static int __init testusb_init(void)
   {
           int result;

           result = usb_register(&testusb_driver);
           if (result) {
                   printk("testusb: registering driver Failed");
           } else {
                   printk("testusb: driver registered successfully");
           }

           return result;
   }


   static void __exit testusb_exit(void)
   {
           usb_deregister(&testusb_driver);
           printk("testusb: module deregistered");
   }

   module_init(testusb_init);
   module_exit(testusb_exit);

   MODULE_AUTHOR("Dal Chand");
   MODULE_LICENSE("GPL");

解决方法

您的测试驱动程序未启用USB热插拔.

http://www.linuxjournal.com/node/4786/print

/* Define these values to match your devices */
#define USB_vendOR_ID      0xfff0
#define USB_PRODUCT_ID     0xfff0

/* table of devices that work with this driver */
static struct usb_device_id test_table [] = {
        { USB_DEVICE(USB_vendOR_ID,USB_PRODUCT_ID) },{ }                                     /* Terminating entry */
};
MODULE_DEVICE_TABLE (usb,test_table);

USB_vendOR_ID和USB_PRODUCT_ID是您的USB棒的ID.如果您不知道ID,请在插入操作杆时检查dmesg消息.

centos系统中kernel-devel的简单介绍

centos系统中kernel-devel的简单介绍

LINUX中的kernel-devel工具是干什么的?

如果某个程序需要内核提供的一些功能,它就需要内核的 C header 来编译程序,这个时候 linux-devel 里面的东西就用上了。
比如 nvidia 和 ati 的官方显卡驱动,alsa-driver 声卡驱动,他们都需要编译一个放在内核里面运行的模块,编译这个模块就需要内核的 header 文件才能顺利编译。

当然,kernel-devel 不光是 C Header 文件,它还有内核的配置文件,以及其他的开发用的资料

kernel devel和kernel source的区别?

区别:kernel-devel包只包含用于内核开发环境所需的内核头文件以及Makefile,而kernel-souce包含所有内核源代码。
如果仅仅是用于你自己编写的模块开发的话,因为只需引用相应的内核头文件,所以只有devel包即可,如果你要修改现有的内核源代码并重新编译,那必须是kernel-souce。

kernel-souce在RH某些版本之后不再附带在发行版中了,必须自己通过kernel-XXX.src.rpm做出来。


kernel-devel是用做内核一般开发的,比如编写内核模块,原则上,可以不需要内核的原代码。
kernel则是专指内核本身的开发,因此需要内核的原代码。

关于kernel source的有kernel和kernel-devel两个rpm,其中kernel rpm包含源文件和头文件(就像2.4下的kernel-source rpm),而kernel-devel则主要是头文件。

docker supervisord 管理多进程的建议

docker supervisord 管理多进程的建议

配置使用绝对路径

启动参数 -c 指定配置 supervisord.conf 绝对路径。比如 Dockerfile 最后这么写:

ENTRYPOINT ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"]
多个启动项配置文件统一目录

如 /etc/supervisor/conf.d/,并且在 supervisord.conf include 这里目录

[include]files = /etc/supervisor/conf.d/*.conf

每个启动项日志统一

统一放入目录,如:/tmp/xxx_stdout.log,并设置日志滚动大小和保留份数

supervisord 配置
需要配置 nodaemon=true,默认输出扔给 docker
supervisorctl 使用 http server 方式管理,这里涉及 docker overlayfs unix sockets 一个问题,无法管理启动项,不知道现在是否解决

[inet_http_server]
port=127.0.0.1:9001
username=user
password=123

[supervisorctl]
serverurl=http://127.0.0.1:9001
username=user
password=123

缺点就是多监听本地一个端口,并注意不能和应用端口冲突

一次性程序
比如要执行初始化,可以:

[program:xxx]
command=sh /xxx.sh
startretries=0
autorestart=false

传递环境变量
针对非 root 用户启动,并且需要读取容器启动时候环境变量(env)传递,新写 ENTRYPOINT 脚本中获取环境变量,写入文件,最后再运行 supervisord

$ cat Dockerfile
ENTRYPOINT ["/entrypoint.sh"]
$ cat /entrypoint.sh

获取环境变量,写入配置,或者拼接完整 command

/usr/bin/supervisord -c xx.conf

重启或者重加载配置
在容器内 kill -HUP 1 即可
-EOF-

更多技术资讯可关注:gzitcast

关于基于mykernel完成多进程的简单内核的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android6.0内核移植(2):kernel编译内核、c – USB的简单内核模块、centos系统中kernel-devel的简单介绍、docker supervisord 管理多进程的建议的相关知识,请在本站寻找。

本文标签: