博文

目前显示的是 八月, 2017的博文

UML(User-Mode-Linux)入门

由标题我们已经知道这里要说的UML不是“统一建模语言”,而是“用户模式的Linux”,使用它有什么好处呢?让我们先保留点神秘感,一步一步学习,通过实践来感悟它的魅力。 实验环境:电脑一台(装有Ubuntu13.10系统,Kernel版本为3.11.0-12-generic,64位) 下面将通过UML环境的搭建、GDB调试、网络测试这3个方面来了解下UML: 一.搭建UML实验环境 1.下载Linux Kernel源码 访问https://www.kernel.org/网站,看到现在(2014-3-10)最新的版本为3.13.6,那么就下载它了: cd ~/uml/ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.13.6.tar.xz 2.编译UM配置的Kernel 解压下载的内核源码:tar xvf linux-3.13.6.tar.xz 配置及编译内核源码: cd linux-3.13.6 make ARCH=um defconfig 生成UM默认的配置文件,运行后有如下信息: xinu@slam:~/uml/linux-3.13.6$ make ARCH=um defconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/kconfig/conf.o SHIPPED scripts/kconfig/zconf.tab.c SHIPPED scripts/kconfig/zconf.lex.c SHIPPED scripts/kconfig/zconf.hash.c HOSTCC scripts/kconfig/zconf.tab.o HOSTLD scripts/kconfig/conf *** Default configuration is based on 'x86_64_defconfig' # # configuration written to .config # 配置文件生成后,就是编译了,执行如下命令: make ARCH=um 编译完成后会在当前目录下生成linux可执行文件。 3.准备根文件系统 编译完成后,需要一个根文件系统,此时可以从http://fs.devloop.org.uk/下载一个现成的资源,由于

搭建基于Gitosis权限管理的GIT服务器

现在越来越多的开源项目使用git来进行管理,而git是分布式的,没有严格的界限来区分客户端和服务器,而我们习惯上都需要有一台服务器来控制的,故而接下来的实验中会使用一台机器来作为服务器角色并在上面安装上Gitosis的权限管理系统(当然也可以使用Gitolite),此次我们的实验环境是VMware上面安装了Ubuntu的虚拟机1台(同时充当服务器和客户端),下面是整个实验过程的记录: 1.安装上git工具(服务器和客户端都须安装):     sudo apt-get install git-core 2.安装Gitosis(仅服务器上需要安装):     sudo apt-get install python-setuptools     mkdir ~/src     cd ~/src     git clone  https://github.com/res0nat0r/gitosis.git     cd gitosis/     sudo python setup.py install 3.创建一个git帐号(仅服务器上):     sudo adduser --system --shell /bin/sh --gecos 'git version control' --group --disabled-password --home /home/git git 4.生成SSH密钥对(仅客户端上):     ssh-keygen     命令执行过程中全部按“回车”键默认配置,最终会在~/.ssh目录下生成id_rsa和id_rsa.pub一对密钥。接下来将生成的id_rsa.pub公钥复制到服务器上(一般使用scp命令,由于我们在同一台机器,故该步省略) 5.将公钥导入初始化gitosis(在服务器上)     sudo -H -u git gitosis-init < ~/.ssh/id_rsa.pub     运行该命令后有如下提示(上述公钥对应的用户用于默认情况下的gitosis库管理员):     Initialized empty Git repository in /home/git/repositories/gitosis-admin.git/

Linux绑定硬件IRQ到指定CPU核

在现在的多核处理器里,Linux下默认是将硬件IRQ分配到所有的CPU核心上,会优先使用第0核(即CPU0),那么我们要如何手动指定到某个或某几个核心上呢?这涉及到SMP IRQ Affinity。首先,我们可以通过如下命令cat /proc/interrupts来获取当前IRQ对应CPU核心的情况,我的电脑有如下返回值:                  CPU0          CPU1          CPU2          CPU3          CPU4          CPU5          CPU6          CPU7              0:             17               0               0               0               0               0               0               0   IR-IO-APIC-edge         timer    1:               2               0               0               0               0               0               0               0   IR-IO-APIC-edge         i8042    7:               0               0               0               0               0               0               0               0   IR-IO-APIC-edge         parport0    8:               0               0               0               0               0               1               0               0   IR-IO-APIC-edge         rtc0    9:               0       

Linux编程获取指定网口IP地址

在Linux下,我们可以使用C语言编程获取指定网口的IP地址,下面是相应的源码(可将eth0改为相应的网络结点): #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <linux/if.h> #include <linux/if_ether.h> #include <sys/ioctl.h> #include <netinet/in.h> #include <arpa/inet.h> void main() {       struct ifreq ifr;       int sock;       struct sockaddr_in saddr;       strcpy(ifr.ifr_name, "eth0");       sock = socket(AF_INET, SOCK_STREAM, 0);       ioctl(sock, SIOCGIFADDR, &ifr);       memcpy(&saddr, &ifr.ifr_addr, sizeof(ifr.ifr_addr));       printf("%s\n", inet_ntoa(saddr.sin_addr)); }

Linux编程获取指定网口MAC地址

在Linux下,我们可以使用C语言编程获取指定网口的MAC地址,下面是相应的源码(可将eth0改为相应的网络结点): #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <linux/if.h> #include <linux/if_ether.h> #include <sys/ioctl.h> #include <netinet/in.h> #include <arpa/inet.h> void main() {       unsigned char *ptr;       struct ifreq ifr;       int sock;       strcpy(ifr.ifr_name, "eth0");       strcpy(ifr.ifr_hwaddr.sa_data, "");       sock = socket(AF_INET, SOCK_STREAM, 0);       ioctl(sock, SIOCGIFHWADDR, &ifr);       ptr = (unsigned char *) ifr.ifr_hwaddr.sa_data;       printf("x:x:x:x:x:x\n",                   (ptr[0] & 0377), (ptr[1] & 0377), (ptr[2] & 0377),                   (ptr[3] & 0377), (ptr[4] & 0377), (ptr[5] & 0377)); }

apt-get update失败处理

最近在Ubuntu上面执行sudo apt-get update时出现如下提示: *** Error in `appstreamcli': double free or corruption (fasttop): 0x0000000001549c80 *** ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7faf638d87e5] /lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7faf638e137a] /lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7faf638e553c] /usr/lib/x86_64-linux-gnu/libappstream.so.3(as_component_complete+0x439)[0x7faf63c5dd19] /usr/lib/x86_64-linux-gnu/libappstream.so.3(as_data_pool_update+0x44a)[0x7faf63c5ef0a] /usr/lib/x86_64-linux-gnu/libappstream.so.3(as_cache_builder_refresh+0x1c2)[0x7faf63c54272] appstreamcli(ascli_refresh_cache+0x12e)[0x4049de] appstreamcli(as_client_run+0x6fb)[0x403ceb] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7faf63881830] appstreamcli(_start+0x29)[0x403519] 该问题需要执行如下命令才能解决: sudo apt-get purge libappstream3 执行完后再次执行sudo apt-get update命令就正常了。

Android各代码层获取系统时间的方法

在Android系统里,各代码层如何去获取系统时间呢?可分别调用如下函数来获取: 在java层,可以使用方法:long now = SystemClock.uptimeMillis();  在native层,可以使用方法:nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);  在驱动层,可以使用方法:s64 time = ktime_to_us(ktime_get());