亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 10136 | 回復(fù): 13
打印 上一主題 下一主題

[文件系統(tǒng)] 關(guān)于unpack_to_rootfs()的疑問 [復(fù)制鏈接]

論壇徽章:
4
酉雞
日期:2014-03-21 23:19:50獅子座
日期:2014-08-01 22:11:40酉雞
日期:2015-01-10 21:31:442015年辭舊歲徽章
日期:2015-03-03 16:54:15
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-01-24 19:06 |只看該作者 |倒序?yàn)g覽
20可用積分
本帖最后由 chishanmingshen 于 2013-01-25 09:30 編輯

from 3.6.10
populate_rootfs()->unpack_to_rootfs() 做新的initramfs或者舊的initrd的文件拷貝操作。
1. 可是我不明白的是拷貝到哪里去?不用指定文件名字么?比如initrd方式(非cpio)時(shí),內(nèi)核會(huì)建好文件/initrd.image,然后寫入。
2. 此時(shí)是實(shí)際根文件系統(tǒng)是哪里加載的?因?yàn)楹罄m(xù)才會(huì)加載實(shí)際根文件系統(tǒng).
3. header_buf symlink_buf name_buf : 這幾個(gè)全局變量的作用是?
4. 請(qǐng)指點(diǎn)這個(gè)函數(shù)的具體機(jī)制.
謝謝!

  1. static char * __init unpack_to_rootfs(char *buf, unsigned len)
  2. {
  3.         int written, res;
  4.         decompress_fn decompress;
  5.         const char *compress_name;
  6.         static __initdata char msg_buf[64];

  7.         header_buf = kmalloc(110, GFP_KERNEL);
  8.         symlink_buf = kmalloc(PATH_MAX + N_ALIGN(PATH_MAX) + 1, GFP_KERNEL);
  9.         name_buf = kmalloc(N_ALIGN(PATH_MAX), GFP_KERNEL);

  10.         if (!header_buf || !symlink_buf || !name_buf)
  11.                 panic("can't allocate buffers");

  12.         state = Start;
  13.         this_header = 0;
  14.         message = NULL;
  15.         while (!message && len) {
  16.                 loff_t saved_offset = this_header;
  17.                 if (*buf == '0' && !(this_header & 3)) {
  18.                         state = Start;
  19.                         written = write_buffer(buf, len);<---(*actions[])將數(shù)據(jù)寫到哪里去了?求詳解。。
  20.                         buf += written;
  21.                         len -= written;
  22.                         continue;
  23.                 }
  24.                 if (!*buf) {
  25.                         buf++;
  26.                         len--;
  27.                         this_header++;
  28.                         continue;
  29.                 }
  30.                 this_header = 0;
  31.                 decompress = decompress_method(buf, len, &compress_name);
  32.                 if (decompress) {
  33.                         res = decompress(buf, len, NULL, flush_buffer, NULL,
  34.                                    &my_inptr, error);
  35.                         if (res)
  36.                                 error("decompressor failed");
  37.                 } else if (compress_name) {
  38.                         if (!message) {
  39.                                 snprintf(msg_buf, sizeof msg_buf,
  40.                                          "compression method %s not configured",
  41.                                          compress_name);
  42.                                 message = msg_buf;
  43.                         }
  44.                 } else
  45.                         error("junk in compressed archive");
  46.                 if (state != Reset)
  47.                         error("junk in compressed archive");
  48.                 this_header = saved_offset + my_inptr;
  49.                 buf += my_inptr;
  50.                 len -= my_inptr;
  51.         }
  52.         dir_utime();
  53.         kfree(name_buf);
  54.         kfree(symlink_buf);
  55.         kfree(header_buf);
  56.         return message;
  57. }
復(fù)制代碼

最佳答案

查看完整內(nèi)容

回復(fù) 3# chishanmingshen 就是這個(gè)"unpack_to_rootfs就是將initramfs或者initrd的內(nèi)容釋放到"/"那里", 我搞不明白其中的奧秘...任何文件系統(tǒng)的訪問都要以來于建立在RAM中的文件系統(tǒng)相關(guān)的數(shù)據(jù)結(jié)構(gòu),這些最基本的數(shù)據(jù)結(jié)構(gòu)就是位于RAM中的"/",當(dāng)需要訪問外部的存儲(chǔ)器而不是在RAM中的該如何辦呢?在RAM中的“/”留一個(gè)掛在點(diǎn)去mount,來搭建一條訪問的路徑。unpack_to_rootfs做的就是在RAM的“/”建立ramdisk中事先建立好的一些 ...

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2013-01-24 19:06 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2013-01-25 10:11 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽

論壇徽章:
4
酉雞
日期:2014-03-21 23:19:50獅子座
日期:2014-08-01 22:11:40酉雞
日期:2015-01-10 21:31:442015年辭舊歲徽章
日期:2015-03-03 16:54:15
4 [報(bào)告]
發(fā)表于 2013-01-25 10:26 |只看該作者
感謝回復(fù)!
就是這個(gè)"unpack_to_rootfs就是將initramfs或者initrd的內(nèi)容釋放到"/"那里", 我搞不明白其中的奧秘...
是說釋放之后, "/"就是實(shí)際根文件系統(tǒng)了, 是吧? 只是這個(gè)系統(tǒng)是特殊的, 是在ram中的?

回復(fù) 2# stephen_du


   

論壇徽章:
4
酉雞
日期:2014-03-21 23:19:50獅子座
日期:2014-08-01 22:11:40酉雞
日期:2015-01-10 21:31:442015年辭舊歲徽章
日期:2015-03-03 16:54:15
5 [報(bào)告]
發(fā)表于 2013-01-25 13:03 |只看該作者
哦...有點(diǎn)明白了.我的理解, 按順序的3個(gè)階段:
1. 首先建立虛擬根文件系統(tǒng), 就是"/"
2. initrd/initramfs釋放得到rootfs, 就是"/root"
3. mount真正的根文件系統(tǒng), 自然也會(huì)有新的"/root"

如有不正, 請(qǐng)指點(diǎn), 謝謝!

回復(fù) 4# stephen_du


   

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2013-01-25 13:08 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽

論壇徽章:
4
酉雞
日期:2014-03-21 23:19:50獅子座
日期:2014-08-01 22:11:40酉雞
日期:2015-01-10 21:31:442015年辭舊歲徽章
日期:2015-03-03 16:54:15
7 [報(bào)告]
發(fā)表于 2013-01-25 15:08 |只看該作者
最后一點(diǎn):
header_buf symlink_buf name_buf : 這幾個(gè)全局變量的作用是?

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2014-05-22 14:29 |只看該作者
要知道 header_buf symlink_buf name_buf,這三個(gè)buf的作用需要對(duì)cpio的格式有所了解.
CPIO 的結(jié)構(gòu)是這樣的:
                   110字節(jié)的Head(6 + 8*13)
                   不定長的文件名(文件名的長度是olen)
                   結(jié)束字符 \0
                   文件的內(nèi)容
                   .... //重復(fù)上面4個(gè)
                   最后的文件名是一個(gè) TRAILER!!!
了解了cpio的格式之后就很容易知道:  
1. header_buf就是一個(gè)文件在cpio中的head,共110個(gè)字節(jié)
      header_buf = kmalloc(110, GFP_KERNEL);
2.  symlink_buf就是符號(hào)鏈接所指的路徑
     假設(shè)有這樣的符號(hào)連接:  ln -s /home/cong/Desktop/record.txt link
     symlink_buf="/home/cong/Desktop/record.txt"
3. name_buf 就是文件名(除符號(hào)鏈接之外的文件名),
    可以是普通文件名,目錄名,FIFO名等反正就是存名字

這些都很容易理解, 就是有一點(diǎn)需要注意: 什么時(shí)候會(huì)用到這些buffer?
以header_buf為例說明一下:
    內(nèi)核兩次調(diào)用了unpack_to_rootfs,
    第一次解壓usr/initramfs_data.cpio,這時(shí)候head_buff壓根就沒有用到.

    第二次是解壓initramfs,這個(gè)rootfs是gzip壓縮的,內(nèi)核會(huì)一邊解壓縮initramfs一邊把解壓出來的文件填充到文件系統(tǒng)中.
    解壓后并不是每一次都把110個(gè)字節(jié)拷貝到header_buf中,這樣沒有必要
    而是在gunzip中每次解壓出的32K的buffer, 只有當(dāng)這32k剩下的數(shù)據(jù)是cpio的頭且不足110個(gè)字節(jié)時(shí),才會(huì)用到header_buf.
    先將不足的字節(jié)臨時(shí)放在header_buf中,然后再調(diào)用gunzip,從解出32K的buffer中拿走剩下的字節(jié)填充到header_buf中湊満110個(gè)字節(jié).
symlink_buf, name_buf同樣也是這種情況下才使用.

論壇徽章:
4
酉雞
日期:2014-03-21 23:19:50獅子座
日期:2014-08-01 22:11:40酉雞
日期:2015-01-10 21:31:442015年辭舊歲徽章
日期:2015-03-03 16:54:15
9 [報(bào)告]
發(fā)表于 2014-05-24 13:15 |只看該作者
本帖最后由 chishanmingshen 于 2014-05-24 13:42 編輯

回復(fù) 8# wangcong02345

thanks!

>第一次解壓usr/initramfs_data.cpio,這時(shí)候head_buff壓根就沒有用到.

  第一次為啥沒用到?  請(qǐng)指教,謝謝!  

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2014-05-26 11:33 |只看該作者
head_buff什么時(shí)候才會(huì)用到呢? 只有在解壓過程中才有可能用到.
像initramfs或者舊的initrd文件的生成過程都經(jīng)過了gzip壓縮,所以內(nèi)核在用這些文件時(shí)需要先解壓縮,gunzip每次會(huì)解壓出32Kbuffer, 只有當(dāng)這32k剩下的數(shù)據(jù)是cpio的頭且不足110個(gè)字節(jié)時(shí),才會(huì)用到header_buf.
而第一次解壓的/usr/initramfs_dat.cpio,這是個(gè)cpio文件沒有經(jīng)過壓縮,也就沒有解壓的過程,所以不會(huì)用到header_buf.
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP