`
haoningabc
  • 浏览: 1484098 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jslinux重新编译内核3.19

阅读更多
一个日本的编3.8.5的:
http://d.hatena.ne.jp/cupnes/comment/20130403/1364974831

使用的系统版本是
Red Hat Enterprise Linux Server release 6.5 (Santiago)
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)
测试如下:

本地跑的jslinux参考
http://haoningabc.iteye.com/blog/1397960
这个版本是用的2.6.20
其实可以编译3.19的版本的内核
http://bellard.org/jslinux/
下载官网的
linuxstart-20120111
里面的文件config_linux-2.6.20 是编译内核用的
比如在
linuxstart-20120111同级目录下下载内核
http://www.linux-mips.org/pub/linux/mips/kernel/v2.6/
linux-2.6.20.tar.bz2
[root@node11 tmp]# cat run26.sh 
#!/bin/sh
tar -jxvf linux-2.6.20.tar.bz2
cp ./linuxstart-20120111/config_linux-2.6.20 ./linux-2.6.20/.config
cd ./linux-2.6.20/
patch -p1 <../linuxstart-20120111/patch_linux-2.6.20 
echo "vim linux-2.6.20/scripts/mod/sumversion.c "
echo "adding #include <limits.h>"
echo "if this is centos7 and gcc 4.8.3 ,something must
do "
echo "time make ARCH=i386 -j16 "


如果是centos7的
gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9)

可能编译遇到问题
-------------------------centos7可能出现问题开始---------------------
Makefile:1439: *** mixed implicit and normal rules
config %config: scripts_basic outputmakefile FORCE
改成
%config: scripts_basic outputmakefile FORCE
将1279行代码:
/ %/: prepare scripts FORCE(错)
改为:
%/: prepare scripts FORCE(对)

参考
http://blog.csdn.net/simonjay2007/article/details/7796390
如果遇到问题
gcc: error: elf_i386: No such file or directory  
gcc: error: unrecognized command line option ‘-m’ 

#sed -i "s/m elf_i386/m32/g" `grep "m elf_i386" -rl  .` 

只改vim arch/i386/kernel/Makefile 中的 -m elf_i386 变-m32 注意只改gcc后面的,ld的不修改
如果出现错误
kernel/built-in.o: In function `mutex_lock':
(.sched.text+0xe25): undefined reference to `__mutex_lock_slowpath'
kernel/built-in.o: In function `mutex_unlock':
(.sched.text+0xe35): undefined reference to `__mutex_unlock_slowpath'
make: *** [.tmp_vmlinux1] Error 1

如果是mutex相关的错误
未定义什么mutex加锁和解锁
kernel/mutex.c
这个好使,其他的都是扯淡,什么该config参数,什么加__used都不行,需要把static去掉,加锁和解锁的
https://github.com/socketpair/jslinux_reversed/blob/master/contrib/patches/2.6.20_common_fixes.patch
__mutex_lock_slowpath的两个方法的static去掉
__mutex_unlock_slowpath的两个方法的static去掉
-------------------------centos7可能出现问题结束----------------------


1.由于gcc的版本问题,linux-2.6.20/scripts/mod/sumversion.c加了一行#include <limits.h>
2.使用config_linux-2.6.20作为linux内核的.config配置文件
3.patch_linux-2.6.20 增加了1个文件jsclipboard.c,修改了4个文件
patching file drivers/char/Kconfig
patching file drivers/char/Makefile
patching file drivers/char/jsclipboard.c
patching file drivers/serial/8250.c
patching file drivers/ide/ide-probe.c

jsclipboard是剪切板交互的功能
8250是串口
ide-probe是加速的一行代码
[root@node11 linux-2.6.20]# vim drivers/ide/ide-probe.c

865         for (unit = 0; unit < MAX_DRIVES; ++unit) {
866                 ide_drive_t *drive = &hwif->drives[unit];
867 
868                 if (hwif->no_io_32bit)
869                         drive->no_io_32bit = 1;
870                 else
871                         drive->no_io_32bit = drive->id->dword_io ? 1 : 0;
add 872                 drive->io_32bit = 1; 
873         }

这个补丁如果不打的话也是可以加载的只是不能用剪切板的交互


我们下载
linux-3.19.tar.gz
tar zxvf linux-3.19.tar.gz
cd linux-3.19
cp ../linuxstart-20120111/config_linux-2.6.20 .config
make  ARCH=i386  -j16 
一路回车下来
编译好的内核
参考linuxstart-20120111中的Makefile文件
objcopy -O binary ../linux-3.19/vmlinux  vmlinux319.bin
生成js使用的内核
vmlinux319.bin
把vmlinux319.bin复制到
bellard.org/jslinux的目录,我们下载的可以跑jslinux的目录

修改jslinux.js
    pc = new PCEmulator(params);

    init_state.params = params;

    //pc.load_binary("vmlinux-2.6.20.bin", 0x00100000, start2);
    pc.load_binary("vmlinux319.bin", 0x00100000, start2);
}

function start2(ret)
{
    if (ret < 0)
        return;
    init_state.start_addr = 0x10000;
    pc.load_binary("linuxstart.bin", init_state.start_addr, start3);
}

加载重新生成的内核



以上直接编译的内核不带剪切板从linux到浏览器交互的功能
如果想交互
看patch文件
多一个
drivers/char/jsclipboard.c
由于内核的3.19的版本
注释掉一行
//#include <asm/system.h>
/* 
 *    JS clipboard support for JS/Linux
 *       (c) 2011 Fabrice Bellard
 *       */
#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/miscdevice.h>
#include <linux/ioport.h>
#include <linux/fcntl.h>
#include <linux/mc146818rtc.h>
#include <linux/init.h>
#include <linux/poll.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/spinlock.h>
#include <linux/sysctl.h>
#include <linux/wait.h>
#include <linux/bcd.h>
#include <linux/delay.h>

#include <asm/current.h>
#include <asm/uaccess.h>
//#include <asm/system.h>

#define JSCLIPBOARD_MINOR 231

#define JSCLIPBOARD_PORT 0x3c0

static int io_port = JSCLIPBOARD_PORT;
static int minor = JSCLIPBOARD_MINOR;
static struct semaphore open_sem;
static int need_cache_sync;

module_param(io_port, int, 0);
MODULE_PARM_DESC(io_port, "IO port");

module_param(minor, int, 0);
MODULE_PARM_DESC(minor, "minor number");

static ssize_t jsclipboard_read(struct file *file, char __user *buf,
                                size_t count1, loff_t *ppos)
{
        uint32_t pos, total_length, v;
        uint8_t b;
        size_t count, l;
        
        /* set read position */
        pos = *ppos;
        outl(pos, io_port + 4);
        total_length = inl(io_port + 0);
        
        if (!access_ok(VERIFY_WRITE, buf, count1))
                return -EFAULT;
        
        if (pos < total_length) 
                l = total_length - pos;
        else
                l = 0;
        if (count1 > l)
                count1 = l;
        count = count1;
        while (count >= 4) {
                v = inl(io_port + 8);
                if (__put_user(v, (uint32_t *)buf))
                        return -EFAULT;
                buf += 4;
                count -= 4;
        }
        
        while (count != 0) {
                b = inb(io_port + 8);
                if (__put_user(b, buf))
                        return -EFAULT;
                buf++;
                count--;
        }

        *ppos = pos + count1;

        return count1;
}

static ssize_t jsclipboard_write(struct file *file, const char *buf, 
                                 size_t count1, loff_t *ppos)
{
        size_t count;
        uint8_t b;
        uint32_t v;

        if (!access_ok(VERIFY_READ, buf, count1))
                return -EFAULT;
        if (*ppos == 0) {
                /* flush clipboard */
                outl(0, io_port);
        }

        need_cache_sync = 1;

        count = count1;
        while (count >= 4) {
                if (__get_user(v, (uint32_t *)buf))
                        return -EFAULT;
                outl(v, io_port + 8);
                buf += 4;
                count -= 4;
        }

        while (count != 0) {
                if (__get_user(b, buf))
                        return -EFAULT;
                outb(b, io_port + 8);
                buf++;
                count--;
        }
        *ppos += count1;
        return count1;
}

static int jsclipboard_open(struct inode *inode, struct file *file)
{
        if (down_trylock(&open_sem))
                return -EBUSY;
        need_cache_sync = 0;
        return 0;
}

static int jsclipboard_release(struct inode *inode, struct file *file)
{
        if (need_cache_sync) {
                outl(0, io_port + 12);
        }
        up(&open_sem);
        return 0;
}

static const struct file_operations jsclipboard_fops = {
        .owner          = THIS_MODULE,
        .read           = jsclipboard_read,
        .write          = jsclipboard_write,
        .open           = jsclipboard_open,
        .release        = jsclipboard_release,
};

static struct miscdevice jsclipboard_dev = {
        .minor          = JSCLIPBOARD_MINOR,
        .name           = "jsclipboard",
        .fops           = &jsclipboard_fops,
};

static int __init jsclipboard_init(void)
{
        if (!request_region(io_port, 16, "jsclipboard")) 
                return -ENODEV;
        sema_init(&open_sem, 1);
        if (misc_register(&jsclipboard_dev)) {
                return -ENODEV;
        }
        printk(KERN_INFO "JS clipboard: I/O at 0x%04x\n", io_port);
        return 0;
}

static void __exit jsclipboard_exit (void)
{
        misc_deregister(&jsclipboard_dev);
        release_region(io_port, 16);
}

module_init(jsclipboard_init);
module_exit(jsclipboard_exit);

MODULE_AUTHOR("Fabrice Bellard");
MODULE_LICENSE("GPL");

修改kconfig和Makefile文件
/drivers/char/Kconfig
在 files for controlling the behavior of this hardware
下面加

config JSCLIPBOARD
       tristate "Javascript clipboard support (JS/Linux device)"
       default n
       help
         Javascript clipboard support for JS/Linux

drivers/char/Makefile
 obj-$(CONFIG_HANGCHECK_TIMER)  += hangcheck-timer.o
 obj-$(CONFIG_TCG_TPM)          += tpm/
+obj-$(CONFIG_JSCLIPBOARD)      += jsclipboard.o
 


再重新
make ARCH=i386 -j16
生成vmlinux
再用objcopy
objcopy -O binary ../linux-3.19/vmlinux  vmlinux319.bin
生成bin给jslinux.js用


测试
在js跑的linux中
/var/root # echo "aaa" > /dev/clipboard

可以看到页面上的剪切板有了变化

如果不用jslinux,想用qemu直接启动

使用
 
cd jslinux/bin
cat cat hda000000*.bin > hda.bin
得到jslinux的硬盘hda.bin
/usr/libexec/qemu-kvm  -kernel linux-2.6.20/arch/i386/boot/bzImage -hda hda.bin -append "root=/dev/hda" -serial stdio -vnc 0.0.0.0:3 

注意使用 -serial stdio
vnc连到这个vm后只显示
Booting from ROM...
Uncompressing Linux... Ok, booting the kernel.

操作还在终端
参考
https://balau82.wordpress.com/2010/04/12/booting-linux-with-u-boot-on-qemu-arm/

如果使用官方的 linux-0.2.img
直接用
/usr/libexec/qemu-kvm  -hda linux-0.2.img   -vnc 0.0.0.0:3

把linux-0.2.img mount到硬盘上可以看到boot里面已经有2.6.20的内核了。
  • 大小: 20.5 KB
分享到:
评论

相关推荐

    linux内核编译原理

    linux内核编译2.6.39linux内核编译2.6.39linux内核编译2.6.39linux内核编译2.6.39linux内核编译2.6.39linux内核编译2.6.39linux内核编译2.6.39linux内核编译2.6.39linux内核编译2.6.39linux内核编译2.6.39linux内核...

    Linux内核编译与裁剪

    ### Linux内核编译与裁剪 #### 一、Linux版本特点 Linux内核版本的命名规则对于理解和追踪内核的发展至关重要。版本号通常由三部分组成:`VERSION.PATCHLEVEL.SUBLEVEL`,有时还会附加一个`EXTRAVERSION`。 - **...

    操作系统Linux内核编译实验报告.docx

    操作系统Linux内核编译是一项对Linux系统有深入理解的重要实践,它涉及到系统核心的构建、配置和安装。在这个实验报告中,我们主要关注的是在Ubuntu Kylin 13.04环境下,如何编译和安装一个新的Linux内核,并且如何...

    Linux内核编译步骤

    Linux 内核编译步骤 Linux 内核编译是一个复杂的过程,需要了解 Linux 内核的结构和编译过程。下面是 Linux 内核编译的详细步骤: 步骤 1: 下载 Linux 内核源代码 在编译 Linux 内核之前,需要下载 Linux 内核的...

    编译Linux内核

    编译Linux内核是Linux操作系统课程设计实验的一部分,目的是学习重新编译Linux内核,理解并掌握Linux内核和发行版本的区别。以下是编译Linux内核的详细知识点: 一、实验目的 * 了解Linux内核的编译和配置过程 * ...

    Linux内核与内核编译.pdf

    "Linux内核与内核编译" Linux内核是操作系统的核心,负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。Linux内核源程序可以在/usr/src/linux下找到。Linux的新内核版本修订了旧...

    linux-内核编译各个选项的含义

    Linux 内核编译选项是 Linux 内核编译过程中的一个重要步骤,它决定了 Linux 内核的功能和性能。本文将对 Linux 内核编译选项进行详细的解析,以帮助读者更好地理解 Linux 内核编译选项的含义和作用。 一、代码成熟...

    Linux-kernel.zip_linux编译内核_内核_编译内核

    总之,Linux内核编译、内核调试以及80386的分段机制是Linux系统管理与开发中的重要概念。通过不断学习和实践,我们可以更有效地利用Linux的强大功能,解决各种复杂问题。对于有志于深入Linux世界的人来说,这是一个...

    Linux内核重配置及编译.rar_linux_linux 内核_linux 配置_linux内核_linux编译内核

    当需要对系统进行优化、添加特定功能或修复已知问题时,我们可能需要重新配置和编译Linux内核。本资料主要涵盖了Linux内核的重配置和编译过程,下面将详细解释这一过程。 首先,重配置内核意味着根据系统的特定需求...

    linux内核编译工具Bochs

    linux内核编译工具Bochslinux内核编译工具Bochslinux内核编译工具Bochslinux内核编译工具Bochslinux内核编译工具Bochslinux内核编译工具Bochslinux内核编译工具Bochslinux内核编译工具Bochslinux内核编译工具...

    Linux内核编译.config文件,内核很小

    linux内核编译.config文件,编译出的内核很小,用于内核调试,内核版本4.19.23

    编译linux的内核文档

    总之,编译Linux内核文档是一项技术性强且细致的工作,需要理解各种配置选项的含义,同时确保系统具有编译和安装所需的所有依赖。通过这个过程,用户可以定制出最适合自身系统需求的内核,从而提高系统的性能和稳定...

    Linux内核编译详谈

    ### Linux内核编译详谈 #### 一、引言 Linux内核是Linux操作系统的心脏,负责管理和调度计算机硬件资源。随着技术的发展,Linux内核也在不断进化以支持最新的硬件和技术特性。本文将详细介绍从早期版本的Linux内核...

    Linux内核编译命令

    ### Linux内核编译命令详解 #### 一、概述 Linux内核是开源操作系统的核心部分,负责管理和协调硬件资源以及为应用程序提供服务。对于开发者来说,掌握如何编译Linux内核至关重要,因为这能帮助他们根据特定需求...

    基于Arm的Linux内核编译指导及bootloader

    为了使这些设备运行Linux操作系统,我们需要理解Linux内核编译过程以及bootloader的工作原理。本篇文章将深入探讨这两个关键知识点。 首先,让我们从Linux内核编译开始。Linux内核是操作系统的核心部分,它负责管理...

    Linux编译内核详解

    编译Linux内核是一项复杂但非常有价值的任务,它不仅可以帮助我们更好地理解操作系统的工作原理,还可以根据自己的需求定制系统行为,提高系统的性能和安全性。随着对Linux内核了解的深入,开发者们可以根据具体的...

    ARM-Linux内核编译流程

    适合arm-linux的内核编译, 包含u-boot,kernel,rootfs

    Linux内核编译全过程详解

    ### Linux内核编译全过程详解 #### 一、前言 在深入了解Linux内核编译的过程中,我们将聚焦于kernel 2.6.7版本,并详细阐述整个编译流程中的关键步骤与注意事项。对于想要深入了解Linux内核工作原理及定制化需求的...

    Linux内核编译全过程详解(kernel2.6.7)[参考].pdf

    Linux 内核编译全过程详解(kernel 2.6.7) Linux 内核编译是一个复杂的过程,它需要仔细的规划和执行。在这个过程中,需要了解内核编译的各个阶段,包括编译前准备、编译配置、编译过程和运行内核的常见问题。下面...

    嵌入式linux内核的编译与移植

    嵌入式 Linux 内核的编译与移植 嵌入式 Linux 内核的编译与移植是嵌入式系统开发的关键步骤。以下是关于嵌入式 Linux 内核编译与移植的过程和注意事项。 一、 获得 Linux 内核源码 首先,我们需要获得 Linux 内核...

Global site tag (gtag.js) - Google Analytics