- 浏览: 1478004 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (691)
- linux (207)
- shell (33)
- java (42)
- 其他 (22)
- javascript (33)
- cloud (16)
- python (33)
- c (48)
- sql (12)
- 工具 (6)
- 缓存 (16)
- ubuntu (7)
- perl (3)
- lua (2)
- 超级有用 (2)
- 服务器 (2)
- mac (22)
- nginx (34)
- php (2)
- 内核 (2)
- gdb (13)
- ICTCLAS (2)
- mac android (0)
- unix (1)
- android (1)
- vim (1)
- epoll (1)
- ios (21)
- mysql (3)
- systemtap (1)
- 算法 (2)
- 汇编 (2)
- arm (3)
- 我的数据结构 (8)
- websocket (12)
- hadoop (5)
- thrift (2)
- hbase (1)
- graphviz (1)
- redis (1)
- raspberry (2)
- qemu (31)
- opencv (4)
- socket (1)
- opengl (1)
- ibeacons (1)
- emacs (6)
- openstack (24)
- docker (1)
- webrtc (11)
- angularjs (2)
- neutron (23)
- jslinux (18)
- 网络 (13)
- tap (9)
- tensorflow (8)
- nlu (4)
- asm.js (5)
- sip (3)
- xl2tp (5)
- conda (1)
- emscripten (6)
- ffmpeg (10)
- srt (1)
- wasm (5)
- bert (3)
- kaldi (4)
- 知识图谱 (1)
最新评论
-
wahahachuang8:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
websocket的helloworld -
q114687576:
http://www.blue-zero.com/WebSoc ...
websocket的helloworld -
zhaoyanzimm:
感谢您的分享,给我提供了很大的帮助,在使用过程中发现了一个问题 ...
nginx的helloworld模块的helloworld -
haoningabc:
leebyte 写道太NB了,期待早日用上Killinux!么 ...
qemu+emacs+gdb调试内核 -
leebyte:
太NB了,期待早日用上Killinux!
qemu+emacs+gdb调试内核
一个日本的编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
如果是centos7的
gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9)
可能编译遇到问题
-------------------------centos7可能出现问题开始---------------------
Makefile:1439: *** mixed implicit and normal rules
参考
http://blog.csdn.net/simonjay2007/article/details/7796390
如果遇到问题
只改vim arch/i386/kernel/Makefile 中的 -m elf_i386 变-m32 注意只改gcc后面的,ld的不修改
如果出现错误
如果是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个文件
jsclipboard是剪切板交互的功能
8250是串口
ide-probe是加速的一行代码
这个补丁如果不打的话也是可以加载的只是不能用剪切板的交互
我们下载
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
加载重新生成的内核
以上直接编译的内核不带剪切板从linux到浏览器交互的功能
如果想交互
看patch文件
多一个
drivers/char/jsclipboard.c
由于内核的3.19的版本
注释掉一行
//#include <asm/system.h>
修改kconfig和Makefile文件
/drivers/char/Kconfig
在 files for controlling the behavior of this hardware
下面加
drivers/char/Makefile
再重新
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直接启动
使用
注意使用 -serial stdio
vnc连到这个vm后只显示
操作还在终端
参考
https://balau82.wordpress.com/2010/04/12/booting-linux-with-u-boot-on-qemu-arm/
如果使用官方的 linux-0.2.img
直接用
把linux-0.2.img mount到硬盘上可以看到boot里面已经有2.6.20的内核了。
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的内核了。
发表评论
-
xl2tp 备份
2019-09-24 16:25 6952019年9月24日更新: 注意,需要开启firewall ... -
sdl笔记
2019-01-31 17:19 733sdl教程教程 https://github.com/Twin ... -
tinyemu
2019-01-24 17:59 1433参考https://bellard.org/jslinux/t ... -
aws搭建xl2tp给iphone使用
2018-12-26 21:37 18922019年12月26日 可以参考原来的配置 https:// ... -
consul的基本使用
2017-06-27 11:13 1402### 安装 [centos7上consul的安装](ht ... -
lvs的helloworld
2017-06-13 20:36 597###################lvs######### ... -
系统调用的helloworld
2017-05-04 16:14 634《2.6内核标准教程》 p293 #include < ... -
bitcoin和cgminer的安装
2017-04-05 22:45 1959参考 http://blog.csdn.net/rion_ch ... -
ceph安装和常用命令
2017-03-21 21:55 954/etc/hosts ssh-keygen ssh-copy- ... -
mobile terminal 笔记
2016-12-02 15:35 627找出旧的iphone4 越狱之后可以变个小操作系统 mobi ... -
socket基础和select(python)
2016-06-14 17:21 1803上接 c语言的socket基础ht ... -
socket基础(c语言)
2016-06-14 16:45 995不使用select 普通的基础socket连接,对多个客户端的 ... -
ffmpeg+nginx 的直播(2,直播摄像头和麦克风)
2016-05-28 20:21 4362假设我的服务器是centos7 192.168.139.117 ... -
ffmpeg+nginx 的直播(1,直播播放的视频文件)
2016-05-26 17:11 659664位操作系统centos7 ############ 1.一 ... -
socat和netcat(nc)
2016-04-29 22:36 1746转 原文链接: http://www.wenquan.name ... -
neutron基础九(qemu nat网络)
2016-02-06 17:21 1622接上基础八,kvm透传nested忽略 1.在主机ce ... -
neutron基础八(qemu 桥接网络)
2016-02-06 13:13 1544qemu的桥接和nat的qemu启动命令是一样的,但是后续的脚 ... -
neutron基础七(qemu tap)
2016-02-02 17:02 1030使用qemu 建立个虚拟机 然后用tap设备, 根据基础六,t ... -
neutron基础六(bridge fdb)
2016-01-28 18:30 2266转发表 在三台机器上建立三个namespace 192.16 ... -
南北流量
2016-01-23 23:26 1829一、三层网络架构: 接入层:负责服务器的接入和隔离 汇聚层:汇 ...
相关推荐
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 系统。编译内核对于 Linux 新手来说可能有一些困难,但通过本文档的指导,读者可以轻松地完成内核...
### Linux内核编译与裁剪 #### 一、Linux版本特点 Linux内核版本的命名规则对于理解和追踪内核的发展至关重要。版本号通常由三部分组成:`VERSION.PATCHLEVEL.SUBLEVEL`,有时还会附加一个`EXTRAVERSION`。 - **...
编译Linux内核是Linux操作系统课程设计实验的一部分,目的是学习重新编译Linux内核,理解并掌握Linux内核和发行版本的区别。以下是编译Linux内核的详细知识点: 一、实验目的 * 了解Linux内核的编译和配置过程 * ...
"Linux内核与内核编译" Linux内核是操作系统的核心,负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。Linux内核源程序可以在/usr/src/linux下找到。Linux的新内核版本修订了旧...
Linux 内核编译选项是 Linux 内核编译过程中的一个重要步骤,它决定了 Linux 内核的功能和性能。本文将对 Linux 内核编译选项进行详细的解析,以帮助读者更好地理解 Linux 内核编译选项的含义和作用。 一、代码成熟...
### Linux内核编译实验知识点总结 #### 一、实验目的 - **了解Linux内核编译**: 学习如何从源代码构建Linux内核,理解内核编译的基本流程和关键技术点。 - **掌握内核配置**: 掌握如何通过`menuconfig`等工具配置...
linux内核编译工具Bochslinux内核编译工具Bochslinux内核编译工具Bochslinux内核编译工具Bochslinux内核编译工具Bochslinux内核编译工具Bochslinux内核编译工具Bochslinux内核编译工具Bochslinux内核编译工具...
linux内核编译.config文件,编译出的内核很小,用于内核调试,内核版本4.19.23
Linux 内核编译选项详解 Linux 内核编译选项是 Linux 内核编译过程中的一个重要步骤,其中包含了许多选项,用于控制内核的行为和功能。在本文中,我们将详细介绍 Linux 内核编译选项的含义和作用。 代码成熟度选项...
### Linux内核编译命令详解 #### 一、概述 Linux内核是开源操作系统的核心部分,负责管理和协调硬件资源以及为应用程序提供服务。对于开发者来说,掌握如何编译Linux内核至关重要,因为这能帮助他们根据特定需求...
总之,编译Linux内核文档是一项技术性强且细致的工作,需要理解各种配置选项的含义,同时确保系统具有编译和安装所需的所有依赖。通过这个过程,用户可以定制出最适合自身系统需求的内核,从而提高系统的性能和稳定...
为了使这些设备运行Linux操作系统,我们需要理解Linux内核编译过程以及bootloader的工作原理。本篇文章将深入探讨这两个关键知识点。 首先,让我们从Linux内核编译开始。Linux内核是操作系统的核心部分,它负责管理...
编译Linux内核是一项复杂但非常有价值的任务,它不仅可以帮助我们更好地理解操作系统的工作原理,还可以根据自己的需求定制系统行为,提高系统的性能和安全性。随着对Linux内核了解的深入,开发者们可以根据具体的...
适合arm-linux的内核编译, 包含u-boot,kernel,rootfs
### Linux内核编译全过程详解 #### 一、前言 在深入了解Linux内核编译的过程中,我们将聚焦于kernel 2.6.7版本,并详细阐述整个编译流程中的关键步骤与注意事项。对于想要深入了解Linux内核工作原理及定制化需求的...
Linux 内核编译全过程详解(kernel 2.6.7) Linux 内核编译是一个复杂的过程,它需要仔细的规划和执行。在这个过程中,需要了解内核编译的各个阶段,包括编译前准备、编译配置、编译过程和运行内核的常见问题。下面...
### Linux内核编译知识点详解 #### 一、编译内核的准备工作 在开始Linux内核编译之前,需要完成一系列准备工作以确保编译过程能够顺利进行。 **1. 获取Root权限** - 输入指令:`su root` - 再输入root账户密码...
Linux内核编译是Linux系统管理员和开发者进行系统定制、优化或修复内核问题的关键步骤。内核编译涉及理解内核源码结构、系统引导过程以及如何通过make工具构建内核。 首先,让我们深入了解Linux内核源码的结构: 1...