當前位置:首頁 » 文件傳輸 » uboot是訪問物理地址嗎
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

uboot是訪問物理地址嗎

發布時間: 2022-02-16 11:36:10

Ⅰ uboot 放在哪裡

uboot是放在nand中的第一個分區。
選擇nand啟動後,首先進入uboot。
nor裡面很多廠商已經固化引導程序在裡面,並且已經防寫,不能更改,可以通過nor啟動來燒寫uboot到nand中,然後選擇nand啟動。

nand啟動後,進入uboot,setenv設置環境變數後,要執行saveenv,保存環境變數,然後通過printenv查看當前環境變數。

另外,nor裡面的bootloader不一定就是uboot,比如說友善2440的就是supervivi。

Ⅱ uboot移植過程中的運行地址和裝載地址的區別

哈哈 ,你是只要簡單的使用uboot還是真正要去修改源碼移植?不管怎樣,我建議你先搞懂uboot的工作流程,就是它的啟動流程,如果引導內核的。。。如果只是簡單的使用uboot,可以去網上移植好的uboot,然後用jflash arm 燒到你的nandflash或者norflash。如果要移植,建議去買本書或者看看,看的話韋東山的嵌入式,他對整個uboot的工作流程分析得還是比較不錯的,當然那隻是幫助你理解uboot而已,真正想搞懂還是得靠你去看它的代碼,我個人是覺得不會太難吧。。。。加油!

Ⅲ 如何從uboot讀取mac,然戶傳遞到內核中

U-boot會給Linux Kernel傳遞很多參數,如:串口,RAM,videofb等。而Linux kernel也會讀取和處理這些參數。兩者之間通過struct tag來傳遞參數。U-boot把要傳遞給kernel的東西保存在struct tag數據結構中,啟動kernel時,把這個結構體的物理地址傳給kernel;Linux kernel通過這個地址,用parse_tags分析出傳遞過來的參數。
本文主要以U-boot傳遞RAM和Linux kernel讀取RAM參數為例進行說明。
1、u-boot給kernel傳RAM參數
./common/cmd_bootm.c文件中(指Uboot的根目錄),bootm命令對應的do_bootm函數,當分析uImage中信息發現OS是Linux時,調用。/lib_arm/bootm.c文件中的do_bootm_linux函數來啟動Linux kernel。
在do_bootm_linux函數中:
void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],\
ulong addr, ulong *len_ptr, int verify)
{
……
#if defined (CONFIG_SETUP_MEMORY_TAGS) || \
defined (CONFIG_CMDLINE_TAG) || \
defined (CONFIG_INITRD_TAG) || \
defined (CONFIG_SERIAL_TAG) || \
defined (CONFIG_REVISION_TAG) || \
defined (CONFIG_LCD) || \
defined (CONFIG_VFD)
setup_start_tag (bd); //初始化tag結構體開始
#ifdef CONFIG_SERIAL_TAG
setup_serial_tag (?ms);
#endif
#ifdef CONFIG_REVISION_TAG
setup_revision_tag (?ms);
#endif
#ifdef CONFIG_SETUP_MEMORY_TAGS
setup_memory_tags (bd); //設置RAM參數
#endif
#ifdef CONFIG_CMDLINE_TAG
setup_commandline_tag (bd, commandline);
#endif
#ifdef CONFIG_INITRD_TAG
if (initrd_start && initrd_end)
setup_initrd_tag (bd, initrd_start, initrd_end);
#endif
#if defined (CONFIG_VFD) || defined (CONFIG_LCD)
setup_videolfb_tag ((gd_t *) gd);
#endif
setup_end_tag (bd); //初始化tag結構體結束
#endif
……
……
theKernel (0, machid, bd->bi_boot_params);
//傳給Kernel的參數= (struct tag *)型的bd->bi_boot_params
//bd->bi_boot_params在board_init 函數中初始化,如對於at91rm9200,初始化在at91rm9200dk.c的board_init中進 行:bd->bi_boot_params=PHYS_SDRAM + 0x100;
//這個地址也是所有taglist的首地址,見下面的setup_start_tag函數
}
對於setup_start_tag和setup_memory_tags函數說明如下。
函數setup_start_tag也在此文件中定義,如下:
static void setup_start_tag (bd_t *bd)
{
params = (struct tag *) bd->bi_boot_params;
//初始化(struct tag *)型的全局變數params為bd->bi_boot_params的地址,之後的setup tags相關函數如下面的setup_memory_tags就把其它tag的數據放在此地址的偏移地址上。
params->hdr.tag = ATAG_CORE;
params->hdr.size = tag_size (tag_core);
params->u.core.flags = 0;
params->u.core.pagesize = 0;
params->u.core.rootdev = 0;
params = tag_next (params);
}
RAM相關參數在bootm.c中的函數setup_memory_tags中初始化:
static void setup_memory_tags (bd_t *bd)
{
int i;
for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
params->hdr.tag = ATAG_MEM;
params->hdr.size = tag_size (tag_mem32);
params->u.mem.start = bd->bi_dram[i].start;
params->u.mem.size = bd->bi_dram[i].size;
params = tag_next (params);
} //初始化內存相關tag
}
2、Kernel讀取U-boot傳遞的相關參數
對於Linux Kernel,ARM平台啟動時,先執行arch/arm/kernel/head.S,此文件會調用arch/arm/kernel/head- common.S和arch/arm/mm/proc-arm920.S中的函數,並最後調用start_kernel:
……
b start_kernel
……
init/main.c中的start_kernel函數中會調用setup_arch函數來處理各種平台相關的動作,包括了u-boot傳遞過來參數的分析和保存:
start_kernel()
{
……
setup_arch(&command_line);
……
}
其中,setup_arch函數在arch/arm/kernel/setup.c文件中實現,如下:
void __init setup_arch(char **cmdline_p)
{
struct tag *tags = (struct tag *)&init_tags;
struct machine_desc *mdesc;
char *from = default_command_line;
setup_processor();
mdesc = setup_machine(machine_arch_type);
machine_name = mdesc->name;
if (mdesc->soft_reboot)
reboot_setup("s");
if (__atags_pointer)
//指向各種tag起始位置的指針,定義如下:
//unsigned int __atags_pointer __initdata;
//此指針指向__initdata段,各種tag的信息保存在這個段中。
tags = phys_to_virt(__atags_pointer);
else if (mdesc->boot_params)
tags = phys_to_virt(mdesc->boot_params);
if (tags->hdr.tag != ATAG_CORE)
convert_to_tag_list(tags);
if (tags->hdr.tag != ATAG_CORE)
tags = (struct tag *)&init_tags;
if (mdesc->fixup)
mdesc->fixup(mdesc, tags, &from, &meminfo);
if (tags->hdr.tag == ATAG_CORE) {
if (meminfo.nr_banks != 0)
squash_mem_tags(tags);
save_atags(tags);
parse_tags(tags);
//處理各種tags,其中包括了RAM參數的處理。
//這個函數處理如下tags:
__tagtable(ATAG_MEM, parse_tag_mem32);
__tagtable(ATAG_VIDEOTEXT, parse_tag_videotext);
__tagtable(ATAG_RAMDISK, parse_tag_ramdisk);
__tagtable(ATAG_SERIAL, parse_tag_serialnr);
__tagtable(ATAG_REVISION, parse_tag_revision);
__tagtable(ATAG_CMDLINE, parse_tag_cmdline);
}
init_mm.start_code = (unsigned long) &_text;
init_mm.end_code = (unsigned long) &_etext;
init_mm.end_data = (unsigned long) &_edata;
init_mm.brk = (unsigned long) &_end;
memcpy(boot_command_line, from, COMMAND_LINE_SIZE);
boot_command_line[COMMAND_LINE_SIZE-1] = '\0';
parse_cmdline(cmdline_p, from); //處理編譯內核時指定的cmdline或u-boot傳遞的cmdline
paging_init(&meminfo, mdesc);
request_standard_resources(&meminfo, mdesc);
#ifdef CONFIG_SMP
smp_init_cpus();
#endif
cpu_init();
init_arch_irq = mdesc->init_irq;
system_timer = mdesc->timer;
init_machine = mdesc->init_machine;
#ifdef CONFIG_VT
#if defined(CONFIG_VGA_CONSOLE)
conswitchp = &vga_con;
#elif defined(CONFIG_DUMMY_CONSOLE)
conswitchp = &mmy_con;
#endif
#endif
early_trap_init();
}
對於處理RAM的tag,調用了parse_tag_mem32函數:
static int __init parse_tag_mem32(const struct tag *tag)
{
……
arm_add_memory(tag->u.mem.start, tag->u.mem.size);
……
}
__tagtable(ATAG_MEM, parse_tag_mem32);
上述的arm_add_memory函數定義如下:
static void __init arm_add_memory(unsigned long start, unsigned long size)
{
struct membank *bank;
size -= start & ~PAGE_MASK;
bank = &meminfo.bank[meminfo.nr_banks++];
bank->start = PAGE_ALIGN(start);
bank->size = size & PAGE_MASK;
bank->node = PHYS_TO_NID(start);
}
如上可見,parse_tag_mem32函數調用arm_add_memory函數把RAM的start和size等參數保存到了meminfo結構的meminfo結構體中。最後,在setup_arch中執行下面語句:
paging_init(&meminfo, mdesc);
對沒有MMU的平台上調用arch/arm/mm/nommu.c中的paging_init,否則調用arch/arm/mm/mmu.c中的paging_init函數。這里暫不分析mmu.c中的paging_init函數。

Ⅳ uboot是什麼,在linux中幹嘛用的

u-boot是一種普遍用於嵌入式系統中的Bootloader,Bootloader是在操作系統運行之前執行的一小段程序,通過它,我們可以初始化硬體設備、建立內存空間的映射表,從而建立適當的軟硬體環境,為最終調用操作系統內核做好准備。Boot Loader的主要運行任務就是將內核映象從硬碟上讀到RAM中,然後跳轉到內核的入口點去運行,即開始啟動操作系統。系統在上電或復位時通常都從地址0x00000000處開始執行,而在這個地址處安排的通常就是系統的Boot Loader程序。

Ⅳ 如何設置u-boot變數ip地址

setenv ipaddr 192.168.1.111
這樣就可以了。然後在使用網路相關的時候,會自動獲取這個ip並使用的。
如果用tftp 還需設置
setenv serverip 192.168.1.123
需要重啟還有效,則
saveenv

Ⅵ uboot運行的時候操作的是虛擬地址還是物理地址

uboot運行的時候操作的是虛擬地址還是物理地址
C源程序的結構特點
1.一個C語言源程序可以由一個或多個源文件組成。
2.每個源文件可由一個或多個函數組成。
3.一個源程序不論由多少個文件組成,都有一個且只能有一個main函數,即主函數。
4.源程序中可以有預處理命令(include 命令僅為其中的一種),預處理命令通常應放在源文件或源程序的最前面。
5.每一個說明,每一個語句都必須以分號結尾。但預處理命令,函數頭和花括弧「}」之後不能加分號。
6.標識符,關鍵字之間必須至少加一個空格以示間隔。若已有明顯的間隔符,也可不再加空格來間隔。

Ⅶ linux uboot 怎樣讀gpio

在u-boot中操作某個寄存器:

[cpp] view plain

print?
reg = readl(IOMUXC_BASE_ADDR + IOMUXC_REG_GPR1);
reg &= ~IOMUXC_REG_GPR1_ACTCS0_MASK;
writel(reg, IOMUXC_BASE_ADDR + IOMUXC_REG_GPR1);
其中IOMUXC_BASE_ADDR是物理地址,跟蹤代碼發現writel操作如下:

#define writel(v,a) __arch_putl(v,a)
#define __arch_putl(v,a) (*(volatile unsigned int *)(a) = (v))
所以在uboot裡面配置寄存相當於是給物理地址直接賦值,volatile的意思是提醒編譯器需要存儲或讀取這個變數的時候,都會直接從變數地址中讀取數據

而在內核中,上面的寫法是無法運行的,會提示虛擬地址錯誤。在內核中通常是通過虛擬地址來給物理地址賦值,所以需要將物理地址轉換成虛擬地址

[cpp] view plain

print?
reg = __raw_readl(ioremap(IOMUXC_BASE_ADDR + IOMUXC_REG_GPR1,4));
reg &= ~IOMUXC_REG_GPR1_ACTCS0_MASK;
reg &= ~IOMUXC_REG_GPR1_ADDRS0_MASK;
reg |= ((CS0_NORFLASH_SIZE | IOMUXC_REG_GPR1_ACTCS0));
__raw_writel(reg, ioremap(IOMUXC_BASE_ADDR + IOMUXC_REG_GPR1,4));
這里的ioremap是將物理地址IOMUXC_BASE_ADDR轉換得到對應的虛擬地址,4表示4個位元組,即32位的地址。

u-boot下讀寫gpio:
與讀寫寄存器類似,u-boot下讀寫GPIO口是直接給GPIO賦值:

Ⅷ uboot是什麼

U-Boot,全稱 Universal Boot Loader,是遵循GPL條款的開放源碼項目。U-Boot的作用是系統引導。U-Boot從FADSROM、8xxROM、PPCBOOT逐步發展演化而來。其源碼目錄、編譯形式與Linux內核很相似,事實上,不少U-Boot源碼就是根據相應的Linux內核源程序進行簡化而形成的,尤其是一些設備的驅動程序,這從U-Boot源碼的注釋中能體現這一點。

拓展資料:

選擇U-Boot的理由:

① 開放源碼;

② 支持多種嵌入式操作系統內核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android;

③ 支持多個處理器系列,如PowerPC、ARM、x86、MIPS;

④ 較高的可靠性和穩定性;

⑤ 高度靈活的功能設置,適合U-Boot調試、操作系統不同引導要求、產品發布等;

⑥ 豐富的設備驅動源碼,如串口、乙太網、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;

⑦ 較為豐富的開發調試文檔與強大的網路技術支持。

Ⅸ uboot下mac地址怎麼修改

3.jpg 編程器備份原始固件,刷小米mini的不死breed,然後進入breed刷回原廠編程器固件,最後進入breed改mac

Ⅹ 如何在uboot中添加ping命令

首先icmp和arp是沒有關系的!icmp承載於網路層他的協議號好像是1,其中有8種類型比如host不可達、超時等這是用來測試網路連通性的一種控制信息協議。ARP是乙太網技術中最重要的一種協議地址解析協議,它承載於osi第二層類型號好像是806,因為乙太網是多路訪問的一種,所以為了解析其乙太網物理MAC地址必須要用ARP協議,這種協議發送的request包中目標MAC地址為全1廣播地址,reply包以自己的mac和IP地址為源,目標地址以目標主機MAC和IP地址為目標封裝成幀後發送出去!雖然說它是鏈路層協議,但是他有網路層的概念IP地址,我抓包看到過ARP協議中有協議類型800這是IP協議的類型,因為他要用IP地址來解析MAC地址,所以每個網路層以上的設備都會有基於ARP的緩存,路由交換設備中的命令是showarp!windows中的命令是arp-a,有了這種緩存大大提高了互聯網訪問速度!好了說了這么多可能樓主認為我說的是廢話!那麼我就開始所問所答了!第一,ping命令是ICMP的一種形式,它屬於ICMP,當然tracert也屬於ICMP!ICMP與ARP沒有任何關系,一個是網路層協議,一個是數據鏈路層協議!在功能方面上也沒有什麼交集的地方,唯一共同點就是都涉及IP地址。第二,我不會寫什麼UBOOT代碼,但是既然承載在internet上那麼他就應該遵循網路體系結構為了讓網路統一化,IEEE和國際標准化組織iso統一定義了接入層及上層協議標准!當你ping時會發送ARP幀是因為你在乙太網的環境中,為什麼會發送ARP是因為在計算機剛剛啟動的時候是沒有對方主機的通信地址的!ping是為了測試與對方主機的連通性,所以需要知道對方主機的地址雖然你知道了目的的IP地址,但還需要其MAC地址,所以在ping之前就會發送ARP幀,主機中ARP默認緩存老化時間應該是10分鍾。也就是說,自ARP解析10分鍾後ARP緩存條目會自動清除。第三,arp幀發送和恢復確實不一樣!一個用廣播一個是單播好了!不管我寫的是不是廢話!辛辛苦苦寫了這些不容易啊!接下來就看LZ你的了!^_^!