<前言>

其實這個問題困擾我很久 在 grub 裡會我們會填一個 initrd 的東西, 這個東西就是在 /boot 下面的 initrd.img* 這個檔案 是 ramdisk 但是問題來了 grub 到底是如何跟 kernel 互動的呢?
kernel 怎麼去知道這個 initrd 在什麼地方呢?
所以稍微追了一下 所以在此紀錄一下

sakbk 發表在 痞客邦 留言(4) 人氣()

busybox-shell.jpeg
<前言>
有時呢 系統掛了 要使用 live-cd 又會覺的要開很久 可是有時僅僅只是希望做一些簡單的事 這時我們就可以使用 busybox 來幫我們做一些簡單的事情.
以下所示範是在 ubuntu based 的 distribution.

sakbk 發表在 痞客邦 留言(2) 人氣()

用 dd 命令來分割一個 檔案然後再組回來 範例程式如下...
這個程式的使用方式就是  


sakbk 發表在 痞客邦 留言(1) 人氣()

vmware-1.jpeg

原本對這個東西只知道是一個虛擬機器 可以安裝很多個 OS 但沒有去想過 要怎麼做出這樣的檔案呢? 就因為這樣所以把自己所做的東西研究了一下 做一下紀錄.  ( 我是 based on EeePC 1.7 的 build 做測試的 ).

- PART 1 -

sakbk 發表在 痞客邦 留言(0) 人氣()

xeyes.jpeg
 
如果有時想要研究一下整個系統的 flow 是怎麼跑的...比如說在測試 kernel 的某個 system call 是怎麼跑的, 還是系統開機的整個 flow 或是 grub2 是怎麼運作的..這時如果是在自己的機器上測試 就要不斷的compiler,reboot, compiler,reboot 慘一點的還會掛掉 導致自己的系統當掉 可能不小心改錯了什麼東西之類的等等... 如果你有這樣的需求 我想本篇也是可以讓你參考的一個方法...
在 ubuntu 中有一個 debootstrap 的命令就是能提供我們在現行的機器上去 deploy 一個最陽春的 minimum system.這個系統是不含 X-window 的 base system. 當然如果想要跑 X 那當然就需要把相關的 library 裝進來即可.
現在我們就來裝一個有 lxde 桌面環境的 base system 吧!

sakbk 發表在 痞客邦 留言(1) 人氣()

snapshot-screen.jpg
 
前一篇的 Dual OS, 是利用  ntldr 去 load grldr
      C:\grldr="The Name You Want To See"
所以會造成我們只有醜醜的畫面(黑白). 因此就做了一個實驗 想不到竟然成功了...

sakbk 發表在 痞客邦 留言(1) 人氣()

 
在 Linux 有 dynamic library 這個東西,這個東西的好處就是可以把常用的功能獨立出來,可以減少 code size,那它究竟是怎麼做的呢?研究了一下 所以寫了一段 sample.
下面這一個是一個簡單的BMI (Body Mass index), 公式是體重除以身高(公尺)的平方.
// func.h

sakbk 發表在 痞客邦 留言(1) 人氣()

 
什麼是 ELF ( Executable and Linking ) Format 呢?jollen寫的相當清楚只是在看時發現他原本的 sample code 好像已經抓不下來了, 一方面也是自己很久沒有寫 code了, 所以照他的範例自己實作了一些東西,不過大體上是相同的.
/*
 * Copyright (C) 2009 http://sakbk.pixnet.net/blog
 *
 * ELF Sample code.
 *
 */
#include <stdio.h>
#include <unistd.h>
#include <elf.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <malloc.h>
void READ_SECTION(Elf32_Ehdr *pEhdr, int fd) {
    Elf32_Shdr header[pEhdr->e_shnum];
    unsigned char *p_Shdr;
    int i, stroff, idx;
    printf("<Section Header>\n");
    //move to section header entry point offset
    lseek(fd, pEhdr->e_shoff, SEEK_SET);
    for (i = 0; i < pEhdr->e_shnum; i++) {
         read(fd, &header[i], sizeof(Elf32_Shdr));
         if (i == pEhdr->e_shstrndx ) {
             stroff = header[i].sh_offset;
             idx = i;
         }
    } 
   
    lseek(fd, stroff, SEEK_SET);
    p_Shdr=(unsigned char *)malloc(header[idx].sh_size);
    read(fd, p_Shdr, header[idx].sh_size);
    for (i = 1; i < pEhdr->e_shnum; i++)
         printf("\t[%.2d] - %-15.30s \t%.8x\n", i, &p_Shdr[header[i].sh_name], header[i].sh_offset);
}
void ELF_ARCH(Elf64_Half machine) {
  switch (machine) {
     case EM_M32:
          printf("\tARCH:\tAT&T WE 32100\n");
          break;
     case EM_SPARC:
          printf("\tARCH:\tSUN SPARCn");
          break;
     case EM_386:
          printf("\tARCH:\tIntel 80386\n");
          break;
     case EM_68K:
          printf("\tARCH:\tMotorola m68k family\n");
          break;
     case EM_88K:
          printf("\tARCH:\tMotorola m88k family\n");
          break;
     case EM_860:
          printf("\tARCH:\tIntel 80860 \n");
          break;
     default:
          printf("\tARCH:\tUnkown\n");
  } 
}
void ELF_TYPE(Elf32_Half type) {
  switch (type) {
     case ET_NONE:
          printf("\tTYPE:\tET_NONE\n");
          break;
     case ET_REL:
          printf("\tTYPE:\tET_REL\n");
          break;
     case ET_EXEC:
          printf("\tTYPE:\tET_EXEC\n");
          break;
     case ET_DYN:
          printf("\tTYPE:\tET_DYN\n");
          break;
  }
}
int ELF_CLASS(unsigned char *idx) {
   switch ( *( idx + EI_CLASS ) ) {
      case ELFCLASSNONE:
           printf("\tCLASS:\tNONE\n");
           break;
      case ELFCLASS32:
           printf("\tCLASS:\tELF32\n");
           break;
      case ELFCLASS64:
           printf("\tCLASS:\tELF64\n");
           break;
   } 
}
int IS_ELF(unsigned char *idx) {
   if( *( idx + EI_MAG0 ) !=  ELFMAG0 || \
       *( idx + EI_MAG1 ) !=  ELFMAG1 || \
       *( idx + EI_MAG2 ) !=  ELFMAG2 || \
       *( idx + EI_MAG3 ) !=  ELFMAG3
     ) {
        return 0;
   }
        return 1;
}
int usage(char *argv) {
   printf("Usage: %s filename\n", argv);
}
int main(int argc, char *argv[]) {
   int fd;
   Elf32_Ehdr e_hdr;
   if(argc < 2) {
      usage(*argv);
      return -1;
   }
   fd = open(argv[1], S_IRUSR);
   if(fd < 0) {
      printf("file open error\n");
      return -1;
   }
   read(fd, &e_hdr, sizeof(Elf32_Ehdr));
 
   if(IS_ELF(e_hdr.e_ident)) {
     printf("<ELF headers>\n");
     ELF_CLASS(e_hdr.e_ident);
     ELF_TYPE(e_hdr.e_type);
     ELF_ARCH(e_hdr.e_machine);
     READ_SECTION(&e_hdr, fd);
   }
   else {
     printf("Invalid ELF file\n");
   }
}

sakbk 發表在 痞客邦 留言(0) 人氣()

vmlinux-img.png
 
一直以來都有一個困惑到底 bzImage 是由什麼東西所組成的呢? 稍微 trace 了一下 kernel, 雖然還是一大堆困惑 -_-
在 kernel source 的最上層 make V=1 &> make.proc, 可以看到整個 build 的詳細過程. 稍微整理了一下如下所示

sakbk 發表在 痞客邦 留言(2) 人氣()

sl400_mbr.png
 
小沈說希望可以在易PC上做Dual Boot, 於是就來研究一下如何將現有EeePC windows XP 的 build 先裝起來看一下是長什麼樣子.
在 XP 的 partition 當中有四個主分割區分別為 C:/ D:/ 一個PE:/, 和一個 ELF(Hidden partiton),且四個均為 Primary Partition. 所以基本上在這樣的條件下是跟本沒辦法裝現有 Xandros OS. 分割區已經被用完了.

sakbk 發表在 痞客邦 留言(1) 人氣()

« 1 2
Blog Stats
⚠️

成人內容提醒

本部落格內容僅限年滿十八歲者瀏覽。
若您未滿十八歲,請立即離開。

已滿十八歲者,亦請勿將內容提供給未成年人士。